[108683] StructuredTextViewerConfiguration and editorConfiguration extension point API
diff --git a/bundles/org.eclipse.wst.css.ui/META-INF/MANIFEST.MF b/bundles/org.eclipse.wst.css.ui/META-INF/MANIFEST.MF
index d06e46d..930b83d 100644
--- a/bundles/org.eclipse.wst.css.ui/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.wst.css.ui/META-INF/MANIFEST.MF
@@ -23,7 +23,6 @@
  org.eclipse.wst.css.ui.internal.registry,
  org.eclipse.wst.css.ui.internal.selection,
  org.eclipse.wst.css.ui.internal.style,
- org.eclipse.wst.css.ui.internal.taginfo,
  org.eclipse.wst.css.ui.internal.templates,
  org.eclipse.wst.css.ui.internal.text,
  org.eclipse.wst.css.ui.internal.views.contentoutline,
diff --git a/bundles/org.eclipse.wst.css.ui/plugin.xml b/bundles/org.eclipse.wst.css.ui/plugin.xml
index 38ee4d6..14e52da 100644
--- a/bundles/org.eclipse.wst.css.ui/plugin.xml
+++ b/bundles/org.eclipse.wst.css.ui/plugin.xml
@@ -15,42 +15,27 @@
 		</editor>
 	</extension>
 
-	<extension point="org.eclipse.wst.sse.ui.extendedconfiguration">
-		<configuration
-			type="contentoutlineconfiguration"
+	<extension point="org.eclipse.wst.sse.ui.editorConfiguration">
+		<contentOutlineConfiguration
 			class="org.eclipse.wst.css.ui.internal.views.contentoutline.CSSContentOutlineConfiguration"
 			target="org.eclipse.wst.css.core.csssource" />
-		<configuration
-			type="textviewerconfiguration"
+		<sourceViewerConfiguration
 			class="org.eclipse.wst.css.ui.internal.provisional.StructuredTextViewerConfigurationCSS"
 			target="org.eclipse.wst.css.core.csssource" />
-		<configuration
-			type="propertysheetconfiguration"
+		<propertySheetConfiguration
 			class="org.eclipse.wst.css.ui.internal.views.properties.CSSPropertySheetConfiguration"
 			target="org.eclipse.wst.css.core.csssource" />
-		<configuration
+		<provisionalConfiguration
 			type="characterpairmatcher"
 			class="org.eclipse.wst.css.ui.internal.text.CSSDocumentRegionEdgeMatcher"
 			target="org.eclipse.wst.css.core.csssource" />
-		<configuration
+		<provisionalConfiguration
 			type="structuredtextfoldingprovider"
 			class="org.eclipse.wst.css.ui.internal.projection.StructuredTextFoldingProviderCSS"
 			target="org.eclipse.wst.css.core.csssource" />
-		<definition
+		<provisionalDefinition
 			type="preferencepages"
-			value="org.eclipse.wst.sse.ui.preferences.css"
-			target="org.eclipse.wst.css.core.csssource" />
-		<definition
-			type="preferencepages"
-			value="org.eclipse.wst.sse.ui.preferences.css.source"
-			target="org.eclipse.wst.css.core.csssource" />
-		<definition
-			type="preferencepages"
-			value="org.eclipse.wst.css.ui.preferences.templates"
-			target="org.eclipse.wst.css.core.csssource" />
-		<definition
-			type="preferencepages"
-			value="org.eclipse.wst.sse.ui.preferences.css.styles"
+			value="org.eclipse.wst.sse.ui.preferences.css, org.eclipse.wst.sse.ui.preferences.css.source, org.eclipse.wst.css.ui.preferences.templates, org.eclipse.wst.sse.ui.preferences.css.styles"
 			target="org.eclipse.wst.css.core.csssource" />
 	</extension>
 
diff --git a/bundles/org.eclipse.wst.css.ui/src/org/eclipse/wst/css/ui/internal/provisional/StructuredTextViewerConfigurationCSS.java b/bundles/org.eclipse.wst.css.ui/src/org/eclipse/wst/css/ui/internal/provisional/StructuredTextViewerConfigurationCSS.java
index 5958d82..4a087b8 100644
--- a/bundles/org.eclipse.wst.css.ui/src/org/eclipse/wst/css/ui/internal/provisional/StructuredTextViewerConfigurationCSS.java
+++ b/bundles/org.eclipse.wst.css.ui/src/org/eclipse/wst/css/ui/internal/provisional/StructuredTextViewerConfigurationCSS.java
@@ -14,7 +14,6 @@
 
 import org.eclipse.core.runtime.Preferences;
 import org.eclipse.jface.text.IAutoEditStrategy;
-import org.eclipse.jface.text.ITextHover;
 import org.eclipse.jface.text.contentassist.ContentAssistant;
 import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
 import org.eclipse.jface.text.contentassist.IContentAssistant;
@@ -28,29 +27,30 @@
 import org.eclipse.wst.css.ui.internal.autoedit.StructuredAutoEditStrategyCSS;
 import org.eclipse.wst.css.ui.internal.contentassist.CSSContentAssistProcessor;
 import org.eclipse.wst.css.ui.internal.style.LineStyleProviderForCSS;
-import org.eclipse.wst.css.ui.internal.taginfo.CSSBestMatchHoverProcessor;
 import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredPartitionTypes;
 import org.eclipse.wst.sse.ui.internal.format.StructuredFormattingStrategy;
 import org.eclipse.wst.sse.ui.internal.provisional.StructuredTextViewerConfiguration;
-import org.eclipse.wst.sse.ui.internal.provisional.style.IHighlighter;
-import org.eclipse.wst.sse.ui.internal.taginfo.AnnotationHoverProcessor;
-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;
+import org.eclipse.wst.sse.ui.internal.provisional.style.LineStyleProvider;
 
 public class StructuredTextViewerConfigurationCSS extends StructuredTextViewerConfiguration {
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.text.source.SourceViewerConfiguration#getAutoEditStrategies(org.eclipse.jface.text.source.ISourceViewer, java.lang.String)
+	/*
+	 * One instance per configuration because not sourceviewer-specific and
+	 * it's a String array
 	 */
+	private String[] fConfiguredContentTypes;
+	/*
+	 * One instance per configuration
+	 */
+	private LineStyleProvider fLineStyleProviderForCSS;
+
 	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]);
 		}
-		
+
 		if (contentType == ICSSPartitionTypes.STYLE) {
 			allStrategies.add(new StructuredAutoEditStrategyCSS());
 		}
@@ -59,28 +59,34 @@
 	}
 
 	public String[] getConfiguredContentTypes(ISourceViewer sourceViewer) {
-		if (configuredContentTypes == null) {
-			configuredContentTypes = new String[]{ICSSPartitionTypes.STYLE, IStructuredPartitionTypes.DEFAULT_PARTITION, IStructuredPartitionTypes.UNKNOWN_PARTITION};
+		if (fConfiguredContentTypes == null) {
+			fConfiguredContentTypes = new String[]{ICSSPartitionTypes.STYLE, IStructuredPartitionTypes.DEFAULT_PARTITION, IStructuredPartitionTypes.UNKNOWN_PARTITION};
 		}
-		return configuredContentTypes;
+		return fConfiguredContentTypes;
 	}
 
 	public IContentAssistant getContentAssistant(ISourceViewer sourceViewer) {
-		IContentAssistant contentAssistant = super.getContentAssistant(sourceViewer);
+		ContentAssistant assistant = (ContentAssistant)super.getContentAssistant(sourceViewer);
+		
+		// create content assist processors to be used
+		IContentAssistProcessor cssProcessor = new CSSContentAssistProcessor();
 
-		if (contentAssistant != null && contentAssistant instanceof ContentAssistant) {
-			//((ContentAssistant)
-			// contentAssistant).setContentAssistProcessor(new
-			// CSSContentAssistProcessor(),
-			// ICSSPartitions.STYLE);
-			IContentAssistProcessor cssProcessor = new CSSContentAssistProcessor();
-			setContentAssistProcessor((ContentAssistant) contentAssistant, cssProcessor, ICSSPartitionTypes.STYLE);
-			setContentAssistProcessor((ContentAssistant) contentAssistant, cssProcessor, IStructuredPartitionTypes.UNKNOWN_PARTITION);
-		}
+		// add processors to content assistant
+		assistant.setContentAssistProcessor(cssProcessor, ICSSPartitionTypes.STYLE);
+		assistant.setContentAssistProcessor(cssProcessor, IStructuredPartitionTypes.UNKNOWN_PARTITION);
 
-		return contentAssistant;
+		return assistant;
 	}
 
+	/**
+	 * Returns the content formatter ready to be used with the given source
+	 * viewer.
+	 * 
+	 * @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) {
 		final MultiPassContentFormatter formatter = new MultiPassContentFormatter(getConfiguredDocumentPartitioning(sourceViewer), ICSSPartitionTypes.STYLE);
 
@@ -89,42 +95,6 @@
 		return formatter;
 	}
 
-	public IHighlighter getHighlighter(ISourceViewer sourceViewer) {
-		IHighlighter highlighter = super.getHighlighter(sourceViewer);
-
-		if (highlighter != null) {
-			highlighter.addProvider(ICSSPartitionTypes.STYLE, new LineStyleProviderForCSS());
-		}
-
-		return highlighter;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.text.source.SourceViewerConfiguration#getTextHover(org.eclipse.jface.text.source.ISourceViewer,
-	 *      java.lang.String, int)
-	 */
-	public ITextHover getTextHover(ISourceViewer sourceViewer, String contentType, int stateMask) {
-		// content type does not really matter since only combo, problem,
-		// annotation hover is available
-		TextHoverManager.TextHoverDescriptor[] hoverDescs = getTextHovers();
-		int i = 0;
-		while (i < hoverDescs.length) {
-			if (hoverDescs[i].isEnabled() && EditorUtility.computeStateMask(hoverDescs[i].getModifierString()) == stateMask) {
-				String hoverType = hoverDescs[i].getId();
-				if (TextHoverManager.COMBINATION_HOVER.equalsIgnoreCase(hoverType))
-					return new CSSBestMatchHoverProcessor();
-				else if (TextHoverManager.PROBLEM_HOVER.equalsIgnoreCase(hoverType))
-					return new ProblemAnnotationHoverProcessor();
-				else if (TextHoverManager.ANNOTATION_HOVER.equalsIgnoreCase(hoverType))
-					return new AnnotationHoverProcessor();
-			}
-			i++;
-		}
-		return super.getTextHover(sourceViewer, contentType, stateMask);
-	}
-	
 	public String[] getIndentPrefixes(ISourceViewer sourceViewer, String contentType) {
 		Vector vector = new Vector();
 
@@ -166,4 +136,21 @@
 
 		return (String[]) vector.toArray(new String[vector.size()]);
 	}
+
+	public LineStyleProvider[] getLineStyleProviders(ISourceViewer sourceViewer, String partitionType) {
+		LineStyleProvider[] providers = null;
+
+		if (partitionType == ICSSPartitionTypes.STYLE) {
+			providers = new LineStyleProvider[]{getLineStyleProviderForCSS()};
+		}
+
+		return providers;
+	}
+
+	private LineStyleProvider getLineStyleProviderForCSS() {
+		if (fLineStyleProviderForCSS == null) {
+			fLineStyleProviderForCSS = new LineStyleProviderForCSS();
+		}
+		return fLineStyleProviderForCSS;
+	}
 }
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.css.ui/src/org/eclipse/wst/css/ui/internal/style/LineStyleProviderForCSS.java b/bundles/org.eclipse.wst.css.ui/src/org/eclipse/wst/css/ui/internal/style/LineStyleProviderForCSS.java
index 4c6eb28..7b3b182 100644
--- a/bundles/org.eclipse.wst.css.ui/src/org/eclipse/wst/css/ui/internal/style/LineStyleProviderForCSS.java
+++ b/bundles/org.eclipse.wst.css.ui/src/org/eclipse/wst/css/ui/internal/style/LineStyleProviderForCSS.java
@@ -33,8 +33,6 @@
 	 */
 	public LineStyleProviderForCSS() {
 		super();
-		initAttributes();
-		loadColors();
 	}
 
 	protected TextAttribute getAttributeFor(ITextRegion region) {
@@ -171,12 +169,14 @@
 	public void release() {
 		if (fColorTypes != null) {
 			fColorTypes.clear();
+			fColorTypes = null;
 		}
 		super.release();
 	}
 
 	public void loadColors() {
-		clearColors();
+		initAttributes();
+		
 		addTextAttribute(IStyleConstantsCSS.ATMARK_RULE);
 		addTextAttribute(IStyleConstantsCSS.COLON);
 		addTextAttribute(IStyleConstantsCSS.COMMENT);
@@ -192,10 +192,6 @@
 		addTextAttribute(IStyleConstantsCSS.URI);
 	}
 
-	protected void clearColors() {
-		getTextAttributes().clear();
-	}
-
 	protected IPreferenceStore getColorPreferences() {
 		return CSSUIPlugin.getDefault().getPreferenceStore();
 	}
diff --git a/bundles/org.eclipse.wst.css.ui/src/org/eclipse/wst/css/ui/internal/taginfo/CSSBestMatchHoverProcessor.java b/bundles/org.eclipse.wst.css.ui/src/org/eclipse/wst/css/ui/internal/taginfo/CSSBestMatchHoverProcessor.java
deleted file mode 100644
index 26d674c..0000000
--- a/bundles/org.eclipse.wst.css.ui/src/org/eclipse/wst/css/ui/internal/taginfo/CSSBestMatchHoverProcessor.java
+++ /dev/null
@@ -1,28 +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
- *******************************************************************************/
-package org.eclipse.wst.css.ui.internal.taginfo;
-
-import org.eclipse.jface.text.ITextHover;
-import org.eclipse.wst.sse.ui.internal.taginfo.AbstractBestMatchHoverProcessor;
-
-/**
- * Provides the best css hover help documentation (by using other hover help
- * processors) Priority of hover help processors is: ProblemHoverProcessor,
- * AnnotationHoverProcessor
- */
-public class CSSBestMatchHoverProcessor extends AbstractBestMatchHoverProcessor {
-
-	protected ITextHover getTagInfoHover() {
-		// CSS has no taginfo hover
-		return null;
-	}
-
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.dtd.ui/META-INF/MANIFEST.MF b/bundles/org.eclipse.wst.dtd.ui/META-INF/MANIFEST.MF
index edaba9d..0163074 100644
--- a/bundles/org.eclipse.wst.dtd.ui/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.wst.dtd.ui/META-INF/MANIFEST.MF
@@ -14,7 +14,6 @@
  org.eclipse.wst.dtd.ui.internal.provisional,
  org.eclipse.wst.dtd.ui.internal.registry,
  org.eclipse.wst.dtd.ui.internal.style,
- org.eclipse.wst.dtd.ui.internal.taginfo,
  org.eclipse.wst.dtd.ui.internal.templates,
  org.eclipse.wst.dtd.ui.internal.text,
  org.eclipse.wst.dtd.ui.internal.views.contentoutline,
diff --git a/bundles/org.eclipse.wst.dtd.ui/plugin.xml b/bundles/org.eclipse.wst.dtd.ui/plugin.xml
index 6fcdccd..d627849 100644
--- a/bundles/org.eclipse.wst.dtd.ui/plugin.xml
+++ b/bundles/org.eclipse.wst.dtd.ui/plugin.xml
@@ -15,37 +15,27 @@
 		</editor>
 	</extension>
 
-	<extension point="org.eclipse.wst.sse.ui.extendedconfiguration">
-		<configuration
-			type="contentoutlineconfiguration"
+	<extension point="org.eclipse.wst.sse.ui.editorConfiguration">
+		<contentOutlineConfiguration
 			class="org.eclipse.wst.dtd.ui.internal.views.contentoutline.DTDContentOutlineConfiguration"
 			target="org.eclipse.wst.dtd.core.dtdsource" />
-		<configuration
-			type="textviewerconfiguration"
+		<sourceViewerConfiguration
 			class="org.eclipse.wst.dtd.ui.internal.provisional.StructuredTextViewerConfigurationDTD"
 			target="org.eclipse.wst.dtd.core.dtdsource" />
-		<configuration
+		<provisionalConfiguration
 			type="characterpairmatcher"
 			class="org.eclipse.wst.dtd.ui.internal.text.DTDDocumentRegionEdgeMatcher"
 			target="org.eclipse.wst.dtd.core.dtdsource" />
-		<configuration
+		<provisionalConfiguration
 			type="structuredtextfoldingprovider"
 			class="org.eclipse.wst.dtd.ui.internal.projection.StructuredTextFoldingProviderDTD"
 			target="org.eclipse.wst.dtd.core.dtdsource" />
-		<definition
+		<provisionalDefinition
 			type="preferencepages"
-			value="org.eclipse.wst.sse.ui.preferences.dtd"
-			target="org.eclipse.wst.dtd.core.dtdsource" />
-		<definition
-			type="preferencepages"
-			value="org.eclipse.wst.sse.ui.preferences.dtd.templates"
-			target="org.eclipse.wst.dtd.core.dtdsource" />
-		<definition
-			type="preferencepages"
-			value="org.eclipse.wst.sse.ui.preferences.dtd.styles"
+			value="org.eclipse.wst.sse.ui.preferences.dtd, org.eclipse.wst.sse.ui.preferences.dtd.templates, org.eclipse.wst.sse.ui.preferences.dtd.styles"
 			target="org.eclipse.wst.dtd.core.dtdsource" />
 		<!-- provide syntax highlighting for DTD subset within XML -->
-		<configuration
+		<provisionalConfiguration
 			type="linestyleprovider"
 			class="org.eclipse.wst.dtd.ui.internal.style.LineStyleProviderForDTDSubSet"
 			target="org.eclipse.wst.xml.dtd.internal_subset" />
diff --git a/bundles/org.eclipse.wst.dtd.ui/src/org/eclipse/wst/dtd/ui/internal/provisional/StructuredTextViewerConfigurationDTD.java b/bundles/org.eclipse.wst.dtd.ui/src/org/eclipse/wst/dtd/ui/internal/provisional/StructuredTextViewerConfigurationDTD.java
index 18f0cb0..04d6b88 100644
--- a/bundles/org.eclipse.wst.dtd.ui/src/org/eclipse/wst/dtd/ui/internal/provisional/StructuredTextViewerConfigurationDTD.java
+++ b/bundles/org.eclipse.wst.dtd.ui/src/org/eclipse/wst/dtd/ui/internal/provisional/StructuredTextViewerConfigurationDTD.java
@@ -12,31 +12,16 @@
  *******************************************************************************/
 package org.eclipse.wst.dtd.ui.internal.provisional;
 
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.ITextHover;
-import org.eclipse.jface.text.contentassist.ContentAssistant;
-import org.eclipse.jface.text.contentassist.IContentAssistant;
 import org.eclipse.jface.text.reconciler.IReconciler;
 import org.eclipse.jface.text.source.ISourceViewer;
 import org.eclipse.wst.dtd.core.internal.provisional.text.IDTDPartitionTypes;
 import org.eclipse.wst.dtd.ui.internal.style.LineStyleProviderForDTD;
-import org.eclipse.wst.dtd.ui.internal.taginfo.DTDBestMatchHoverProcessor;
-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.provisional.text.IStructuredDocument;
 import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredPartitionTypes;
-import org.eclipse.wst.sse.ui.internal.StructuredTextEditor;
 import org.eclipse.wst.sse.ui.internal.provisional.StructuredTextViewerConfiguration;
 import org.eclipse.wst.sse.ui.internal.provisional.preferences.CommonEditorPreferenceNames;
-import org.eclipse.wst.sse.ui.internal.provisional.style.IHighlighter;
 import org.eclipse.wst.sse.ui.internal.provisional.style.LineStyleProvider;
 import org.eclipse.wst.sse.ui.internal.provisional.style.LineStyleProviderForNoOp;
 import org.eclipse.wst.sse.ui.internal.reconcile.StructuredRegionProcessor;
-import org.eclipse.wst.sse.ui.internal.taginfo.AnnotationHoverProcessor;
-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;
 
 
 /**
@@ -45,133 +30,79 @@
  * @plannedfor 1.0
  */
 public class StructuredTextViewerConfigurationDTD extends StructuredTextViewerConfiguration {
-
-	/**
-	 * 
-	 */
-	public StructuredTextViewerConfigurationDTD() {
-		super();
-	}
-
-	/**
-	 * @param store
-	 */
-	public StructuredTextViewerConfigurationDTD(IPreferenceStore store) {
-		super(store);
-	}
-
 	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.text.source.SourceViewerConfiguration#getConfiguredContentTypes(org.eclipse.jface.text.source.ISourceViewer)
+	 * One instance per configuration because not sourceviewer-specific and
+	 * it's a String array
 	 */
+	private String[] fConfiguredContentTypes;
+	/*
+	 * One instance per configuration
+	 */
+	private LineStyleProvider fLineStyleProviderForDTD;
+	/*
+	 * One instance per configuration
+	 */
+	private LineStyleProvider fLineStyleProviderForNoop;
+	/*
+	 * One instance per configuration
+	 */
+	private IReconciler fReconciler;
+
 	public String[] getConfiguredContentTypes(ISourceViewer sourceViewer) {
-		if (configuredContentTypes == null) {
-			configuredContentTypes = new String[]{IDTDPartitionTypes.DTD_DEFAULT, IStructuredPartitionTypes.DEFAULT_PARTITION, IStructuredPartitionTypes.UNKNOWN_PARTITION};
+		if (fConfiguredContentTypes == null) {
+			fConfiguredContentTypes = new String[]{IDTDPartitionTypes.DTD_DEFAULT, IStructuredPartitionTypes.DEFAULT_PARTITION, IStructuredPartitionTypes.UNKNOWN_PARTITION};
 		}
-		return configuredContentTypes;
+		return fConfiguredContentTypes;
 	}
+	
+	public LineStyleProvider[] getLineStyleProviders(ISourceViewer sourceViewer, String partitionType) {
+		LineStyleProvider[] providers = null;
 
-	// WORKAROUND for bug 98408
-	public IContentAssistant getContentAssistant(ISourceViewer sourceViewer) {
-		ContentAssistant assistant = (ContentAssistant) super.getContentAssistant(sourceViewer);
-		assistant.setContentAssistProcessor(null, IDTDPartitionTypes.DTD_DEFAULT);
-		return assistant;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.sse.ui.StructuredTextViewerConfiguration#getHighlighter(org.eclipse.jface.text.source.ISourceViewer)
-	 */
-	public IHighlighter getHighlighter(ISourceViewer sourceViewer) {
-		IHighlighter highlighter = super.getHighlighter(sourceViewer);
-
-		// We need to add the providers each time this method is called.
-		// See StructuredTextViewer.configure() method (defect#246727)
-		LineStyleProvider dtdProvider = new LineStyleProviderForDTD();
-		LineStyleProvider noopProvider = new LineStyleProviderForNoOp();
-
-		highlighter.addProvider(IDTDPartitionTypes.DTD_DEFAULT, dtdProvider);
-		highlighter.addProvider(IStructuredPartitionTypes.DEFAULT_PARTITION, dtdProvider);
-		highlighter.addProvider(IStructuredPartitionTypes.UNKNOWN_PARTITION, noopProvider);
-
-		highlighter.setDocument((IStructuredDocument) sourceViewer.getDocument());
-
-		return highlighter;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.text.source.SourceViewerConfiguration#getTextHover(org.eclipse.jface.text.source.ISourceViewer,
-	 *      java.lang.String, int)
-	 */
-	public ITextHover getTextHover(ISourceViewer sourceViewer, String contentType, int stateMask) {
-		/*
-		 * content type does not really matter since only combo, problem,
-		 * annotation hover are available
-		 */
-		TextHoverManager.TextHoverDescriptor[] hoverDescs = getTextHovers();
-		for (int i = 0; i < hoverDescs.length; i++) {
-			if (hoverDescs[i].isEnabled() && EditorUtility.computeStateMask(hoverDescs[i].getModifierString()) == stateMask) {
-				String hoverType = hoverDescs[i].getId();
-				if (TextHoverManager.COMBINATION_HOVER.equalsIgnoreCase(hoverType))
-					return new DTDBestMatchHoverProcessor();
-				else if (TextHoverManager.PROBLEM_HOVER.equalsIgnoreCase(hoverType))
-					return new ProblemAnnotationHoverProcessor();
-				else if (TextHoverManager.ANNOTATION_HOVER.equalsIgnoreCase(hoverType))
-					return new AnnotationHoverProcessor();
-			}
+		if (partitionType == IDTDPartitionTypes.DTD_DEFAULT || partitionType == IStructuredPartitionTypes.DEFAULT_PARTITION) {
+			providers = new LineStyleProvider[]{getLineStyleProviderForCSS()};
+		} else if (partitionType == IStructuredPartitionTypes.UNKNOWN_PARTITION) {
+			providers = new LineStyleProvider[]{getLineStyleProviderForNoop()};
 		}
-		return super.getTextHover(sourceViewer, contentType, stateMask);
+
+		return providers;
+	}
+
+	private LineStyleProvider getLineStyleProviderForCSS() {
+		if (fLineStyleProviderForDTD == null) {
+			fLineStyleProviderForDTD = new LineStyleProviderForDTD();
+		}
+		return fLineStyleProviderForDTD;
+	}
+	
+	private LineStyleProvider getLineStyleProviderForNoop() {
+		if (fLineStyleProviderForNoop == null) {
+			fLineStyleProviderForNoop = new LineStyleProviderForNoOp();
+		}
+		return fLineStyleProviderForNoop;
 	}
 
 	public IReconciler getReconciler(ISourceViewer sourceViewer) {
-
-		if (fReconciler != null) {
-			// a reconciler should always be installed or disposed of
-			if (!fReconciler.isInstalled()) {
-				fReconciler = null;
-			}
-		}
-
-		if (fReconciler == null) {
-			fReconciler = new StructuredRegionProcessor();
-			fReconciler.setDocumentPartitioning(getConfiguredDocumentPartitioning(sourceViewer));
-		}
-
 		boolean reconcilingEnabled = fPreferenceStore.getBoolean(CommonEditorPreferenceNames.EVALUATE_TEMPORARY_PROBLEMS);
+		if (sourceViewer == null || !reconcilingEnabled)
+			return null;
 
-		if (!reconcilingEnabled)
-			return fReconciler;
+		/*
+		 * Only create reconciler if sourceviewer is present
+		 */
+		if (fReconciler == null && sourceViewer != null) {
+			StructuredRegionProcessor reconciler = new StructuredRegionProcessor();
 
-		// the second time through, the strategies are set
-		if (fReconciler != null) {
+			// reconciler configurations
+			reconciler.setDocumentPartitioning(getConfiguredDocumentPartitioning(sourceViewer));
 
-			IDocument doc = ((StructuredTextEditor) editorPart).getDocumentProvider().getDocument(editorPart.getEditorInput());
-			IStructuredModel sModel = StructuredModelManager.getModelManager().getExistingModelForRead(doc);
+			// IReconcilingStrategy markupStrategy = new
+			// StructuredTextReconcilingStrategyForMarkup((ITextEditor)
+			// editorPart);
+			// fReconciler.setReconcilingStrategy(markupStrategy,
+			// IXMLPartitions.XML_DEFAULT);
+			// fReconciler.setDefaultStrategy(markupStrategy);
 
-			try {
-
-				if (sModel != null) {
-
-					// IReconcilingStrategy markupStrategy = new
-					// StructuredTextReconcilingStrategyForMarkup((ITextEditor)
-					// editorPart);
-					// fReconciler.setReconcilingStrategy(markupStrategy,
-					// IXMLPartitions.XML_DEFAULT);
-					// fReconciler.setDefaultStrategy(markupStrategy);
-
-					String contentTypeId = sModel.getContentTypeIdentifier();
-					if (contentTypeId != null)
-						fReconciler.setValidatorStrategy(createValidatorStrategy(contentTypeId));
-				}
-			}
-			finally {
-				if (sModel != null)
-					sModel.releaseFromRead();
-			}
+			fReconciler = reconciler;
 		}
 		return fReconciler;
 	}
diff --git a/bundles/org.eclipse.wst.dtd.ui/src/org/eclipse/wst/dtd/ui/internal/style/LineStyleProviderForDTD.java b/bundles/org.eclipse.wst.dtd.ui/src/org/eclipse/wst/dtd/ui/internal/style/LineStyleProviderForDTD.java
index 943fa7c..418d718 100644
--- a/bundles/org.eclipse.wst.dtd.ui/src/org/eclipse/wst/dtd/ui/internal/style/LineStyleProviderForDTD.java
+++ b/bundles/org.eclipse.wst.dtd.ui/src/org/eclipse/wst/dtd/ui/internal/style/LineStyleProviderForDTD.java
@@ -24,11 +24,6 @@
 public class LineStyleProviderForDTD extends AbstractLineStyleProvider implements LineStyleProvider {
 	public LineStyleProviderForDTD() {
 		super();
-		loadColors();
-	}
-
-	protected void clearColors() {
-		getTextAttributes().clear();
 	}
 
 	protected TextAttribute getAttributeFor(ITextRegion region) {
@@ -126,8 +121,6 @@
 	}
 
 	protected void loadColors() {
-		clearColors();
-
 		addTextAttribute(IStyleConstantsDTD.DTD_DEFAULT);
 		addTextAttribute(IStyleConstantsDTD.DTD_TAG);
 		addTextAttribute(IStyleConstantsDTD.DTD_TAGNAME);
diff --git a/bundles/org.eclipse.wst.dtd.ui/src/org/eclipse/wst/dtd/ui/internal/style/LineStyleProviderForDTDSubSet.java b/bundles/org.eclipse.wst.dtd.ui/src/org/eclipse/wst/dtd/ui/internal/style/LineStyleProviderForDTDSubSet.java
index c24953f..fa3127b 100644
--- a/bundles/org.eclipse.wst.dtd.ui/src/org/eclipse/wst/dtd/ui/internal/style/LineStyleProviderForDTDSubSet.java
+++ b/bundles/org.eclipse.wst.dtd.ui/src/org/eclipse/wst/dtd/ui/internal/style/LineStyleProviderForDTDSubSet.java
@@ -21,6 +21,7 @@
 import org.eclipse.jface.text.ITypedRegion;
 import org.eclipse.jface.text.TextAttribute;
 import org.eclipse.jface.text.TextUtilities;
+import org.eclipse.swt.SWT;
 import org.eclipse.swt.custom.StyleRange;
 import org.eclipse.swt.graphics.RGB;
 import org.eclipse.wst.dtd.core.internal.provisional.contenttype.ContentTypeIdForDTD;
@@ -33,10 +34,13 @@
 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.ui.internal.preferences.ui.ColorHelper;
-import org.eclipse.wst.sse.ui.internal.provisional.style.AbstractLineStyleProvider;
+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.util.EditorUtility;
 
-public class LineStyleProviderForDTDSubSet extends AbstractLineStyleProvider implements LineStyleProvider {
+public class LineStyleProviderForDTDSubSet implements LineStyleProvider {
+	private IStructuredDocument fDocument = null;
+	private Highlighter fHighlighter = null;
 	private IStructuredModel fInternalModel = null;
 	private LineStyleProviderForDTD fInternalProvider = null;
 	private StyleRange[] fInternalRanges;
@@ -81,6 +85,10 @@
 		}
 	}
 
+	private 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 getAttributeFor(ITextRegion region) {
 		TextAttribute ta = null;
 
@@ -109,6 +117,11 @@
 		return fInternalModel.getStructuredDocument();
 	}
 
+	public void init(IStructuredDocument document, Highlighter highlighter) {
+		fDocument = document;
+		fHighlighter = highlighter;
+	}
+	
 	/*
 	 * (non-Javadoc)
 	 * 
@@ -119,7 +132,7 @@
 		if (!IDTDPartitionTypes.DTD_DEFAULT.equals(typedRegion.getType())) {
 			// compute an internal DTD model and return linestyles for it
 			ITextRegion dtdContentRegion = null;
-			IStructuredDocumentRegion doctype = getDocument().getRegionAtCharacterOffset(typedRegion.getOffset());
+			IStructuredDocumentRegion doctype = fDocument.getRegionAtCharacterOffset(typedRegion.getOffset());
 			if (doctype != null)
 				dtdContentRegion = doctype.getRegionAtCharacterOffset(typedRegion.getOffset());
 			String contents = dtdContentRegion != null ? doctype.getFullText(dtdContentRegion) : null;
@@ -139,7 +152,6 @@
 		if (fInternalProvider != null) {
 			fInternalProvider.release();
 		}
-		super.release();
 	}
 
 	private void updateStyleRanges(IStructuredDocument document, String contents) {
@@ -148,7 +160,7 @@
 			try {
 				ITypedRegion regions[] = TextUtilities.computePartitioning(getInternalDocument(), fPartitioning, 0, document.getLength(), false);
 				List ranges = new ArrayList();
-				fInternalProvider.init(getInternalDocument(), getHighlighter());
+				fInternalProvider.init(getInternalDocument(), fHighlighter);
 				for (int i = 0; i < regions.length; i++) {
 					fInternalProvider.prepareRegions(regions[i], regions[i].getOffset(), regions[i].getLength(), ranges);
 				}
diff --git a/bundles/org.eclipse.wst.dtd.ui/src/org/eclipse/wst/dtd/ui/internal/taginfo/DTDBestMatchHoverProcessor.java b/bundles/org.eclipse.wst.dtd.ui/src/org/eclipse/wst/dtd/ui/internal/taginfo/DTDBestMatchHoverProcessor.java
deleted file mode 100644
index da28a61..0000000
--- a/bundles/org.eclipse.wst.dtd.ui/src/org/eclipse/wst/dtd/ui/internal/taginfo/DTDBestMatchHoverProcessor.java
+++ /dev/null
@@ -1,34 +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.dtd.ui.internal.taginfo;
-
-import org.eclipse.jface.text.ITextHover;
-import org.eclipse.wst.sse.ui.internal.taginfo.AbstractBestMatchHoverProcessor;
-
-
-/**
- * @author amywu
- */
-public class DTDBestMatchHoverProcessor extends AbstractBestMatchHoverProcessor {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.dtd.ui.internal.taginfo.AbstractBestMatchHoverProcessor#getTagInfoHover()
-	 */
-	protected ITextHover getTagInfoHover() {
-		// DTD has no taginfo hover
-		return null;
-	}
-
-}
diff --git a/bundles/org.eclipse.wst.html.ui/META-INF/MANIFEST.MF b/bundles/org.eclipse.wst.html.ui/META-INF/MANIFEST.MF
index 739d25c..381faeb 100644
--- a/bundles/org.eclipse.wst.html.ui/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.wst.html.ui/META-INF/MANIFEST.MF
@@ -12,6 +12,7 @@
  org.eclipse.wst.html.ui.internal.contentassist,
  org.eclipse.wst.html.ui.internal.contentoutline,
  org.eclipse.wst.html.ui.internal.contentproperties.ui,
+ org.eclipse.wst.html.ui.internal.derived,
  org.eclipse.wst.html.ui.internal.edit.ui,
  org.eclipse.wst.html.ui.internal.editor,
  org.eclipse.wst.html.ui.internal.hyperlink,
diff --git a/bundles/org.eclipse.wst.html.ui/plugin.xml b/bundles/org.eclipse.wst.html.ui/plugin.xml
index ebf029d..bbf8b43 100644
--- a/bundles/org.eclipse.wst.html.ui/plugin.xml
+++ b/bundles/org.eclipse.wst.html.ui/plugin.xml
@@ -19,46 +19,31 @@
 				contentTypeId="org.eclipse.wst.html.core.htmlsource" />
 		</editor>
 	</extension>
-	<extension point="org.eclipse.wst.sse.ui.extendedconfiguration">
-		<configuration
-			type="textviewerconfiguration"
+	<extension point="org.eclipse.wst.sse.ui.editorConfiguration">
+		<sourceViewerConfiguration
 			class="org.eclipse.wst.html.ui.internal.provisional.StructuredTextViewerConfigurationHTML"
 			target="org.eclipse.wst.html.core.htmlsource" />
-		<configuration
-			type="contentoutlineconfiguration"
+		<contentOutlineConfiguration
 			class="org.eclipse.wst.html.ui.internal.views.contentoutline.HTMLContentOutlineConfiguration"
 			target="org.eclipse.wst.html.core.htmlsource" />
-		<configuration
-			type="propertysheetconfiguration"
+		<propertySheetConfiguration
 			class="org.eclipse.wst.xml.ui.internal.views.properties.XMLPropertySheetConfiguration"
 			target="org.eclipse.wst.html.core.htmlsource" />
-		<configuration
+		<provisionalConfiguration
 			type="sourceeditingtexttools"
 			class="org.eclipse.wst.xml.ui.internal.provisional.XMLSourceEditingTextTools"
 			target="org.eclipse.wst.html.core.htmlsource" />
-		<configuration
+		<provisionalConfiguration
 			type="characterpairmatcher"
 			class="org.eclipse.wst.html.ui.internal.text.HTMLDocumentRegionEdgeMatcher"
 			target="org.eclipse.wst.html.core.htmlsource" />
-		<configuration
+		<provisionalConfiguration
 			type="structuredtextfoldingprovider"
 			class="org.eclipse.wst.html.ui.internal.projection.StructuredTextFoldingProviderHTML"
 			target="org.eclipse.wst.html.core.htmlsource" />
-		<definition
+		<provisionalDefinition
 			type="preferencepages"
-			value="org.eclipse.wst.html.ui.preferences"
-			target="org.eclipse.wst.html.core.htmlsource" />
-		<definition
-			type="preferencepages"
-			value="org.eclipse.wst.html.ui.preferences.source"
-			target="org.eclipse.wst.html.core.htmlsource" />
-		<definition
-			type="preferencepages"
-			value="org.eclipse.wst.html.ui.preferences.templates"
-			target="org.eclipse.wst.html.core.htmlsource" />
-		<definition
-			type="preferencepages"
-			value="org.eclipse.wst.html.ui.preferences.styles"
+			value="org.eclipse.wst.html.ui.preferences, org.eclipse.wst.html.ui.preferences.source, org.eclipse.wst.html.ui.preferences.templates, org.eclipse.wst.html.ui.preferences.styles"
 			target="org.eclipse.wst.html.core.htmlsource" />
 	</extension>
 	<extension
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
index f543fc0..ff35669 100644
--- 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
@@ -14,7 +14,6 @@
 import java.util.Iterator;
 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;
@@ -65,7 +64,6 @@
 	private INodeAdapterFactory factoryForCSS = null;
 	protected IPreferenceStore fPreferenceStore = null;
 	protected boolean isXHTML = false;
-	protected IResource fResource = null;
 	private HTMLTemplateCompletionProcessor fTemplateProcessor = null;
 	private List fTemplateContexts = new ArrayList();
 
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/editor/HTML2TextReader.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/derived/HTML2TextReader.java
similarity index 67%
rename from bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/editor/HTML2TextReader.java
rename to bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/derived/HTML2TextReader.java
index a35f11c..55689a6 100644
--- a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/editor/HTML2TextReader.java
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/derived/HTML2TextReader.java
@@ -1,18 +1,16 @@
-/*******************************************************************************
- * 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
+/*
+ * Copyright (c) 2005 IBM Corporation and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/cpl-v10.html
  * 
  * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.ui.internal.editor;
-
-
+ *   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.PushbackReader;
@@ -25,10 +23,11 @@
 import org.eclipse.jface.text.TextPresentation;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.custom.StyleRange;
+import org.eclipse.wst.xml.ui.internal.derived.SubstitutionTextReader;
 
-/**
- * Copied from org.eclipse.jdt.internal.ui.text.HTML2TextReader
- * Modifications were made to add br/ tag
+/*
+ * 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
@@ -36,13 +35,13 @@
  */
 public class HTML2TextReader extends SubstitutionTextReader {
 
-	private static final String EMPTY_STRING = ""; //$NON-NLS-1$
+	private static final String EMPTY_STRING= ""; //$NON-NLS-1$
 	private static final Map fgEntityLookup;
 	private static final Set fgTags;
 
 	static {
 
-		fgTags = new HashSet();
+		fgTags= new HashSet();
 		fgTags.add("b"); //$NON-NLS-1$
 		fgTags.add("br"); //$NON-NLS-1$
 		fgTags.add("br/");//$NON-NLS-1$
@@ -55,42 +54,73 @@
 		fgTags.add("ul"); //$NON-NLS-1$
 		fgTags.add("pre"); //$NON-NLS-1$
 
-		fgEntityLookup = new HashMap(7);
+		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$
+		fgEntityLookup.put("quot", "\"");		 //$NON-NLS-1$ //$NON-NLS-2$
 	}
-	private int fBold = 0;
 
-	private int fCounter = 0;
-	private boolean fInParagraph = false;
-	private boolean fIsPreformattedText = false;
-	private int fStartOffset = -1;
+	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.
-	 */
+	 * @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;
+		fTextPresentation= presentation;
 	}
 
-	/**
-	 * @see SubstitutionTextReader#computeSubstitution(char)
+	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();
+			return  processHTMLTag();
 		else if (c == '&')
 			return processEntity();
 		else if (fIsPreformattedText)
@@ -99,38 +129,19 @@
 		return null;
 	}
 
-	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) {
-			}
-		} else {
-			String str = (String) fgEntityLookup.get(symbol);
-			if (str != null) {
-				return str;
-			}
-		}
-		return "&" + symbol; // not found //$NON-NLS-1$
-	}
-
 	private String html2Text(String html) {
+
 		if (html == null || html.length() == 0)
 			return EMPTY_STRING;
 
-		String tag = html;
+		String tag= html;
 		if ('/' == tag.charAt(0))
-			tag = tag.substring(1);
+			tag= tag.substring(1);
 
 		if (!fgTags.contains(tag))
 			return EMPTY_STRING;
 
+
 		if ("pre".equals(html)) { //$NON-NLS-1$
 			startPreformattedText();
 			return EMPTY_STRING;
@@ -168,17 +179,17 @@
 			return EMPTY_STRING;
 		}
 
-		if ("p".equals(html)) { //$NON-NLS-1$
-			fInParagraph = true;
+		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;
+		if ("/p".equals(html))  { //$NON-NLS-1$
+			boolean inParagraph= fInParagraph;
+			fInParagraph= false;
 			return inParagraph ? EMPTY_STRING : LINE_DELIM;
 		}
 
@@ -194,48 +205,28 @@
 	}
 
 	/*
-	 * 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();
-	}
-
-	/*
-	 * A ' <' has been read. Process a html tag
+	 * A '<' has been read. Process a html tag
 	 */
 	private String processHTMLTag() throws IOException {
 
-		StringBuffer buf = new StringBuffer();
+		StringBuffer buf= new StringBuffer();
 		int ch;
 		do {
 
-			ch = nextChar();
+			ch= nextChar();
 
 			while (ch != -1 && ch != '>') {
 				buf.append(Character.toLowerCase((char) ch));
-				ch = nextChar();
-				if (ch == '"') {
+				ch= nextChar();
+				if (ch == '"'){
 					buf.append(Character.toLowerCase((char) ch));
-					ch = nextChar();
-					while (ch != -1 && ch != '"') {
+					ch= nextChar();
+					while (ch != -1 && ch != '"'){
 						buf.append(Character.toLowerCase((char) ch));
-						ch = nextChar();
+						ch= nextChar();
 					}
 				}
-				if (ch == '<') {
+				if (ch == '<'){
 					unread(ch);
 					return '<' + buf.toString();
 				}
@@ -244,10 +235,10 @@
 			if (ch == -1)
 				return null;
 
-			int tagLen = buf.length();
+			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 - 3)))) { //$NON-NLS-1$
+				&& !(tagLen >= 5 && "--".equals(buf.substring(tagLen - 2)))) { //$NON-NLS-1$
 				// unfinished comment
 				buf.append(ch);
 			} else {
@@ -259,46 +250,55 @@
 	}
 
 	private String processPreformattedText(int c) {
-		if (c == '\r' || c == '\n')
+		if  (c == '\r' || c == '\n')
 			fCounter++;
 		return null;
 	}
 
-	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 stopBold() {
-		--fBold;
-		if (fBold == 0) {
-			if (fTextPresentation != null) {
-				fTextPresentation.addStyleRange(new StyleRange(fStartOffset, fCounter - fStartOffset, null, null, SWT.BOLD));
-			}
-			fStartOffset = -1;
-		}
-	}
-
-	protected void stopPreformattedText() {
-		fIsPreformattedText = false;
-		setSkipWhitespace(true);
-	}
-
 
 	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/editor/HTMLTextPresenter.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/derived/HTMLTextPresenter.java
similarity index 84%
rename from bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/editor/HTMLTextPresenter.java
rename to bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/derived/HTMLTextPresenter.java
index c3a1faa..95a56c2 100644
--- a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/editor/HTMLTextPresenter.java
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/derived/HTMLTextPresenter.java
@@ -1,18 +1,16 @@
-/*******************************************************************************
- * 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
+/*
+ * Copyright (c) 2005 IBM Corporation and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/cpl-v10.html
  * 
  * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.ui.internal.editor;
-
-
+ *   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;
@@ -25,29 +23,33 @@
 import org.eclipse.swt.custom.StyleRange;
 import org.eclipse.swt.graphics.GC;
 import org.eclipse.swt.widgets.Display;
-import org.eclipse.wst.sse.ui.internal.Logger;
+import org.eclipse.wst.xml.ui.internal.Logger;
+import org.eclipse.wst.xml.ui.internal.derived.HTML2TextReader;
+import org.eclipse.wst.xml.ui.internal.derived.LineBreakingReader;
 
-
-/**
+/*
  * Copied from org.eclipse.jdt.internal.ui.text.HTMLTextPresenter
- * Modifications were made to use sed Logger to log exception, and the
+ * Modifications were made to use own Logger to log exception, and the
  * ellipses constant
  */
 public class HTMLTextPresenter implements DefaultInformationControl.IInformationPresenter {
 	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);
 	}
 
-	public HTMLTextPresenter(boolean enforceUpperLineLimit) {
-		super();
-		fEnforceUpperLineLimit = enforceUpperLineLimit;
+	protected Reader createReader(String hoverInfo, TextPresentation presentation) {
+		return new HTML2TextReader(new StringReader(hoverInfo), presentation);
 	}
 
 	protected void adaptTextPresentation(TextPresentation presentation, int offset, int insertLength) {
@@ -86,10 +88,6 @@
 		fCounter += length;
 	}
 
-	protected Reader createReader(String hoverInfo, TextPresentation presentation) {
-		return new HTML2TextReader(new StringReader(hoverInfo), presentation);
-	}
-
 	private String getIndent(String line) {
 		int length = line.length();
 
@@ -100,31 +98,6 @@
 		return (i == length ? line : line.substring(0, i)) + " "; //$NON-NLS-1$
 	}
 
-	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();
-	}
-
 	/*
 	 * @see IHoverInformationPresenter#updatePresentation(Display display,
 	 *      String, TextPresentation, int, int)
@@ -180,19 +153,44 @@
 				maxNumberOfLines--;
 			}
 
-			if (line != null) {
+			if (line != null && buffer.length() > 0) {
 				append(buffer, LINE_DELIM, lineFormatted ? presentation : null);
-				append(buffer, ELLIPSES, presentation); //$NON-NLS-1$
+				append(buffer, ELLIPSES, presentation);
 			}
 
 			return trim(buffer, presentation);
 
 		} catch (IOException e) {
-			Logger.logException(e); // log exception
+			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/editor/LineBreakingReader.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/derived/LineBreakingReader.java
similarity index 79%
copy from bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/editor/LineBreakingReader.java
copy to bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/derived/LineBreakingReader.java
index 655f23c..9e6b9a7 100644
--- a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/editor/LineBreakingReader.java
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/derived/LineBreakingReader.java
@@ -1,18 +1,16 @@
-/*******************************************************************************
- * 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
+/*
+ * Copyright (c) 2005 IBM Corporation and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/cpl-v10.html
  * 
  * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.ui.internal.editor;
-
-
+ *   IBM - Initial API and implementation
+ *   Jens Lukowski/Innoopract - initial renaming/restructuring
+ * 
+ */
+package org.eclipse.wst.html.ui.internal.derived;
 
 import java.io.BufferedReader;
 import java.io.IOException;
@@ -22,8 +20,8 @@
 import org.eclipse.swt.graphics.GC;
 
 /**
- * Copied from org.eclipse.jdt.internal.ui.text.LineBreakingReader No
- * modifications were made
+ * Copied from org.eclipse.jdt.internal.ui.text.LineBreakingReader.
+ * Modifications were made to fix warnings.
  */
 /*
  * Not a real reader. Could change if requested
@@ -70,9 +68,8 @@
 			if (nextWidth > fMaxWidth) {
 				if (currWidth > 0) {
 					return currOffset;
-				} else {
-					return nextOffset;
 				}
+				return nextOffset;
 			}
 			currWidth = nextWidth;
 			currOffset = nextOffset;
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..6425ba3
--- /dev/null
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/derived/SingleCharReader.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 2005 IBM Corporation and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-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.sse.ui/src/org/eclipse/wst/sse/ui/internal/editor/SubstitutionTextReader.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/derived/SubstitutionTextReader.java
similarity index 66%
rename from bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/editor/SubstitutionTextReader.java
rename to bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/derived/SubstitutionTextReader.java
index 0ff800f..e4deaa9 100644
--- a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/editor/SubstitutionTextReader.java
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/derived/SubstitutionTextReader.java
@@ -1,26 +1,26 @@
-/*******************************************************************************
- * 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
+/*
+ * Copyright (c) 2005 IBM Corporation and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/cpl-v10.html
  * 
  * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.ui.internal.editor;
-
-
+ *   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.ui.text.SubstitutionTextReader
- * Also copied in org.eclipse.wst.javascript.common.ui.contentassist.javadoc.SubstitutionTextReader
- * Modifications were made to read() to allow whitespaces
+import org.eclipse.wst.xml.ui.internal.derived.SingleCharReader;
+
+/*
+ * 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
@@ -30,19 +30,19 @@
 public abstract class SubstitutionTextReader extends SingleCharReader {
 
 	protected static final String LINE_DELIM = System.getProperty("line.separator", "\n"); //$NON-NLS-1$ //$NON-NLS-2$
-	private StringBuffer fBuffer;
-	private int fCharAfterWhiteSpace;
-	private int fIndex;
 
 	private Reader fReader;
-
-	private boolean fReadFromBuffer;
+	protected boolean fWasWhiteSpace;
+	private int fCharAfterWhiteSpace;
 
 	/**
 	 * Tells whether white space characters are skipped.
 	 */
 	private boolean fSkipWhiteSpace = true;
-	private boolean fWasWhiteSpace;
+
+	private boolean fReadFromBuffer;
+	private StringBuffer fBuffer;
+	private int fIndex;
 
 
 	protected SubstitutionTextReader(Reader reader) {
@@ -55,13 +55,6 @@
 	}
 
 	/**
-	 * @see Reader#close()
-	 */
-	public void close() throws IOException {
-		fReader.close();
-	}
-
-	/**
 	 * Implement to compute the substitution for the given character and if
 	 * necessary subsequent characters. Use <code>nextChar</code> to read
 	 * subsequent characters.
@@ -75,10 +68,6 @@
 		return fReader;
 	}
 
-	protected final boolean isSkippingWhitespace() {
-		return fSkipWhiteSpace;
-	}
-
 	/**
 	 * Returns the next character.
 	 */
@@ -91,24 +80,23 @@
 				fIndex = 0;
 			}
 			return ch;
-		} else {
-			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;
 		}
+		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;
 	}
 
 	/**
@@ -128,28 +116,12 @@
 				c = nextChar();
 			}
 
-		} while (fSkipWhiteSpace && fWasWhiteSpace && ((c == ' ') && !fReadFromBuffer)); // AFW
-		// - if
-		// whitespace
-		// is
-		// from
-		// buffer,
-		// then
-		// it
-		// should
-		// be
-		// read
-		fWasWhiteSpace = ((c == ' ' && !fReadFromBuffer) || c == '\r' || c == '\n'); // AFW
-		// - if
-		// whitespace
-		// is
-		// from
-		// buffer,
-		// then
-		// it
-		// should
-		// be
-		// read
+		} 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;
 	}
 
@@ -161,6 +133,13 @@
 	}
 
 	/**
+	 * @see Reader#close()
+	 */
+	public void close() throws IOException {
+		fReader.close();
+	}
+
+	/**
 	 * @see Reader#reset()
 	 */
 	public void reset() throws IOException {
@@ -174,4 +153,8 @@
 	protected final void setSkipWhitespace(boolean state) {
 		fSkipWhiteSpace = state;
 	}
+
+	protected final boolean isSkippingWhitespace() {
+		return fSkipWhiteSpace;
+	}
 }
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/provisional/StructuredTextViewerConfigurationHTML.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/provisional/StructuredTextViewerConfigurationHTML.java
index 81aff17..1e8f56e 100644
--- a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/provisional/StructuredTextViewerConfigurationHTML.java
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/provisional/StructuredTextViewerConfigurationHTML.java
@@ -15,9 +15,10 @@
 import java.util.Vector;
 
 import org.eclipse.core.runtime.Preferences;
-import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.text.DefaultInformationControl;
 import org.eclipse.jface.text.IAutoEditStrategy;
-import org.eclipse.jface.text.IDocument;
+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.contentassist.ContentAssistant;
@@ -32,8 +33,9 @@
 import org.eclipse.jface.text.reconciler.IReconciler;
 import org.eclipse.jface.text.reconciler.IReconcilingStrategy;
 import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Shell;
 import org.eclipse.ui.texteditor.AbstractDecoratedTextEditorPreferenceConstants;
-import org.eclipse.ui.texteditor.ITextEditor;
 import org.eclipse.wst.css.core.internal.provisional.text.ICSSPartitionTypes;
 import org.eclipse.wst.css.ui.internal.contentassist.CSSContentAssistProcessor;
 import org.eclipse.wst.css.ui.internal.style.LineStyleProviderForEmbeddedCSS;
@@ -45,28 +47,22 @@
 import org.eclipse.wst.html.ui.internal.autoedit.AutoEditStrategyForTabs;
 import org.eclipse.wst.html.ui.internal.contentassist.HTMLContentAssistProcessor;
 import org.eclipse.wst.html.ui.internal.contentassist.NoRegionContentAssistProcessorForHTML;
+import org.eclipse.wst.html.ui.internal.derived.HTMLTextPresenter;
 import org.eclipse.wst.html.ui.internal.hyperlink.XMLHyperlinkDetector;
 import org.eclipse.wst.html.ui.internal.style.LineStyleProviderForHTML;
-import org.eclipse.wst.html.ui.internal.taginfo.HTMLBestMatchHoverProcessor;
 import org.eclipse.wst.html.ui.internal.taginfo.HTMLInformationProvider;
 import org.eclipse.wst.html.ui.internal.taginfo.HTMLTagInfoHoverProcessor;
 import org.eclipse.wst.javascript.ui.internal.common.contentassist.JavaScriptContentAssistProcessor;
 import org.eclipse.wst.javascript.ui.internal.common.style.LineStyleProviderForJavaScript;
-import org.eclipse.wst.javascript.ui.internal.common.taginfo.JavaScriptBestMatchHoverProcessor;
 import org.eclipse.wst.javascript.ui.internal.common.taginfo.JavaScriptInformationProvider;
 import org.eclipse.wst.javascript.ui.internal.common.taginfo.JavaScriptTagInfoHoverProcessor;
-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.provisional.text.IStructuredPartitionTypes;
-import org.eclipse.wst.sse.ui.internal.StructuredTextEditor;
+import org.eclipse.wst.sse.ui.internal.SSEUIPlugin;
 import org.eclipse.wst.sse.ui.internal.format.StructuredFormattingStrategy;
 import org.eclipse.wst.sse.ui.internal.provisional.StructuredTextViewerConfiguration;
 import org.eclipse.wst.sse.ui.internal.provisional.preferences.CommonEditorPreferenceNames;
-import org.eclipse.wst.sse.ui.internal.provisional.style.IHighlighter;
 import org.eclipse.wst.sse.ui.internal.provisional.style.LineStyleProvider;
 import org.eclipse.wst.sse.ui.internal.reconcile.StructuredRegionProcessor;
-import org.eclipse.wst.sse.ui.internal.taginfo.AnnotationHoverProcessor;
-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;
 import org.eclipse.wst.xml.core.internal.provisional.text.IXMLPartitions;
@@ -77,24 +73,33 @@
 import org.eclipse.wst.xml.ui.internal.validation.StructuredTextReconcilingStrategyForMarkup;
 
 public class StructuredTextViewerConfigurationHTML extends StructuredTextViewerConfiguration {
-
-	InformationPresenter fInformationPresenter = null;
-
-	public StructuredTextViewerConfigurationHTML() {
-		super();
-	}
-
-	public StructuredTextViewerConfigurationHTML(IPreferenceStore store) {
-		super(store);
-	}
-
-
 	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.text.source.SourceViewerConfiguration#getAutoEditStrategies(org.eclipse.jface.text.source.ISourceViewer,
-	 *      java.lang.String)
+	 * One instance per configuration because not sourceviewer-specific and
+	 * it's a String array
 	 */
+	private String[] fConfiguredContentTypes;
+	/*
+	 * One instance per configuration because not sourceviewer-specific and
+	 * requires special uninstall
+	 */
+	private IContentAssistant fCorrectionAssistant;
+	/*
+	 * One instance per configuration
+	 */
+	private LineStyleProvider fLineStyleProviderForEmbeddedCSS;
+	/*
+	 * One instance per configuration
+	 */
+	private LineStyleProvider fLineStyleProviderForHTML;
+	/*
+	 * One instance per configuration
+	 */
+	private LineStyleProvider fLineStyleProviderForJavascript;
+	/*
+	 * One instance per configuration
+	 */
+	private IReconciler fReconciler;
+
 	public IAutoEditStrategy[] getAutoEditStrategies(ISourceViewer sourceViewer, String contentType) {
 		List allStrategies = new ArrayList(0);
 
@@ -102,12 +107,12 @@
 		for (int i = 0; i < superStrategies.length; i++) {
 			allStrategies.add(superStrategies[i]);
 		}
-		
+
 		if (contentType == IHTMLPartitionTypes.HTML_DEFAULT || contentType == IHTMLPartitionTypes.HTML_DECLARATION) {
 			allStrategies.add(new StructuredAutoEditStrategyXML());
 		}
-		
-		// be sure this is added last in list, so it has a change to modify 
+
+		// 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());
@@ -116,50 +121,65 @@
 	}
 
 	public String[] getConfiguredContentTypes(ISourceViewer sourceViewer) {
-		if (configuredContentTypes == null) {
+		if (fConfiguredContentTypes == null) {
 			String[] xmlTypes = StructuredTextPartitionerForXML.getConfiguredContentTypes();
 			String[] htmlTypes = StructuredTextPartitionerForHTML.getConfiguredContentTypes();
-			configuredContentTypes = new String[2 + xmlTypes.length + htmlTypes.length];
+			fConfiguredContentTypes = new String[2 + xmlTypes.length + htmlTypes.length];
 
-			configuredContentTypes[0] = IStructuredPartitionTypes.DEFAULT_PARTITION;
-			configuredContentTypes[1] = IStructuredPartitionTypes.UNKNOWN_PARTITION;
+			fConfiguredContentTypes[0] = IStructuredPartitionTypes.DEFAULT_PARTITION;
+			fConfiguredContentTypes[1] = IStructuredPartitionTypes.UNKNOWN_PARTITION;
 
 			int index = 0;
-			System.arraycopy(xmlTypes, 0, configuredContentTypes, index += 2, xmlTypes.length);
-			System.arraycopy(htmlTypes, 0, configuredContentTypes, index += xmlTypes.length, htmlTypes.length);
+			System.arraycopy(xmlTypes, 0, fConfiguredContentTypes, index += 2, xmlTypes.length);
+			System.arraycopy(htmlTypes, 0, fConfiguredContentTypes, index += xmlTypes.length, htmlTypes.length);
 		}
 
-		return configuredContentTypes;
+		return fConfiguredContentTypes;
 	}
 
+	/**
+	 * Returns the content assistant ready to be used with the given source
+	 * viewer.
+	 * 
+	 * @param sourceViewer
+	 *            the source viewer to be configured by this configuration
+	 * @return a content assistant or <code>null</code> if content assist
+	 *         should not be supported
+	 */
 	public IContentAssistant getContentAssistant(ISourceViewer sourceViewer) {
-		IContentAssistant ca = super.getContentAssistant(sourceViewer);
+		ContentAssistant assistant = (ContentAssistant) super.getContentAssistant(sourceViewer);
 
-		if (ca != null && ca instanceof ContentAssistant) {
-			ContentAssistant contentAssistant = (ContentAssistant) ca;
+		// create content assist processors to be used
+		IContentAssistProcessor htmlContentAssistProcessor = new HTMLContentAssistProcessor();
+		IContentAssistProcessor jsContentAssistProcessor = new JavaScriptContentAssistProcessor();
+		IContentAssistProcessor cssContentAssistProcessor = new CSSContentAssistProcessor();
+		IContentAssistProcessor noRegionProcessorForHTML = new NoRegionContentAssistProcessorForHTML();
 
-			IContentAssistProcessor htmlContentAssistProcessor = new HTMLContentAssistProcessor();
-			IContentAssistProcessor jsContentAssistProcessor = new JavaScriptContentAssistProcessor();
-			IContentAssistProcessor cssContentAssistProcessor = new CSSContentAssistProcessor();
-			IContentAssistProcessor noRegionProcessorForHTML = new NoRegionContentAssistProcessorForHTML();
+		// add processors to content assistant
+		// HTML
+		assistant.setContentAssistProcessor(htmlContentAssistProcessor, IHTMLPartitionTypes.HTML_DEFAULT);
+		assistant.setContentAssistProcessor(htmlContentAssistProcessor, IHTMLPartitionTypes.HTML_COMMENT);
 
-			// HTML
-			setContentAssistProcessor(contentAssistant, htmlContentAssistProcessor, IHTMLPartitionTypes.HTML_DEFAULT);
-			setContentAssistProcessor(contentAssistant, htmlContentAssistProcessor, IHTMLPartitionTypes.HTML_COMMENT);
+		// JavaScript
+		assistant.setContentAssistProcessor(jsContentAssistProcessor, IHTMLPartitionTypes.SCRIPT);
 
-			// JavaScript
-			setContentAssistProcessor(contentAssistant, jsContentAssistProcessor, IHTMLPartitionTypes.SCRIPT);
+		// CSS
+		assistant.setContentAssistProcessor(cssContentAssistProcessor, ICSSPartitionTypes.STYLE);
 
-			// CSS
-			setContentAssistProcessor(contentAssistant, cssContentAssistProcessor, ICSSPartitionTypes.STYLE);
-
-			// unknown
-			setContentAssistProcessor(contentAssistant, noRegionProcessorForHTML, IStructuredPartitionTypes.UNKNOWN_PARTITION);
-		}
-
-		return ca;
+		// unknown
+		assistant.setContentAssistProcessor(noRegionProcessorForHTML, IStructuredPartitionTypes.UNKNOWN_PARTITION);
+		return assistant;
 	}
 
+	/**
+	 * Returns the content formatter ready to be used with the given source
+	 * viewer.
+	 * 
+	 * @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) {
 		final MultiPassContentFormatter formatter = new MultiPassContentFormatter(getConfiguredDocumentPartitioning(sourceViewer), IHTMLPartitionTypes.HTML_DEFAULT);
 
@@ -169,23 +189,30 @@
 	}
 
 	public IContentAssistant getCorrectionAssistant(ISourceViewer sourceViewer) {
-		IContentAssistant ca = super.getCorrectionAssistant(sourceViewer);
+		/*
+		 * Ensure that only one assistant is ever returned. Creating a second
+		 * assistant that is added to a viewer can cause odd key-eating by the
+		 * wrong one. Also do not create correction assistant if sourceviewer
+		 * is null.
+		 */
+		if (fCorrectionAssistant == null && sourceViewer != null) {
+			ContentAssistant assistant = new ContentAssistant();
 
-		if (ca != null && ca instanceof ContentAssistant) {
-			ContentAssistant correctionAssistant = (ContentAssistant) ca;
-			ITextEditor editor = getTextEditor();
-			if (editor != null) {
-				IContentAssistProcessor correctionProcessor = new CorrectionProcessorXML(editor);
-				correctionAssistant.setContentAssistProcessor(correctionProcessor, IHTMLPartitionTypes.HTML_DEFAULT);
-				correctionAssistant.setContentAssistProcessor(correctionProcessor, IXMLPartitions.XML_CDATA);
-				correctionAssistant.setContentAssistProcessor(correctionProcessor, IXMLPartitions.XML_COMMENT);
-				correctionAssistant.setContentAssistProcessor(correctionProcessor, IXMLPartitions.XML_DECLARATION);
-				correctionAssistant.setContentAssistProcessor(correctionProcessor, IXMLPartitions.XML_PI);
-				correctionAssistant.setContentAssistProcessor(correctionProcessor, IXMLPartitions.DTD_SUBSET);
+			// content assistant configurations
+			assistant.setDocumentPartitioning(getConfiguredDocumentPartitioning(sourceViewer));
+
+			if (sourceViewer != null) {
+				IContentAssistProcessor correctionProcessor = new CorrectionProcessorXML(sourceViewer);
+				assistant.setContentAssistProcessor(correctionProcessor, IHTMLPartitionTypes.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);
 			}
+			fCorrectionAssistant = assistant;
 		}
-
-		return ca;
+		return fCorrectionAssistant;
 	}
 
 	public ITextDoubleClickStrategy getDoubleClickStrategy(ISourceViewer sourceViewer, String contentType) {
@@ -196,28 +223,6 @@
 			return super.getDoubleClickStrategy(sourceViewer, contentType);
 	}
 
-	public IHighlighter getHighlighter(ISourceViewer sourceViewer) {
-		IHighlighter highlighter = super.getHighlighter(sourceViewer);
-
-		if (highlighter != null) {
-			// HTML
-			LineStyleProvider htmlLineStyleProvider = new LineStyleProviderForHTML();
-			highlighter.addProvider(IHTMLPartitionTypes.HTML_DEFAULT, htmlLineStyleProvider);
-			highlighter.addProvider(IHTMLPartitionTypes.HTML_COMMENT, htmlLineStyleProvider);
-			highlighter.addProvider(IHTMLPartitionTypes.HTML_DECLARATION, htmlLineStyleProvider);
-
-			// JavaScript
-			LineStyleProvider jsLineStyleProvider = new LineStyleProviderForJavaScript();
-			highlighter.addProvider(IHTMLPartitionTypes.SCRIPT, jsLineStyleProvider);
-
-			// CSS
-			LineStyleProvider cssLineStyleProvider = new LineStyleProviderForEmbeddedCSS();
-			highlighter.addProvider(ICSSPartitionTypes.STYLE, cssLineStyleProvider);
-		}
-
-		return highlighter;
-	}
-
 	/*
 	 * (non-Javadoc)
 	 * 
@@ -240,116 +245,6 @@
 		return (IHyperlinkDetector[]) allDetectors.toArray(new IHyperlinkDetector[0]);
 	}
 
-	public IInformationPresenter getInformationPresenter(ISourceViewer sourceViewer) {
-		if (fInformationPresenter == null) {
-			fInformationPresenter = new InformationPresenter(getInformationPresenterControlCreator(sourceViewer));
-
-			// HTML
-			IInformationProvider htmlInformationProvider = new HTMLInformationProvider();
-			fInformationPresenter.setInformationProvider(htmlInformationProvider, IHTMLPartitionTypes.HTML_DEFAULT);
-
-			// JavaScript
-			IInformationProvider javascriptInformationProvider = new JavaScriptInformationProvider();
-			fInformationPresenter.setInformationProvider(javascriptInformationProvider, IHTMLPartitionTypes.SCRIPT);
-
-			fInformationPresenter.setSizeConstraints(60, 10, true, true);
-			fInformationPresenter.setDocumentPartitioning(getConfiguredDocumentPartitioning(sourceViewer));
-		}
-
-		return fInformationPresenter;
-	}
-
-	/**
-	 * @see org.eclipse.jface.text.source.SourceViewerConfiguration#getReconcilerg(org.eclipse.jface.text.source.ISourceViewer)
-	 */
-	public IReconciler getReconciler(ISourceViewer sourceViewer) {
-		if (fReconciler != null) {
-			// a reconciler should always either be installed or disposed of
-			if (!fReconciler.isInstalled()) {
-				fReconciler = null;
-			}
-		}
-
-		if (fReconciler == null) {
-			// create one
-			fReconciler = new StructuredRegionProcessor();
-			fReconciler.setDocumentPartitioning(getConfiguredDocumentPartitioning(sourceViewer));
-		}
-
-		boolean reconcilingEnabled = fPreferenceStore.getBoolean(CommonEditorPreferenceNames.EVALUATE_TEMPORARY_PROBLEMS);
-
-		if (!reconcilingEnabled)
-			return fReconciler;
-
-		if (fReconciler != null) {
-			IDocument doc = ((StructuredTextEditor) editorPart).getDocumentProvider().getDocument(editorPart.getEditorInput());
-			IStructuredModel sModel = StructuredModelManager.getModelManager().getExistingModelForRead(doc);
-			try {
-				if (sModel != null) {
-
-					String contentTypeId = sModel.getContentTypeIdentifier();
-
-					IReconcilingStrategy markupStrategy = new StructuredTextReconcilingStrategyForMarkup((ITextEditor) editorPart);
-
-					fReconciler.setReconcilingStrategy(markupStrategy, IStructuredPartitionTypes.DEFAULT_PARTITION);
-					fReconciler.setReconcilingStrategy(markupStrategy, IXMLPartitions.XML_DEFAULT);
-
-					fReconciler.setDefaultStrategy(markupStrategy);
-
-					if (contentTypeId != null)
-						fReconciler.setValidatorStrategy(createValidatorStrategy(contentTypeId));
-				}
-			} finally {
-				if (sModel != null)
-					sModel.releaseFromRead();
-			}
-		}
-		return fReconciler;
-	}
-
-	public ITextHover getTextHover(ISourceViewer sourceViewer, String contentType, int stateMask) {
-		ITextHover hover = null;
-		TextHoverManager.TextHoverDescriptor[] hoverDescs = getTextHovers();
-		int i = 0;
-		while (i < hoverDescs.length && hover == null) {
-			if (hoverDescs[i].isEnabled() && EditorUtility.computeStateMask(hoverDescs[i].getModifierString()) == stateMask) {
-				String hoverType = hoverDescs[i].getId();
-				if (TextHoverManager.COMBINATION_HOVER.equalsIgnoreCase(hoverType)) {
-					// check if script or html is needed
-					if (contentType == IHTMLPartitionTypes.SCRIPT) {
-						hover = new JavaScriptBestMatchHoverProcessor();
-					} else if (contentType == IHTMLPartitionTypes.HTML_DEFAULT) {
-						hover = new HTMLBestMatchHoverProcessor();
-					}
-				} else if (TextHoverManager.PROBLEM_HOVER.equalsIgnoreCase(hoverType)) {
-					hover = new ProblemAnnotationHoverProcessor();
-				} else if (TextHoverManager.ANNOTATION_HOVER.equalsIgnoreCase(hoverType)) {
-					hover = new AnnotationHoverProcessor();
-				} else if (TextHoverManager.DOCUMENTATION_HOVER.equalsIgnoreCase(hoverType)) {
-					// check if script or html is needed
-					if (contentType == IHTMLPartitionTypes.SCRIPT) {
-						hover = new JavaScriptTagInfoHoverProcessor();
-					} else if (contentType == IHTMLPartitionTypes.HTML_DEFAULT) {
-						hover = new HTMLTagInfoHoverProcessor();
-					}
-				}
-			}
-			i++;
-		}
-		if (hover == null) {
-			hover = super.getTextHover(sourceViewer, contentType, stateMask);
-		}
-		return hover;
-	}
-
-	public void unConfigure(ISourceViewer viewer) {
-		super.unConfigure(viewer);
-
-		// InformationPresenters
-		if (fInformationPresenter != null)
-			fInformationPresenter.uninstall();
-	}
-
 	public String[] getIndentPrefixes(ISourceViewer sourceViewer, String contentType) {
 		Vector vector = new Vector();
 
@@ -369,7 +264,8 @@
 
 				if (i != 0)
 					appendTab = true;
-			} else {
+			}
+			else {
 				for (int j = 0; j < i; j++)
 					prefix.append(' ');
 
@@ -391,4 +287,165 @@
 
 		return (String[]) vector.toArray(new String[vector.size()]);
 	}
+
+	/**
+	 * Returns the information control creator. The creator is a factory
+	 * creating information controls for the given source viewer.
+	 * 
+	 * @param sourceViewer
+	 *            the source viewer to be configured by this configuration
+	 * @return the information control creator or <code>null</code> if no
+	 *         information support should be installed
+	 * @since 2.0
+	 */
+	public IInformationControlCreator getInformationControlCreator(ISourceViewer sourceViewer) {
+		// used by hover help
+		return new IInformationControlCreator() {
+			public IInformationControl createInformationControl(Shell parent) {
+				return new DefaultInformationControl(parent, SWT.NONE, new HTMLTextPresenter(false));
+			}
+		};
+	}
+
+	public IInformationPresenter getInformationPresenter(ISourceViewer sourceViewer) {
+		InformationPresenter presenter = new InformationPresenter(getInformationPresenterControlCreator(sourceViewer));
+
+		// information presenter configurations
+		presenter.setSizeConstraints(60, 10, true, true);
+		presenter.setDocumentPartitioning(getConfiguredDocumentPartitioning(sourceViewer));
+
+		// information providers to be used
+		IInformationProvider htmlInformationProvider = new HTMLInformationProvider();
+		IInformationProvider javascriptInformationProvider = new JavaScriptInformationProvider();
+
+		// add information providers to information presenter
+		// HTML
+		presenter.setInformationProvider(htmlInformationProvider, IHTMLPartitionTypes.HTML_DEFAULT);
+
+		// JavaScript
+		presenter.setInformationProvider(javascriptInformationProvider, IHTMLPartitionTypes.SCRIPT);
+
+		return presenter;
+	}
+
+	/**
+	 * 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));
+			}
+		};
+	}
+
+	public LineStyleProvider[] getLineStyleProviders(ISourceViewer sourceViewer, String partitionType) {
+		LineStyleProvider[] providers = null;
+
+		if (partitionType == IHTMLPartitionTypes.HTML_DEFAULT || partitionType == IHTMLPartitionTypes.HTML_COMMENT || partitionType == IHTMLPartitionTypes.HTML_DECLARATION) {
+			providers = new LineStyleProvider[]{getLineStyleProviderForHTML()};
+		}
+		else if (partitionType == IHTMLPartitionTypes.SCRIPT) {
+			providers = new LineStyleProvider[]{getLineStyleProviderForJavascript()};
+		}
+		else if (partitionType == ICSSPartitionTypes.STYLE) {
+			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;
+	}
+
+	private LineStyleProvider getLineStyleProviderForJavascript() {
+		if (fLineStyleProviderForJavascript == null) {
+			fLineStyleProviderForJavascript = new LineStyleProviderForJavaScript();
+		}
+		return fLineStyleProviderForJavascript;
+	}
+
+	public IReconciler getReconciler(ISourceViewer sourceViewer) {
+		boolean reconcilingEnabled = fPreferenceStore.getBoolean(CommonEditorPreferenceNames.EVALUATE_TEMPORARY_PROBLEMS);
+		if (sourceViewer == null || !reconcilingEnabled)
+			return null;
+
+		/*
+		 * Only create reconciler if sourceviewer is present
+		 */
+		if (fReconciler == null && sourceViewer != null) {
+			StructuredRegionProcessor reconciler = new StructuredRegionProcessor();
+
+			// reconciler configurations
+			reconciler.setDocumentPartitioning(getConfiguredDocumentPartitioning(sourceViewer));
+
+			// reconciling strategies for reconciler
+			IReconcilingStrategy markupStrategy = new StructuredTextReconcilingStrategyForMarkup(sourceViewer);
+
+			// add reconciling strategies
+			reconciler.setReconcilingStrategy(markupStrategy, IStructuredPartitionTypes.DEFAULT_PARTITION);
+			reconciler.setReconcilingStrategy(markupStrategy, IXMLPartitions.XML_DEFAULT);
+			reconciler.setDefaultStrategy(markupStrategy);
+
+			fReconciler = reconciler;
+		}
+		return fReconciler;
+	}
+
+	public ITextHover getTextHover(ISourceViewer sourceViewer, String contentType, int stateMask) {
+		ITextHover textHover = null;
+
+		// look for appropriate text hover processor to return based on
+		// content type and state mask
+		TextHoverManager manager = SSEUIPlugin.getDefault().getTextHoverManager();
+		TextHoverManager.TextHoverDescriptor[] hoverDescs = manager.getTextHovers();
+		int i = 0;
+		while (i < hoverDescs.length && textHover == null) {
+			if (hoverDescs[i].isEnabled() && EditorUtility.computeStateMask(hoverDescs[i].getModifierString()) == stateMask) {
+				String hoverType = hoverDescs[i].getId();
+				if (TextHoverManager.COMBINATION_HOVER.equalsIgnoreCase(hoverType)) {
+					// check if script or html is needed
+					if (contentType == IHTMLPartitionTypes.SCRIPT) {
+						textHover = manager.createBestMatchHover(new JavaScriptTagInfoHoverProcessor());
+					}
+					else if (contentType == IHTMLPartitionTypes.HTML_DEFAULT) {
+						textHover = manager.createBestMatchHover(new HTMLTagInfoHoverProcessor());
+					}
+				}
+				else if (TextHoverManager.DOCUMENTATION_HOVER.equalsIgnoreCase(hoverType))
+					// check if script or html is needed
+					if (contentType == IHTMLPartitionTypes.SCRIPT) {
+						textHover = new JavaScriptTagInfoHoverProcessor();
+					}
+					else if (contentType == IHTMLPartitionTypes.HTML_DEFAULT) {
+						textHover = new HTMLTagInfoHoverProcessor();
+					}
+			}
+			i++;
+		}
+
+		// no appropriate text hovers found, try super
+		if (textHover == null) {
+			textHover = super.getTextHover(sourceViewer, contentType, stateMask);
+		}
+		return textHover;
+	}
 }
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/taginfo/HTMLBestMatchHoverProcessor.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/taginfo/HTMLBestMatchHoverProcessor.java
deleted file mode 100644
index d5516a8..0000000
--- a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/taginfo/HTMLBestMatchHoverProcessor.java
+++ /dev/null
@@ -1,31 +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
- *******************************************************************************/
-package org.eclipse.wst.html.ui.internal.taginfo;
-
-import org.eclipse.jface.text.ITextHover;
-import org.eclipse.wst.sse.ui.internal.taginfo.AbstractBestMatchHoverProcessor;
-
-/**
- * Provides the best html hover help documentation (by using other hover help processors)
- * Priority of hover help processors is:
- * ProblemHoverProcessor, HTMLTagInfoHoverProcessor, AnnotationHoverProcessor
- */
-public class HTMLBestMatchHoverProcessor extends AbstractBestMatchHoverProcessor {
-	HTMLTagInfoHoverProcessor fTagInfoHover;
-
-	protected ITextHover getTagInfoHover() {
-		if (fTagInfoHover == null) {
-			fTagInfoHover = new HTMLTagInfoHoverProcessor();
-		}
-		return fTagInfoHover;
-	}
-
-}
\ No newline at end of file
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
index 26ecebf..9c85f32 100644
--- 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
@@ -13,9 +13,11 @@
 
 
 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)
@@ -24,10 +26,10 @@
  */
 public class HTMLInformationProvider implements IInformationProvider, IInformationProviderExtension {
 
-	private HTMLBestMatchHoverProcessor fTextHover = null;
+	private ITextHover fTextHover = null;
 
 	public HTMLInformationProvider() {
-		fTextHover = new HTMLBestMatchHoverProcessor();
+		fTextHover = SSEUIPlugin.getDefault().getTextHoverManager().createBestMatchHover(new HTMLTagInfoHoverProcessor());
 	}
 
 	/* (non-Javadoc)
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
index 196b9f3..e3cace3 100644
--- 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
@@ -17,6 +17,7 @@
 
 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
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/text/SingleCharReader.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/text/SingleCharReader.java
deleted file mode 100644
index 914fde4..0000000
--- a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/text/SingleCharReader.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
- *     
- *******************************************************************************/
-package org.eclipse.wst.html.ui.internal.text;
-
-// taken from package org.eclipse.jdt.ui.text;
-
-import java.io.IOException;
-import java.io.Reader;
-
-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;
-				}
-				else {
-					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();
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.sse.ui/plugin.xml b/bundles/org.eclipse.wst.sse.ui/plugin.xml
index 55d3262..e4ba0f7 100644
--- a/bundles/org.eclipse.wst.sse.ui/plugin.xml
+++ b/bundles/org.eclipse.wst.sse.ui/plugin.xml
@@ -15,9 +15,9 @@
 		id="dropTargetTransfers"
 		name="%Drop_Target_Transfers_Extension.name" />
 	<extension-point
-		id="extendedconfiguration"
+		id="editorConfiguration"
 		name="%Extended_Editor_Configuration_Extension.name"
-		schema="schema/extendedconfiguration.exsd" />
+		schema="schema/editorconfiguration.exsd" />
 
 
 	<!-- Make sure default preference values are set at runtime -->
@@ -28,20 +28,17 @@
 
 
 	<!-- reusable extensions -->
-	<extension point="org.eclipse.wst.sse.ui.extendedconfiguration">
-		<configuration
-			type="contentoutlineconfiguration"
+	<extension point="org.eclipse.wst.sse.ui.editorConfiguration">
+		<contentOutlineConfiguration
 			class="org.eclipse.wst.sse.ui.internal.provisional.views.contentoutline.StructuredContentOutlineConfiguration"
 			target="org.eclipse.wst.sse.ui.internal.StructuredTextEditor" />
-		<configuration
-			type="propertysheetconfiguration"
+		<propertySheetConfiguration
 			class="org.eclipse.wst.sse.ui.internal.provisional.views.properties.StructuredPropertySheetConfiguration"
 			target="org.eclipse.wst.sse.ui.internal.StructuredTextEditor" />
-		<configuration
-			type="textviewerconfiguration"
+		<sourceViewerConfiguration
 			class="org.eclipse.wst.sse.ui.internal.provisional.StructuredTextViewerConfiguration"
 			target="org.eclipse.wst.sse.ui.internal.StructuredTextEditor" />
-		<definition
+		<provisionalDefinition
 			type="preferencepages"
 			value="org.eclipse.wst.sse.ui.preferences.editor"
 			target="org.eclipse.wst.sse.ui.internal.StructuredTextEditor" />
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..c6906cf
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/schema/editorconfiguration.exsd
@@ -0,0 +1,258 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.wst.sse.ui">
+<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">
+      <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="provisionalConfiguration" minOccurs="0" maxOccurs="unbounded"/>
+            <element ref="provisionalDefinition" 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>
+            </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"/>
+               </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"/>
+               </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"/>
+               </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).
+&lt;br /&gt;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).
+&lt;br /&gt;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">
+            <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>
+
+   <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="implementation"/>
+      </appInfo>
+      <documentation>
+         
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="copyright"/>
+      </appInfo>
+      <documentation>
+         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 &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/extendedconfiguration.exsd b/bundles/org.eclipse.wst.sse.ui/schema/extendedconfiguration.exsd
deleted file mode 100644
index 74516f5..0000000
--- a/bundles/org.eclipse.wst.sse.ui/schema/extendedconfiguration.exsd
+++ /dev/null
@@ -1,196 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>

-<!-- Schema file written by PDE -->

-<schema targetNamespace="org.eclipse.wst.sse.ui">

-<annotation>

-      <appInfo>

-         <meta.schema plugin="org.eclipse.wst.sse.ui" id="extendedconfiguration" name="Extended 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 should not be considered API as it still requires further review.

-      </documentation>

-   </annotation>

-

-   <element name="extension">

-      <complexType>

-         <all>

-            <element ref="configuration"/>

-            <element ref="definition"/>

-         </all>

-         <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>

-            </annotation>

-         </attribute>

-      </complexType>

-   </element>

-

-   <element name="configuration">

-      <annotation>

-         <documentation>

-            Declares a class fulfilling the requirements of a type to be used for the given target(s).

-         </documentation>

-      </annotation>

-      <complexType>

-         <attribute name="target" type="string" use="required">

-            <annotation>

-               <documentation>

-                  A string defining when to use this extension, usually 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.  Current types used include &quot;textviewerconfiguration&quot;, &quot;contentoutlineconfiguration&quot;, &quot;propertysheetconfiguration&quot;, and &quot;characterpairmatcher&quot;.

-               </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="definition">

-      <annotation>

-         <documentation>

-            Defines a value for a type to be used for the given target(s).

-         </documentation>

-      </annotation>

-      <complexType>

-         <attribute name="type" type="string" use="required">

-            <annotation>

-               <documentation>

-                  The type of definition to find.  Currently used definitions include &quot;showintarget&quot;, a list of View IDs to show in the Navigate menu&apos;s Show In... submenu, and &quot;preferencepages&quot;, the list of fully qualified Preference page IDs to show for the editor&apos;s Preferences action. (NOTE: preferencepages is an unsupported definition)

-               </documentation>

-            </annotation>

-         </attribute>

-         <attribute name="value" type="string">

-            <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, usually an Editor or Content Type ID.  Multiple targets may be given as a comma delimited value.

-               </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;pre&gt;
-&lt;extension point=&quot;org.eclipse.wst.sse.ui.extendedconfiguration&quot;&gt;
-&lt;!-- associating a SourceViewerConfiguration to an input&apos;s Content Type--&gt;
-     &lt;configuration
-          type=&quot;textviewerconfiguration&quot;
-          class=&quot;org.eclipse.wst.html.ui.StructuredTextViewerConfigurationHTML&quot;
-          target=&quot;org.eclipse.wst.html.core.htmlsource&quot;/&gt;
-
-&lt;!-- associating a ContentOutlineConfiguration for multiple editor IDs --&gt;
-     &lt;configuration
-          type=&quot;contentoutlineconfiguration&quot;
-          class=&quot;org.eclipse.wst.sse.xml.ui.views.contentoutline.XMLContentOutlineConfiguration&quot;
-          target=&quot;org.eclipse.wst.xml.ui.StructuredTextEditorXML, org.eclipse.wst.xml.ui.XMLMultiPageEditorPart&quot;/&gt;
-
-&lt;!-- associating a PropertySheetConfiguration to multiple Content Types --&gt;
-     &lt;configuration
-          type=&quot;propertysheetconfiguration&quot;
-          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;!-- add a view to the Navigate/Show In menu --&gt;
-     &lt;definition
-          type=&quot;showintarget&quot;
-          value=&quot;org.eclipse.wst.navigator.ui.WTPCommonNavigator&quot;
-          target=&quot;org.eclipse.wst.sse.ui.StructuredTextEditor&quot;/&gt;
-&lt;/extension&gt;
-&lt;/pre&gt;

-      </documentation>

-   </annotation>

-

-   <annotation>

-      <appInfo>

-         <meta.section type="apiInfo"/>

-      </appInfo>

-      <documentation>

-         

-      </documentation>

-   </annotation>

-

-   <annotation>

-      <appInfo>

-         <meta.section type="implementation"/>

-      </appInfo>

-      <documentation>

-         &lt;br&gt;
-&lt;code&gt;org.eclipse.wst.sse.ui.extension.ExtendedConfigurationBuilder&lt;/code&gt; is responsible for creating the extension objects as requested.  New instances are returned for each request that succeeds.  Invalid function names and targets will return null.  The &lt;code&gt;StructuredTextEditor&lt;/code&gt; will automatically try targets generated by &lt;code&gt;org.eclipse.wst.sse.ui.extensions.ConfigurationPointCalculator&lt;/code&gt; according to where the &lt;code&gt;StructuredTextEditor&lt;/code&gt; finds itself at runtime.  &lt;code&gt;ConfigurationPointCalculator&lt;/code&gt; ensures that the targets are always searched in a specific and predictable order.  The following table lists the functionalities (types) currenty in use:
-&lt;p&gt;
-&lt;table border=&quot;1&quot;&gt;
-&lt;tbody  valign=&quot;top&quot;&gt;
-&lt;tr&gt;&lt;td&gt;&lt;b&gt;Functionality (type)&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;b&gt;Implementation requirement&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;b&gt;Responsibilities&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
-&lt;tr&gt;&lt;td&gt;textviewerconfiguration&lt;/td&gt;&lt;td&gt;Must subclass &lt;code&gt;org.eclipse.wst.sse.ui.StructuredTextViewerConfiguration&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Defines the source viewer configuration to use, affecting Highlighting, Formatting, Content Assist, Hover help, and more.&lt;/td&gt;&lt;/tr&gt;
-&lt;tr&gt;&lt;td&gt;contentoutlineconfiguration&lt;/td&gt;&lt;td&gt;Must subclass &lt;code&gt;org.eclipse.wst.sse.ui.views.contentoutline.ContentOutlineConfiguration&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Defines how the IStructuredModel for the editor&apos;s input maps to elements with a Tree control, as well as selection filtering, toolbar and menu contributions, etc.&lt;/td&gt;&lt;/tr&gt;
-&lt;tr&gt;&lt;td&gt;propertysheetconfiguration&lt;/td&gt;&lt;td&gt;Must subclass &lt;code&gt;org.eclipse.wst.sse.ui.views.properties.PropertySheetConfiguration&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Defines the Property Source Provider, toolbar contributions, etc.&lt;/td&gt;&lt;/tr&gt;
-&lt;tr&gt;&lt;td&gt;sourceeditingtexttools&lt;/td&gt;&lt;td&gt;Must implement &lt;code&gt;org.eclipse.wst.sse.ui.extensions.breakpoint.SourceEditingTextTools&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Provides DOM to text and positional mapping information for use when setting and clearing breakpoints.&lt;/td&gt;&lt;/tr&gt;
-&lt;tr&gt;&lt;td&gt;spellchecktarget&lt;/td&gt;&lt;td&gt;Must implement &lt;code&gt;org.eclipse.wst.sse.ui.extensions.spellcheck.SpellCheckTarget&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Provides targetting information for the IBM eTools Spell Checker&lt;/td&gt;&lt;/tr&gt;
-&lt;tr&gt;&lt;td&gt;showintarget&lt;/td&gt;&lt;td&gt;Must supply a valid &lt;code&gt;org.eclipse.ui.part.IShowInTarget&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Provides targetting information ShowIn actions in the Navigate menu&lt;/td&gt;&lt;/tr&gt;
-&lt;tr&gt;&lt;td&gt;characterpairmatcher&lt;/td&gt;&lt;td&gt;Must implement &lt;code&gt;org.eclipse.jface.text.source.ICharacterPairMatcher&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Will be used as the &quot;bracket&quot; matcher.&lt;/td&gt;&lt;/tr&gt;
-
-
-
-&lt;/tbody&gt;
-&lt;/table&gt;&lt;/p&gt;

-      </documentation>

-   </annotation>

-

-   <annotation>

-      <appInfo>

-         <meta.section type="copyright"/>

-      </appInfo>

-      <documentation>

-         

-      </documentation>

-   </annotation>

-

-</schema>

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
index cd1f38a..fc2dc98 100644
--- 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
@@ -31,9 +31,8 @@
  * plugin.xml section:
  * 
  * &lt;extension
- * point=&quot;org.eclipse.wst.sse.ui.extendedconfiguration&quot;&gt;configuration
- * type=&quot;contentoutlineconfiguration&quot;
- * target=&quot;org.eclipse.wst.sse.ui.dtd.StructuredTextEditorDTD&quot;
+ * 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;
  * 
@@ -42,14 +41,30 @@
  * 
  */
 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$
+
 	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 = "configuration"; //$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 = "definition"; //$NON-NLS-1$
-	private static final String EP_EXTENDEDCONFIGURATION = "extendedconfiguration"; //$NON-NLS-1$
+	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$
 
@@ -91,9 +106,6 @@
 				}
 			});
 		}
-		if (result[0] != null && result[0] instanceof IExtendedConfiguration) {
-			((IExtendedConfiguration) result[0]).setDeclaringID(targetID);
-		}
 		return result[0];
 	}
 
@@ -118,7 +130,7 @@
 			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])) {
+					if (targetID.equals(targets[j].trim())) {
 						Object o = createExtension(element, ATT_CLASS, targetID);
 						if (o != null) {
 							result.add(o);
@@ -136,8 +148,13 @@
 		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)))) && element.getAttribute(ATT_TARGET).equals(targetID)) {
-				result.add(element);
+			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]);
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/IExtendedConfiguration.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/IExtendedConfiguration.java
deleted file mode 100644
index 8092b63..0000000
--- a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/IExtendedConfiguration.java
+++ /dev/null
@@ -1,17 +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.ui.internal;
-
-public interface IExtendedConfiguration {
-	void setDeclaringID(String targetID);
-}
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
index f95b559..ad15ec8 100644
--- 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
@@ -39,7 +39,7 @@
 import org.eclipse.ui.texteditor.MarkerAnnotation;
 import org.eclipse.wst.sse.core.internal.util.StringUtils;
 
-public class StructuredTextAnnotationHover implements IAnnotationHover, IReleasable {
+public class StructuredTextAnnotationHover implements IAnnotationHover {
 
 	/**
 	 * Provides a set of convenience methods for creating HTML pages. Taken
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/StructuredTextEditor.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/StructuredTextEditor.java
index 5592780..134c709 100644
--- a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/StructuredTextEditor.java
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/StructuredTextEditor.java
@@ -22,7 +22,6 @@
 import java.util.TimerTask;
 
 import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
 import org.eclipse.core.resources.IStorage;
 import org.eclipse.core.resources.ResourcesPlugin;
 import org.eclipse.core.runtime.CoreException;
@@ -256,10 +255,6 @@
 			if (getTextViewer() != null) {
 				// getTextViewer().setRedraw(false);
 				getTextViewer().unconfigure();
-				SourceViewerConfiguration config = getSourceViewerConfiguration();
-				if (config instanceof StructuredTextViewerConfiguration) {
-					((StructuredTextViewerConfiguration) config).unConfigure(getSourceViewer());
-				}
 			}
 		}
 
@@ -292,9 +287,6 @@
 			try {
 				if (getSourceViewer() != null) {
 					SourceViewerConfiguration cfg = getSourceViewerConfiguration();
-					if (cfg != null && cfg instanceof StructuredTextViewerConfiguration) {
-						initializeSourceViewerConfiguration(((StructuredTextViewerConfiguration) cfg));
-					}
 					getSourceViewer().configure(cfg);
 				}
 			}
@@ -426,7 +418,24 @@
 				}
 			});
 		}
+	}
 
+	private class ConfigurationAndTarget {
+		private String fTargetId;
+		private StructuredTextViewerConfiguration fViewerConfig;
+
+		public ConfigurationAndTarget(String targetId, StructuredTextViewerConfiguration config) {
+			fTargetId = targetId;
+			fViewerConfig = config;
+		}
+
+		public String getTargetId() {
+			return fTargetId;
+		}
+
+		public StructuredTextViewerConfiguration getViewerConfiguration() {
+			return fViewerConfig;
+		}
 	}
 
 	protected final static char[] BRACKETS = {'{', '}', '(', ')', '[', ']'};
@@ -499,6 +508,7 @@
 	private Menu fRulerContextMenu;
 	/** The ruler context menu manager to be disposed. */
 	private MenuManager fRulerContextMenuManager;
+	private String fViewerConfigurationTargetId;
 
 	private boolean fUpdateMenuTextPending;
 	int hoverX = -1;
@@ -721,8 +731,12 @@
 			// 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$
-			// add bookmark action is already registered in AbstractDecoratedTextEditor, so just get it
+			// setAction(ITextEditorActionConstants.RULER_DOUBLE_CLICK, new
+			// MarkerRulerAction(SSEUIMessages.getResourceBundle(),
+			// "Editor_ManageBookmarks_", this, getVerticalRuler(),
+			// IMarker.BOOKMARK, true)); //$NON-NLS-1$
+			// add bookmark action is already registered in
+			// AbstractDecoratedTextEditor, so just get it
 			setAction(ITextEditorActionConstants.RULER_DOUBLE_CLICK, getAction(IDEActionFactory.BOOKMARK.getId()));
 		}
 	}
@@ -904,7 +918,7 @@
 		ExtendedConfigurationBuilder builder = ExtendedConfigurationBuilder.getInstance();
 		String[] ids = getConfigurationPoints();
 		for (int i = 0; cfg == null && i < ids.length; i++) {
-			cfg = (ContentOutlineConfiguration) builder.getConfiguration(ContentOutlineConfiguration.ID, ids[i]);
+			cfg = (ContentOutlineConfiguration) builder.getConfiguration(ExtendedConfigurationBuilder.CONTENTOUTLINECONFIGURATION, ids[i]);
 		}
 		return cfg;
 	}
@@ -921,7 +935,9 @@
 	 */
 	public void createPartControl(Composite parent) {
 		if (getSourceViewerConfiguration() == null) {
-			StructuredTextViewerConfiguration newViewerConfiguration = createSourceViewerConfiguration();
+			ConfigurationAndTarget cat = createSourceViewerConfiguration();
+			fViewerConfigurationTargetId = cat.getTargetId();
+			StructuredTextViewerConfiguration newViewerConfiguration = cat.getViewerConfiguration();
 			setSourceViewerConfiguration(newViewerConfiguration);
 		}
 
@@ -945,7 +961,7 @@
 		ExtendedConfigurationBuilder builder = ExtendedConfigurationBuilder.getInstance();
 		String[] ids = getConfigurationPoints();
 		for (int i = 0; cfg == null && i < ids.length; i++) {
-			cfg = (PropertySheetConfiguration) builder.getConfiguration(PropertySheetConfiguration.ID, ids[i]);
+			cfg = (PropertySheetConfiguration) builder.getConfiguration(ExtendedConfigurationBuilder.PROPERTYSHEETCONFIGURATION, ids[i]);
 		}
 		return cfg;
 	}
@@ -1032,19 +1048,21 @@
 		return sourceViewer;
 	}
 
-	private StructuredTextViewerConfiguration createSourceViewerConfiguration() {
+	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(StructuredTextViewerConfiguration.ID, ids[i]);
+			cfg = (StructuredTextViewerConfiguration) builder.getConfiguration(ExtendedConfigurationBuilder.SOURCEVIEWERCONFIGURATION, ids[i]);
+			cat = new ConfigurationAndTarget(ids[i], cfg);
 		}
 		if (cfg == null) {
 			cfg = new StructuredTextViewerConfiguration();
-			cfg.setDeclaringID(getClass().getName() + "#default"); //$NON-NLS-1$
+			String targetid = getClass().getName() + "#default"; //$NON-NLS-1$
+			cat = new ConfigurationAndTarget(targetid, cfg);
 		}
-		initializeSourceViewerConfiguration(cfg);
-		return cfg;
+		return cat;
 	}
 
 	protected StructuredTextViewer createStructedTextViewer(Composite parent, IVerticalRuler verticalRuler, int styles) {
@@ -1126,12 +1144,6 @@
 
 		fEditorDisposed = true;
 		disposeModelDependentFields();
-		// some things in the configuration need to clean
-		// up after themselves
-		SourceViewerConfiguration config = getSourceViewerConfiguration();
-		if (config instanceof StructuredTextViewerConfiguration) {
-			((StructuredTextViewerConfiguration) config).unConfigure(getSourceViewer());
-		}
 
 		if (fDropTarget != null)
 			fDropTarget.dispose();
@@ -1158,7 +1170,7 @@
 	protected void disposeDocumentProvider() {
 		if (fStructuredModel != null && !fisReleased && !(getDocumentProvider() instanceof IModelProvider)) {
 			fStructuredModel.releaseFromEdit();
-			fisReleased=true;
+			fisReleased = true;
 		}
 		super.disposeDocumentProvider();
 	}
@@ -1893,24 +1905,6 @@
 		}
 	}
 
-	/**
-	 * Performs any necessary setup for a new or unconfigured
-	 * StructuredTextViewerConfiguration
-	 * 
-	 * @param configuration
-	 */
-	void initializeSourceViewerConfiguration(StructuredTextViewerConfiguration configuration) {
-		configuration.setEditorPart(this);
-		configuration.setPreferenceStore(getPreferenceStore());
-
-		IResource resource = null;
-		IFile file = (IFile) getEditorInput().getAdapter(IFile.class);
-		if (file != null) {
-			resource = file.getProject();
-		}
-		configuration.configureOn(resource);
-	}
-
 	protected void initSourceViewer(StructuredTextViewer sourceViewer) {
 		// ensure decoration support is configured
 		getSourceViewerDecorationSupport(sourceViewer);
@@ -2419,33 +2413,35 @@
 		if (configuration == null) {
 			return;
 		}
+		// do not configure source viewer configuration twice
+		boolean configured = false;
 
 		// structuredtextviewer only works with
 		// structuredtextviewerconfiguration
 		if (!(configuration instanceof StructuredTextViewerConfiguration)) {
-			configuration = createSourceViewerConfiguration();
+			ConfigurationAndTarget cat = createSourceViewerConfiguration();
+			fViewerConfigurationTargetId = cat.getTargetId();
+			configuration = cat.getViewerConfiguration();
 			setSourceViewerConfiguration(configuration);
+			configured = true;
 		}
 		else {
-			StructuredTextViewerConfiguration newViewerConfiguration = createSourceViewerConfiguration();
-			if (!((StructuredTextViewerConfiguration) configuration).getDeclaringID().equals(newViewerConfiguration.getDeclaringID())) {
+			ConfigurationAndTarget cat = createSourceViewerConfiguration();
+			StructuredTextViewerConfiguration newViewerConfiguration = cat.getViewerConfiguration();
+			if (!(cat.getTargetId().equals(fViewerConfigurationTargetId))) {
 				// d282894 use newViewerConfiguration
+				fViewerConfigurationTargetId = cat.getTargetId();
 				configuration = newViewerConfiguration;
 				setSourceViewerConfiguration(configuration);
-			}
-
-			// update the configuration's resource
-			IResource resource = null;
-			if (getEditorInput() instanceof IFileEditorInput) {
-				resource = ((IFileEditorInput) getEditorInput()).getFile();
-				if (resource.getType() != IResource.PROJECT)
-					resource = resource.getProject();
-				((StructuredTextViewerConfiguration) configuration).configureOn(resource);
+				configured = true;
 			}
 		}
 
 		if (getSourceViewer() != null) {
-			getSourceViewer().configure(configuration);
+			// not sure if really need to reconfigure when input changes
+			// (maybe only need to reset viewerconfig's document)
+			if (!configured)
+				getSourceViewer().configure(configuration);
 			IAction contentAssistAction = getAction(StructuredTextEditorActionConstants.ACTION_NAME_CONTENTASSIST_PROPOSALS);
 			if (contentAssistAction instanceof IUpdate) {
 				((IUpdate) contentAssistAction).update();
@@ -2455,37 +2451,6 @@
 				((OpenHyperlinkAction) openHyperlinkAction).setHyperlinkDetectors(getSourceViewerConfiguration().getHyperlinkDetectors(getSourceViewer()));
 			}
 		}
-		// eventually will replace above with something
-		// like what follows
-		// it, but some of our "processors" require too
-		// much initialization
-		// during configuration.
-		// SourceViewerConfiguration configuration =
-		// getSourceViewerConfiguration();
-		//
-		// // should always be an instance of our special
-		// configuration, but
-		// just in case
-		// // not, we'll do nothing if it isn't.
-		// if (configuration!= null && configuration
-		// instanceof
-		// StructuredTextViewerConfiguration) {
-		//
-		// IResource resource = null;
-		// if (getEditorInput() instanceof
-		// IFileEditorInput) {
-		// resource = ((IFileEditorInput)
-		// getEditorInput()).getFile();
-		// if (resource.getType() != IResource.PROJECT)
-		// resource = resource.getProject();
-		// // note: configureOn is responsible for updating
-		// what ever
-		// // in our configuration is sensitive to resource
-		// ((StructuredTextViewerConfiguration)
-		// configuration).configureOn(resource);
-		// }
-		//
-		// }
 	}
 
 	protected void updateStatusField(String category) {
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
index 61ca49f..73a75e9 100644
--- 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
@@ -64,7 +64,8 @@
 import org.eclipse.wst.sse.core.internal.undo.IStructuredTextUndoManager;
 import org.eclipse.wst.sse.core.internal.undo.UndoDocumentEvent;
 import org.eclipse.wst.sse.ui.internal.provisional.StructuredTextViewerConfiguration;
-import org.eclipse.wst.sse.ui.internal.provisional.style.IHighlighter;
+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.reconcile.StructuredRegionProcessor;
 import org.eclipse.wst.sse.ui.internal.util.PlatformStatusLineUtil;
 import org.eclipse.wst.sse.ui.internal.view.events.INodeSelectionListener;
@@ -148,7 +149,7 @@
 	 */
 	/** The most recent widget modification as document command */
 	private StructuredDocumentCommand fDocumentCommand = new StructuredDocumentCommand();
-	private IHighlighter fHighlighter;
+	private Highlighter fHighlighter;
 	// TODO: never read locally
 	boolean fRememberedStateContentAssistInstalled;
 
@@ -227,12 +228,10 @@
 
 		setDocumentPartitioning(configuration.getConfiguredDocumentPartitioning(this));
 
-		if (configuration instanceof StructuredTextViewerConfiguration) {
-			if (fHighlighter != null) {
-				fHighlighter.uninstall();
-			}
-			fHighlighter = ((StructuredTextViewerConfiguration) configuration).getHighlighter(this);
-			fHighlighter.install(this);
+		// always uninstall highlighter and null it out on new configuration
+		if (fHighlighter != null) {
+			fHighlighter.uninstall();
+			fHighlighter = null;
 		}
 
 		// install content type independent plugins
@@ -304,16 +303,20 @@
 			fUndoManager.disconnect();
 		}
 		setUndoManager(configuration.getUndoManager(this));
-
-		// TODO: compare with ?new? V2 configure re:
-		// getTextWidget().setTabs(configuration.getTabWidth(this));
-		// see if it can replace following
-		// Set tab width to configuration setting first.
-		// Then override if model type is XML or HTML.
-		getTextWidget().setTabs(configuration.getTabWidth(this));
+		
+		// release old annotation hover before setting new one
+		if (fAnnotationHover instanceof StructuredTextAnnotationHover) {
+			((StructuredTextAnnotationHover)fAnnotationHover).release();
+		}
 		setAnnotationHover(configuration.getAnnotationHover(this));
-		setOverviewRulerAnnotationHover(configuration.getOverviewRulerAnnotationHover(this));
-		// added for V2
+		
+		// release old annotation hover before setting new one
+		if (fOverviewRulerAnnotationHover instanceof StructuredTextAnnotationHover) {
+			((StructuredTextAnnotationHover)fOverviewRulerAnnotationHover).release();
+		}
+		setOverviewRulerAnnotationHover(configuration.getAnnotationHover(this));
+
+		getTextWidget().setTabs(configuration.getTabWidth(this));
 		setHoverControlCreator(configuration.getInformationControlCreator(this));
 
 		// if hyperlink manager has already been created, uninstall it
@@ -352,7 +355,29 @@
 			prefixes = configuration.getDefaultPrefixes(this, t);
 			if (prefixes != null && prefixes.length > 0)
 				setDefaultPrefixes(prefixes, t);
+
+			// add highlighter/linestyleprovider
+			if (configuration instanceof StructuredTextViewerConfiguration) {
+				LineStyleProvider[] providers = ((StructuredTextViewerConfiguration) configuration).getLineStyleProviders(this, t);
+				if (providers != null) {
+					for (int j = 0; j < providers.length; ++j) {
+						// delay creation of highlighter till
+						// linestyleprovider needs to be added
+						if (fHighlighter == null)
+							fHighlighter = new Highlighter();
+						fHighlighter.addProvider(t, providers[j]);
+					}
+				}
+			}
 		}
+
+		// initialize highlighter after linestyleproviders were added
+		if (fHighlighter != null) {
+			fHighlighter.setDocumentPartitioning(configuration.getConfiguredDocumentPartitioning(this));
+			fHighlighter.install(this);
+			fHighlighter.setDocument((IStructuredDocument) getDocument());
+		}
+
 		activatePlugins();
 
 		fConfiguration = configuration;
@@ -691,7 +716,7 @@
 			// only one node can be double-clicked at a time
 			// so, we get the first one
 			Object o = selectedNodes.get(0);
-			if(o instanceof IndexedRegion) {
+			if (o instanceof IndexedRegion) {
 				doubleClickedNode = (IndexedRegion) o;
 				selectionStart = doubleClickedNode.getStartOffset();
 				selectionEnd = doubleClickedNode.getEndOffset();
@@ -1074,6 +1099,17 @@
 		if (fHighlighter != null) {
 			fHighlighter.uninstall();
 		}
+		if (fCorrectionAssistant != null) {
+			fCorrectionAssistant.uninstall();
+		}
+		
+		if (fAnnotationHover instanceof StructuredTextAnnotationHover) {
+			((StructuredTextAnnotationHover)fAnnotationHover).release();
+		}
+
+		if (fOverviewRulerAnnotationHover instanceof StructuredTextAnnotationHover) {
+			((StructuredTextAnnotationHover)fOverviewRulerAnnotationHover).release();
+		}
 
 		// doesn't seem to be handled elsewhere, so we'll be sure error
 		// messages's are cleared.
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..cdf838d
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/contentassist/CompoundContentAssistProcessor.java
@@ -0,0 +1,401 @@
+/*
+ * Copyright (c) 2005 IBM Corporation and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ * 
+ * Contributors:
+ *   IBM - 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.jface.contentassist.IContentAssistSubjectControl;
+import org.eclipse.jface.contentassist.ISubjectControlContentAssistProcessor;
+import org.eclipse.jface.contentassist.ISubjectControlContextInformationValidator;
+import org.eclipse.jface.text.Assert;
+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.swt.graphics.Image;
+import org.eclipse.wst.sse.ui.internal.IReleasable;
+
+/**
+ * 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.
+ */
+class CompoundContentAssistProcessor implements IContentAssistProcessor, ISubjectControlContentAssistProcessor {
+
+	private static class WrappedContextInformation implements IContextInformation {
+		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;
+		}
+	}
+
+	private static class CompoundContentAssistValidator implements IContextInformationValidator {
+		private List fValidators = new ArrayList();
+
+		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) {
+			IContextInformationValidator validator = getValidator(info);
+			if (validator != null)
+				validator.install(info, viewer, documentPosition);
+		}
+
+		IContextInformationValidator getValidator(IContextInformation info) {
+			if (info instanceof WrappedContextInformation) {
+				WrappedContextInformation wrap = (WrappedContextInformation) info;
+				return wrap.getProcessor().getContextInformationValidator();
+			}
+
+			return null;
+		}
+
+		/*
+		 * @see org.eclipse.jface.text.contentassist.IContextInformationValidator#isContextInformationValid(int)
+		 */
+		public boolean isContextInformationValid(int documentPosition) {
+			boolean isValid = false;
+			for (Iterator it = fValidators.iterator(); it.hasNext();) {
+				IContextInformationValidator v = (IContextInformationValidator) it.next();
+				isValid |= v.isContextInformationValid(documentPosition);
+			}
+			return isValid;
+		}
+
+	}
+
+	private static class CompoundContentAssistValidatorEx extends CompoundContentAssistValidator implements ISubjectControlContextInformationValidator {
+
+		/*
+		 * @see ISubjectControlContextInformationValidator#install(IContextInformation,
+		 *      IContentAssistSubjectControl, int)
+		 */
+		public void install(IContextInformation info, IContentAssistSubjectControl contentAssistSubjectControl, int documentPosition) {
+			IContextInformationValidator validator = getValidator(info);
+			if (validator instanceof ISubjectControlContextInformationValidator)
+				((ISubjectControlContextInformationValidator) validator).install(info, contentAssistSubjectControl, documentPosition);
+		}
+
+	}
+
+	private final Set fProcessors = new LinkedHashSet();
+
+	/**
+	 * 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);
+	}
+
+	/**
+	 * 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) {
+		List ret = new LinkedList();
+		for (Iterator it = fProcessors.iterator(); it.hasNext();) {
+			IContentAssistProcessor p = (IContentAssistProcessor) it.next();
+			ICompletionProposal[] proposals = p.computeCompletionProposals(viewer, documentOffset);
+			if (proposals != null)
+				ret.addAll(Arrays.asList(proposals));
+		}
+		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) {
+		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)
+				for (int i = 0; i < informations.length; i++)
+					ret.add(new WrappedContextInformation(informations[i], p));
+		}
+		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 first non- <code>null</code> error message of any
+	 * contained processor, or <code>null</code> if no processor has an
+	 * error message.
+	 * 
+	 * @see org.eclipse.jface.text.contentassist.IContentAssistProcessor#getErrorMessage()
+	 * @return {@inheritDoc}
+	 */
+	public String getErrorMessage() {
+		for (Iterator it = fProcessors.iterator(); it.hasNext();) {
+			IContentAssistProcessor p = (IContentAssistProcessor) it.next();
+			String err = p.getErrorMessage();
+			if (err != null)
+				return err;
+		}
+		return null;
+	}
+
+	/**
+	 * {@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 hasExtension = false;
+		for (Iterator it = fProcessors.iterator(); it.hasNext();) {
+			IContentAssistProcessor p = (IContentAssistProcessor) it.next();
+			IContextInformationValidator v = p.getContextInformationValidator();
+			if (v instanceof ISubjectControlContextInformationValidator) {
+				hasExtension = true;
+				break;
+			}
+			else if (v != null) {
+				hasValidator = true;
+			}
+		}
+
+		CompoundContentAssistValidator validator = null;
+		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) {
+		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)
+					ret.addAll(Arrays.asList(proposals));
+			}
+		}
+
+		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) {
+		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)
+					for (int i = 0; i < informations.length; i++)
+						ret.add(new WrappedContextInformation(informations[i], p));
+			}
+		}
+		return (IContextInformation[]) ret.toArray(new IContextInformation[ret.size()]);
+	}
+
+	/**
+	 * Dispose of any content assist processors that need disposing
+	 */
+	public void dispose() {
+		// 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();
+			}
+		}
+		fProcessors.clear();
+	}
+}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/contentassist/IResourceDependentProcessor.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/contentassist/IResourceDependentProcessor.java
deleted file mode 100644
index 8e3e212..0000000
--- a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/contentassist/IResourceDependentProcessor.java
+++ /dev/null
@@ -1,25 +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.ui.internal.contentassist;
-
-import org.eclipse.core.resources.IResource;
-
-/**
- * Interface for classes that require an IResource to operate properly (eg.
- * some ContentAssistProcessors)
- * 
- * @author pavery
- */
-public interface IResourceDependentProcessor {
-	void initialize(IResource resource);
-}
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..29fffdb
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/contentassist/StructuredContentAssistant.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 Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ * 
+ * Contributors:
+ *   IBM - Initial API and implementation
+ * 
+ */
+package org.eclipse.wst.sse.ui.internal.contentassist;
+
+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.text.contentassist.ContentAssistant;
+import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
+import org.eclipse.wst.sse.ui.internal.ExtendedConfigurationBuilder;
+
+public class StructuredContentAssistant extends ContentAssistant {
+	private static final String CONTENT_ASSIST_PROCESSOR_EXTENDED_ID = "contentassistprocessor"; //$NON-NLS-1$
+
+	/**
+	 * personal list of content assist processors
+	 */
+	private Map fProcessors;
+	/**
+	 * list of partition types where extended processors have been installed
+	 */
+	private List fInstalledExtendedContentTypes;
+
+	/**
+	 * Each set content assist processor is placed inside a
+	 * CompoundContentAssistProcessor which allows multiple processors per
+	 * partition type
+	 * 
+	 * @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
+	 */
+	public void setContentAssistProcessor(IContentAssistProcessor processor, String partitionType) {
+		if (fProcessors == null)
+			fProcessors = new HashMap();
+
+		CompoundContentAssistProcessor compoundProcessor = (CompoundContentAssistProcessor) getContentAssistProcessor(partitionType);
+
+		// if processor is null, you want to remove all processors of
+		// contentType
+		if (processor == null && compoundProcessor != null) {
+			compoundProcessor.dispose();
+			fProcessors.remove(partitionType);
+			compoundProcessor = null;
+		}
+		if (processor != null) {
+			// create a new compoundprocess if there already isnt one
+			if (compoundProcessor == null) {
+				compoundProcessor = new CompoundContentAssistProcessor();
+			}
+			// add processor to compound processor
+			compoundProcessor.add(processor);
+			// add compound procesor to processors list (will replace old one,
+			// even if same instance)
+			fProcessors.put(partitionType, compoundProcessor);
+		}
+		super.setContentAssistProcessor(compoundProcessor, partitionType);
+	}
+
+	/**
+	 * Returns the content assist processor to be used for the given content
+	 * type. Also installs any content assist processors that were added by
+	 * extension point.
+	 * 
+	 * @param contentType
+	 *            the type of the content for which this content assistant is
+	 *            to be requested
+	 * @return an instance content assist processor or <code>null</code> if
+	 *         none exists for the specified content type
+	 */
+	public IContentAssistProcessor getContentAssistProcessor(String partitionType) {
+		if (fInstalledExtendedContentTypes == null || !fInstalledExtendedContentTypes.contains(partitionType)) {
+			// get extended content assist processors that have not already
+			// been set
+			List processors = ExtendedConfigurationBuilder.getInstance().getConfigurations(CONTENT_ASSIST_PROCESSOR_EXTENDED_ID, partitionType);
+			if (processors != null && !processors.isEmpty()) {
+				Iterator iter = processors.iterator();
+				while (iter.hasNext()) {
+					IContentAssistProcessor processor = (IContentAssistProcessor) iter.next();
+					setContentAssistProcessor(processor, partitionType);
+				}
+				// add partition type to list of extended partition types
+				// installed
+				if (fInstalledExtendedContentTypes == null)
+					fInstalledExtendedContentTypes = new ArrayList();
+				fInstalledExtendedContentTypes.add(partitionType);
+			}
+		}
+
+		IContentAssistProcessor processor = super.getContentAssistProcessor(partitionType);
+		return processor;
+	}
+
+	public void uninstall() {
+		// dispose of all content assist processors
+		if (fProcessors != null && !fProcessors.isEmpty()) {
+			Collection collection = fProcessors.values();
+			Iterator iter = collection.iterator();
+			while (iter.hasNext()) {
+				((CompoundContentAssistProcessor) iter.next()).dispose();
+			}
+			fProcessors.clear();
+		}
+		super.uninstall();
+	}
+}
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
index 911dae3..7899af3 100644
--- 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
@@ -24,9 +24,7 @@
 import org.eclipse.jface.text.contentassist.IContextInformationValidator;
 import org.eclipse.jface.text.source.Annotation;
 import org.eclipse.jface.text.source.IAnnotationModel;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.jface.text.source.ISourceViewer;
 import org.eclipse.wst.sse.core.internal.provisional.exceptions.SourceEditingRuntimeException;
 import org.eclipse.wst.sse.ui.internal.StructuredTextViewer;
 
@@ -36,11 +34,8 @@
 	protected IQuickAssistProcessor fQuickAssistProcessor;
 	protected IQuickFixProcessor fQuickFixProcessor;
 
-	public StructuredCorrectionProcessor(ITextEditor editor) {
-		IEditorInput input = ((IEditorPart) editor).getEditorInput();
-		IAnnotationModel annotationModel = editor.getDocumentProvider().getAnnotationModel(input);
-
-		fAnnotationModel = annotationModel;
+	public StructuredCorrectionProcessor(ISourceViewer sourceViewer) {
+		fAnnotationModel = sourceViewer.getAnnotationModel();
 	}
 
 	protected void addQuickAssistProposals(StructuredTextViewer viewer, ArrayList proposals, int documentOffset) {
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/editor/SingleCharReader.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/editor/SingleCharReader.java
deleted file mode 100644
index df16cec..0000000
--- a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/editor/SingleCharReader.java
+++ /dev/null
@@ -1,67 +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.ui.internal.editor;
-
-import java.io.IOException;
-import java.io.Reader;
-
-/**
- * Copied from org.eclipse.jdt.internal.corext.javadoc.SingleCharReader 
- * Also copied in org.eclipse.wst.javascript.common.ui.contentassist.javadoc.SingleCharReader No
- * modifications were made
- */
-public abstract class SingleCharReader extends Reader {
-
-	/**
-	 * 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();
-	}
-
-	/**
-	 * @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;
-				} else {
-					return i - off;
-				}
-			}
-			cbuf[i] = (char) ch;
-		}
-		return len;
-	}
-
-	/**
-	 * @see Reader#ready()
-	 */
-	public boolean ready() throws IOException {
-		return true;
-	}
-}
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/provisional/StructuredTextViewerConfiguration.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/provisional/StructuredTextViewerConfiguration.java
index 7d19934..9e57bc3 100644
--- a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/provisional/StructuredTextViewerConfiguration.java
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/provisional/StructuredTextViewerConfiguration.java
@@ -12,116 +12,70 @@
  *******************************************************************************/
 package org.eclipse.wst.sse.ui.internal.provisional;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-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.jface.preference.IPreferenceStore;
-import org.eclipse.jface.text.DefaultInformationControl;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.IInformationControl;
-import org.eclipse.jface.text.IInformationControlCreator;
+import org.eclipse.jface.text.ITextHover;
 import org.eclipse.jface.text.IUndoManager;
-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.hyperlink.IHyperlinkPresenter;
 import org.eclipse.jface.text.presentation.IPresentationReconciler;
 import org.eclipse.jface.text.source.IAnnotationHover;
 import org.eclipse.jface.text.source.ISourceViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.editors.text.EditorsUI;
 import org.eclipse.ui.editors.text.TextSourceViewerConfiguration;
-import org.eclipse.ui.texteditor.ITextEditor;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
+import org.eclipse.ui.texteditor.ChainedPreferenceStore;
 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.IExtendedConfiguration;
-import org.eclipse.wst.sse.ui.internal.IReleasable;
 import org.eclipse.wst.sse.ui.internal.SSEUIPlugin;
 import org.eclipse.wst.sse.ui.internal.StructuredTextAnnotationHover;
-import org.eclipse.wst.sse.ui.internal.contentassist.IResourceDependentProcessor;
-import org.eclipse.wst.sse.ui.internal.editor.HTMLTextPresenter;
+import org.eclipse.wst.sse.ui.internal.contentassist.StructuredContentAssistant;
 import org.eclipse.wst.sse.ui.internal.hyperlink.HighlighterHyperlinkPresenter;
-import org.eclipse.wst.sse.ui.internal.provisional.style.Highlighter;
-import org.eclipse.wst.sse.ui.internal.provisional.style.IHighlighter;
-import org.eclipse.wst.sse.ui.internal.reconcile.StructuredRegionProcessor;
-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.provisional.style.LineStyleProvider;
+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.Assert;
-import org.eclipse.wst.sse.ui.internal.util.EditorUtility;
 
 
 /**
- * Configuration for a SourceViewer that shows an IStructuredDocument
+ * 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.internal.StructuredTextEditor
+ * @see org.eclipse.wst.sse.ui.internal.StructuredTextViewer
  */
-public class StructuredTextViewerConfiguration extends TextSourceViewerConfiguration implements IExtendedConfiguration {
-
-	private static final String CONTENT_ASSIST_PROCESSOR_EXTENDED_ID = "contentassistprocessor"; //$NON-NLS-1$
-	public static final String ID = "textviewerconfiguration"; //$NON-NLS-1$
-	protected String[] configuredContentTypes;
-	protected IEditorPart editorPart;
-	private IAnnotationHover fAnnotationHover = null;
-	protected IContentAssistant fContentAssistant;
-	private List fContentAssistProcessors = null;
-	protected IContentAssistant fCorrectionAssistant;
-	private String fDeclaringID;
-	protected IHighlighter fHighlighter;
-
-	protected StructuredRegionProcessor fReconciler;
-	protected IResource fResource = null;
-	protected final String SSE_EDITOR_ID = "org.eclipse.wst.sse.ui"; //$NON-NLS-1$
-	protected final String SSE_MODEL_ID = "org.eclipse.wst.sse.core"; //$NON-NLS-1$
-
-	/**
-	 * This is intended for unit testing only.
-	 * 
-	 * This preference store will be overwritten when configured with a
-	 * StructuredTextEditor
-	 * 
-	 * @param store
+public class StructuredTextViewerConfiguration extends TextSourceViewerConfiguration implements IExecutableExtension {
+	/*
+	 * One instance per configuration because creating a second assistant that
+	 * is added to a viewer can cause odd key-eating by the wrong one.
 	 */
-	public StructuredTextViewerConfiguration(IPreferenceStore store) {
-		super(store);
-		fContentAssistProcessors = new ArrayList();
-	}
+	private StructuredContentAssistant fContentAssistant = null;
 
-	/**
-	 * Default constructor.
-	 */
 	public StructuredTextViewerConfiguration() {
 		super();
-		fContentAssistProcessors = new ArrayList();
+		// initialize fPreferenceStore with same preference store used in
+		// StructuredTextEditor
+		fPreferenceStore = createCombinedPreferenceStore();
 	}
 
 	/**
-	 * use this constructor to have reconciler
+	 * Create a preference store that combines the source editor preferences
+	 * with the base editor's preferences.
+	 * 
+	 * @return IPreferenceStore
 	 */
-	public StructuredTextViewerConfiguration(IEditorPart textEditor) {
-		this();
-		editorPart = textEditor;
-	}
-
-	public void configureOn(IResource resource) {
-		fResource = resource;
-		updateForResource();
-	}
-
-	protected ValidatorStrategy createValidatorStrategy(String contentTypeId) {
-		ValidatorStrategy validatorStrategy = new ValidatorStrategy(getTextEditor(), contentTypeId);
-		ValidatorBuilder vBuilder = new ValidatorBuilder();
-		ValidatorMetaData[] vmds = vBuilder.getValidatorMetaData("org.eclipse.wst.sse.ui"); //$NON-NLS-1$
-		for (int i = 0; i < vmds.length; i++) {
-			if (vmds[i].canHandleContentType(contentTypeId))
-				validatorStrategy.addValidatorMetaData(vmds[i]);
-		}
-		return validatorStrategy;
+	private IPreferenceStore createCombinedPreferenceStore() {
+		IPreferenceStore sseEditorPrefs = SSEUIPlugin.getDefault().getPreferenceStore();
+		IPreferenceStore baseEditorPrefs = EditorsUI.getPreferenceStore();
+		return new ChainedPreferenceStore(new IPreferenceStore[]{sseEditorPrefs, baseEditorPrefs});
 	}
 
 	/**
@@ -135,35 +89,43 @@
 	 *         should be installed
 	 */
 	public IAnnotationHover getAnnotationHover(ISourceViewer sourceViewer) {
-		if (fAnnotationHover == null) {
-			fAnnotationHover = new StructuredTextAnnotationHover();
-		}
-		return fAnnotationHover;
+		/*
+		 * This implmentation returns an annotation hover that works with
+		 * StructuredTextViewer and breakpoints. Important! must remember to
+		 * release it when done with it (during viewer.unconfigure)
+		 */
+		return new StructuredTextAnnotationHover();
 	}
 
-	/*
-	 * (non-Javadoc)
+	/**
+	 * 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.
 	 * 
-	 * @see org.eclipse.jface.text.source.SourceViewerConfiguration#getConfiguredDocumentPartitioning(org.eclipse.jface.text.source.ISourceViewer)
+	 * @param sourceViewer
+	 *            the source viewer to be configured by this configuration
+	 * @return the configured partitioning
+	 * @see #getConfiguredContentTypes(ISourceViewer)
 	 */
 	public String getConfiguredDocumentPartitioning(ISourceViewer sourceViewer) {
+		/*
+		 * This implementation returns default structured text partitioning
+		 */
 		return IStructuredPartitioning.DEFAULT_STRUCTURED_PARTITIONING;
 	}
 
-	/*
-	 * @see SourceViewerConfiguration#getConfiguredTextHoverStateMasks(ISourceViewer,
-	 *      String)
-	 * @see 2.1
-	 */
 	public int[] getConfiguredTextHoverStateMasks(ISourceViewer sourceViewer, String contentType) {
-		// content type does not matter when getting hover state mask
+		/*
+		 * 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 = EditorUtility.computeStateMask(hoverDescs[i].getModifierString());
+				int stateMask = computeStateMask(hoverDescs[i].getModifierString());
 				while (j < stateMasksLength) {
 					if (stateMasks[j] == stateMask)
 						break;
@@ -182,282 +144,69 @@
 	}
 
 	/**
-	 * @see ISourceViewerConfiguration#getContentAssistant
-	 */
-	public IContentAssistant getContentAssistant(ISourceViewer sourceViewer) {
-		if (fContentAssistant == null) {
-			/**
-			 * Ensure that only one assistant is ever returned. Creating a
-			 * second assistant that is added to a viewer can cause odd
-			 * key-eating by the wrong one.
-			 */
-			ContentAssistant assistant = new ContentAssistant() {
-				private Map fExtendedProcessors = new HashMap(0);
-
-				public IContentAssistProcessor getContentAssistProcessor(String contentType) {
-					IContentAssistProcessor processor = super.getContentAssistProcessor(contentType);
-					// NOT YET FINALIZED - DO NOT CONSIDER AS API
-					if (processor == null && !fExtendedProcessors.containsKey(contentType)) {
-						processor = (IContentAssistProcessor) ExtendedConfigurationBuilder.getInstance().getConfiguration(CONTENT_ASSIST_PROCESSOR_EXTENDED_ID, contentType);
-						fExtendedProcessors.put(contentType, processor);
-						/*
-						 * Copied from setContentAssistProcessor to avoid
-						 * calling getContentAssistProcessor() from within
-						 * getContentAssistProcessor()
-						 */
-						fContentAssistProcessors.add(processor);
-						if (processor instanceof IResourceDependentProcessor)
-							((IResourceDependentProcessor) processor).initialize(fResource);
-						setContentAssistProcessor(processor, contentType);
-					}
-					return processor;
-				}
-			};
-
-			// content assistant configurations
-			assistant.setDocumentPartitioning(getConfiguredDocumentPartitioning(sourceViewer));
-			assistant.enableAutoActivation(true);
-			assistant.setAutoActivationDelay(500);
-			assistant.setProposalPopupOrientation(IContentAssistant.PROPOSAL_OVERLAY);
-			assistant.setContextInformationPopupOrientation(IContentAssistant.CONTEXT_INFO_ABOVE);
-			assistant.setInformationControlCreator(getInformationControlCreator(sourceViewer));
-			fContentAssistant = assistant;
-		}
-		updateForResource();
-		return fContentAssistant;
-	}
-
-	public IContentAssistant getCorrectionAssistant(ISourceViewer sourceViewer) {
-		if (fCorrectionAssistant == null) {
-			/**
-			 * Ensure that only one assistant is ever returned. Creating a
-			 * second assistant that is added to a viewer can cause odd
-			 * key-eating by the wrong one.
-			 */
-			ContentAssistant assistant = new ContentAssistant();
-			assistant.setDocumentPartitioning(getConfiguredDocumentPartitioning(sourceViewer));
-			fCorrectionAssistant = assistant;
-		}
-		updateForResource();
-		return fCorrectionAssistant;
-	}
-
-	/**
-	 * @return Returns the declaringID.
-	 */
-	public String getDeclaringID() {
-		return fDeclaringID;
-	}
-
-	/**
-	 * @return Returns the editorPart.
-	 */
-	protected IEditorPart getEditorPart() {
-		return editorPart;
-	}
-
-	public IHighlighter getHighlighter(ISourceViewer viewer) {
-		/*
-		 * Assuming for now that only one highlighter is needed per
-		 * configuration, and that its just configured for lots of different
-		 * content types. In the future, this may change, if its tied closer
-		 * to the actual content type (for example, made specifc for HTML vs.
-		 * XML). I think it would be little impact to create a new instance
-		 * each time.
-		 */
-		if (fHighlighter != null) {
-			fHighlighter.uninstall();
-		}
-		else {
-			Highlighter highlighter = new Highlighter();
-			highlighter.setDocumentPartitioning(getConfiguredDocumentPartitioning(viewer));
-			fHighlighter = highlighter;
-		}
-		// Allow viewer to be null for easier unit testing, but during normal
-		// use, would not be null
-		if (viewer != null) {
-			IDocument doc = viewer.getDocument();
-			if (doc instanceof IStructuredDocument) {
-				IStructuredDocument structuredDocument = (IStructuredDocument) doc;
-				fHighlighter.setDocument(structuredDocument);
-			}
-		}
-		return fHighlighter;
-	}
-
-	/*
-	 * @see SourceViewerConfiguration#getHoverControlCreator(ISourceViewer)
-	 */
-	public IInformationControlCreator getInformationControlCreator(ISourceViewer sourceViewer) {
-		return new IInformationControlCreator() {
-			public IInformationControl createInformationControl(Shell parent) {
-				// int style= cutDown ? SWT.NONE : (SWT.V_SCROLL |
-				// SWT.H_SCROLL);
-				int style = SWT.NONE;
-				return new DefaultInformationControl(parent, style, new HTMLTextPresenter(false));
-			}
-		};
-	}
-
-	/**
-	 * Returns the information presenter control creator. The creator is a
-	 * factory creating the presenter controls for the given source viewer.
-	 * This implementation always returns a creator for
-	 * <code>DefaultInformationControl</code> instances. (Copied from
-	 * JavaSourceViewerConfiguration)
+	 * 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 overriding this method to add their own processors should call
+	 * <code>super.getContentAssist()</code> to get the right content
+	 * assistant and then call
+	 * <code>((ContentAssistant)assistant).setContentAssistProcessor()</code>.
+	 * </p>
 	 * 
 	 * @param sourceViewer
 	 *            the source viewer to be configured by this configuration
-	 * @return an information control creator
+	 * @return a content assistant or <code>null</code> if content assist
+	 *         should not be supported
 	 */
-	protected IInformationControlCreator getInformationPresenterControlCreator(ISourceViewer sourceViewer) {
-		return new IInformationControlCreator() {
-			public IInformationControl createInformationControl(Shell parent) {
-				int shellStyle = SWT.RESIZE;
-				int style = SWT.V_SCROLL | SWT.H_SCROLL;
-				return new DefaultInformationControl(parent, shellStyle, style, new HTMLTextPresenter(false));
-			}
-		};
+	public IContentAssistant getContentAssistant(ISourceViewer sourceViewer) {
+		/*
+		 * Note: need to install content assistant so that content assist
+		 * processors contributed via extension point will be picked up
+		 */
+		if (fContentAssistant == null) {
+			fContentAssistant = new StructuredContentAssistant();
+
+			// content assistant configurations
+			fContentAssistant.setDocumentPartitioning(getConfiguredDocumentPartitioning(sourceViewer));
+			fContentAssistant.enableAutoActivation(true);
+			fContentAssistant.setAutoActivationDelay(500);
+			fContentAssistant.setProposalPopupOrientation(IContentAssistant.PROPOSAL_OVERLAY);
+			fContentAssistant.setContextInformationPopupOrientation(IContentAssistant.CONTEXT_INFO_ABOVE);
+			fContentAssistant.setInformationControlCreator(getInformationControlCreator(sourceViewer));
+		}
+		return fContentAssistant;
 	}
 
-	/*
-	 * (non-Javadoc)
+	/**
+	 * Returns correction assistant that will be used by QuickFix/QuickAssist
+	 * operation in the given source viewer.<br />
+	 * TODO: ISSUE: This method may be removed from API in near future if base
+	 * adds support.
 	 * 
-	 * @see org.eclipse.jface.text.source.SourceViewerConfiguration#getOverviewRulerAnnotationHover(org.eclipse.jface.text.source.ISourceViewer)
+	 * @param sourceViewer
+	 *            the source viewer to be configured by this configuration
+	 * @return IContentAssistant or null if correction should not be supported
 	 */
-	public IAnnotationHover getOverviewRulerAnnotationHover(ISourceViewer arg0) {
-		return new StructuredTextAnnotationHover();
-	}
-
-	public IPresentationReconciler getPresentationReconciler(ISourceViewer sourceViewer) {
+	public IContentAssistant getCorrectionAssistant(ISourceViewer sourceViewer) {
 		return null;
 	}
 
-	protected ITextEditor getTextEditor() {
-		ITextEditor editor = null;
-		if (editorPart instanceof ITextEditor)
-			editor = (ITextEditor) editorPart;
-		if (editor == null && editorPart != null)
-			editor = (ITextEditor) editorPart.getAdapter(ITextEditor.class);
-		return editor;
-	}
-
 	/**
-	 * Returns the text hovers available in StructuredTextEditors
+	 * Returns the hyperlink presenter for the given source viewer.
 	 * 
-	 * @return TextHoverManager.TextHoverDescriptor[]
-	 */
-	protected TextHoverManager.TextHoverDescriptor[] getTextHovers() {
-		return SSEUIPlugin.getDefault().getTextHoverManager().getTextHovers();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.text.source.SourceViewerConfiguration#getUndoManager(org.eclipse.jface.text.source.ISourceViewer)
-	 */
-	public IUndoManager getUndoManager(ISourceViewer sourceViewer) {
-		return new StructuredTextViewerUndoManager();
-	}
-
-	/**
-	 * Sets the given IContentAssistProcessor into the given ContentAssistant
-	 * for the partitionType, handling certain extra initialization steps.
-	 * 
-	 * @param ca
-	 * @param newProcessor
-	 * @param partitionType
-	 */
-	protected void setContentAssistProcessor(ContentAssistant ca, IContentAssistProcessor newProcessor, String partitionType) {
-		// save for reinit and release
-		IContentAssistProcessor previousProcessor = ca.getContentAssistProcessor(partitionType);
-		if (previousProcessor != null) {
-			if(previousProcessor instanceof IReleasable)
-				((IReleasable)previousProcessor).release();
-			fContentAssistProcessors.remove(previousProcessor);
-		}
-		fContentAssistProcessors.add(newProcessor);
-		if (newProcessor instanceof IResourceDependentProcessor)
-			((IResourceDependentProcessor) newProcessor).initialize(fResource);
-		ca.setContentAssistProcessor(newProcessor, partitionType);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.sse.ui.extension.IExtendedConfiguration#setDeclaringID(java.lang.String)
-	 */
-	public void setDeclaringID(String targetID) {
-		fDeclaringID = targetID;
-	}
-
-	/**
-	 * @param editorPart
-	 *            The editorPart to set.
-	 */
-	public void setEditorPart(IEditorPart editorPart) {
-		this.editorPart = editorPart;
-	}
-
-	/**
-	 * This method is allow any cleanup to take place that is not otherwise
-	 * done in the viewer's unConfigure method. In some cases, things may be
-	 * done "twice" ... so uninstall, release, etc., should be prepared.
-	 */
-	public void unConfigure(ISourceViewer viewer) {
-		editorPart = null;
-		// If there're any processors we're hanging on to, be sure they have a
-		// chance to clean themselves up.
-		if (fHighlighter != null) {
-			fHighlighter.uninstall();
-		}
-		if (fContentAssistant != null) {
-			fContentAssistant.uninstall();
-		}
-		if (fReconciler != null) {
-			fReconciler.uninstall();
-		}
-		if (fContentAssistant != null) {
-			unconfigureContentAssistProcessors();
-		}
-		if (fAnnotationHover != null && fAnnotationHover instanceof IReleasable) {
-			((IReleasable) fAnnotationHover).release();
-		}
-	}
-
-	/**
-	 * 
-	 */
-	private void unconfigureContentAssistProcessors() {
-		if (!fContentAssistProcessors.isEmpty()) {
-			Iterator it = fContentAssistProcessors.iterator();
-			IContentAssistProcessor p = null;
-			while (it.hasNext()) {
-				p = (IContentAssistProcessor) it.next();
-				if (p instanceof IReleasable)
-					((IReleasable) p).release();
-			}
-		}
-	}
-
-	protected void updateForResource() {
-		if (!fContentAssistProcessors.isEmpty()) {
-			Iterator it = fContentAssistProcessors.iterator();
-			IContentAssistProcessor p = null;
-			while (it.hasNext()) {
-				p = (IContentAssistProcessor) it.next();
-				if (p instanceof IResourceDependentProcessor)
-					((IResourceDependentProcessor) p).initialize(fResource);
-			}
-		}
-	}
-
-
-	/**
-	 * Use a special hyperlink presenter that is aware of how Highlighter
-	 * works instead of PresentationReconciler.
+	 * @param sourceViewer
+	 *            the source viewer to be configured by this configuration
+	 * @return the hyperlink presenter or <code>null</code> if no hyperlink
+	 *         support should be installed
+	 * @since 3.1
 	 */
 	public IHyperlinkPresenter getHyperlinkPresenter(ISourceViewer sourceViewer) {
+		/*
+		 * This implementation returns a hyperlink presenter that uses
+		 * Highlither instead of PresentationReconciler
+		 */
 		if (fPreferenceStore == null) {
 			return super.getHyperlinkPresenter(sourceViewer);
 		}
@@ -465,16 +214,73 @@
 	}
 
 	/**
-	 * Set the preference store used to initialize this configuration. This
-	 * method should only be called once or always with the same value. If a
-	 * preference store was passed in via a constructor, it is an error to
-	 * call this method with a different preference store.
+	 * Returns the line style providers that will be used for syntax
+	 * highlighting in the given source viewer.
 	 * 
-	 * @param store
-	 *            the preference store to use
+	 * @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 void setPreferenceStore(IPreferenceStore store) {
-		Assert.isLegal(fPreferenceStore == null || fPreferenceStore == store, "TextSourceViewerConfiguration's preference store may only be set once"); //$NON-NLS-1$
-		fPreferenceStore = store;
+	public LineStyleProvider[] getLineStyleProviders(ISourceViewer sourceViewer, String partitionType) {
+		return null;
+	}
+	
+	public IPresentationReconciler getPresentationReconciler(ISourceViewer sourceViewer) {
+		/*
+		 * This implementation returns null because StructuredTextViewer does
+		 * not use presentation reconciler
+		 */
+		return null;
+	}
+	
+	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(null);
+			}
+			i++;
+		}
+		return textHover;
+	}
+
+	/**
+	 * Returns the undo manager for the given source viewer.
+	 * 
+	 * @param sourceViewer
+	 *            the source viewer to be configured by this configuration
+	 * @return an undo manager or <code>null</code> if no undo/redo should
+	 *         not be supported
+	 */
+	public IUndoManager getUndoManager(ISourceViewer sourceViewer) {
+		/*
+		 * This implementation returns an UndoManager that is used exclusively
+		 * in StructuredTextViewer
+		 */
+		return new StructuredTextViewerUndoManager();
+	}
+
+	public void setInitializationData(IConfigurationElement config, String propertyName, Object data) throws CoreException {
+		/*
+		 * Currently no need for initialization data but is good practice to
+		 * implement IExecutableExtension since is a class that can be created
+		 * by executable extension
+		 */
 	}
 }
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
index 73cc692..9194a57 100644
--- 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
@@ -46,7 +46,7 @@
 		}
 	}
 
-	//protected IStructuredDocumentRegion currentStructuredDocumentRegion;
+	// protected IStructuredDocumentRegion currentStructuredDocumentRegion;
 	// Note: the var=x.class contructs were put into this method
 	// as a workaround for slow VAJava class lookups. They compiler
 	// assigns them to a variable in the JDK, but Class.forName("x")
@@ -54,10 +54,6 @@
 	// be simplified in future.
 	static Class LineStyleProviderClass = LineStyleProvider.class;
 
-	// had to make this not final, or got in to infinite recursion during
-	// class loading in VAJava!
-	// (must be a VAJava thing)
-	private LineStyleProvider fDefaultAttributeProvider = null;
 	private IStructuredDocument fDocument;
 	private Highlighter fHighlighter;
 	private boolean fInitialized;
@@ -72,19 +68,12 @@
 	// It's only written in the case of a program error, but there's no use
 	// adding
 	// salt to the wound.
-	//private boolean wroteOneLogMessage;
+	// private boolean wroteOneLogMessage;
 	/**
 	 */
 	protected AbstractLineStyleProvider() {
 	}
 
-	protected void addEmptyRange(int start, int length, Collection holdResults) {
-		StyleRange result = new StyleRange();
-		result.start = start;
-		result.length = length;
-		holdResults.add(result);
-	}
-
 	/**
 	 * Looks up the colorKey in the preference store and adds the style
 	 * information to list of TextAttributes
@@ -93,7 +82,7 @@
 	 */
 	protected void addTextAttribute(String colorKey) {
 		if (getColorPreferences() != null) {
-			String prefString = getColorPreferences().getString(getPreferenceKey(colorKey));
+			String prefString = getColorPreferences().getString(colorKey);
 			String[] stylePrefs = ColorHelper.unpackStylePreferences(prefString);
 			if (stylePrefs != null) {
 				RGB foreground = ColorHelper.toRGB(stylePrefs[0]);
@@ -113,8 +102,7 @@
 	/**
 	 * this version does "trim" regions to match request
 	 */
-	protected StyleRange createStyleRange(ITextRegionCollection flatNode, ITextRegion region, TextAttribute attr, int startOffset, int length) {
-
+	private StyleRange createStyleRange(ITextRegionCollection flatNode, ITextRegion region, TextAttribute attr, int startOffset, int length) {
 		int start = flatNode.getStartOffset(region);
 		if (start < startOffset)
 			start = startOffset;
@@ -132,26 +120,9 @@
 		return new TextAttribute((foreground != null) ? EditorUtility.getColor(foreground) : null, (background != null) ? EditorUtility.getColor(background) : null, bold ? SWT.BOLD : SWT.NORMAL);
 	}
 
-	protected TextAttribute getAttributeFor(ITextRegion region) {
-		// should be "abstract" method
-		return null;
-	}
+	abstract protected TextAttribute getAttributeFor(ITextRegion region);
 
-	// this should actually be an abstract method to replace getColorManager
-	// but returning null to avoid API changes
-	protected IPreferenceStore getColorPreferences() {
-		return null;
-	}
-
-	/**
-	 * See also Highligher::getTextAttributeProvider
-	 */
-	protected LineStyleProvider getDefaultLineStyleProvider() {
-		if (fDefaultAttributeProvider == null) {
-			fDefaultAttributeProvider = new LineStyleProviderForNoOp();
-		}
-		return fDefaultAttributeProvider;
-	}
+	abstract protected IPreferenceStore getColorPreferences();
 
 	protected IStructuredDocument getDocument() {
 		return fDocument;
@@ -164,18 +135,6 @@
 	}
 
 	/**
-	 * Transforms the key in any way to use in preference store (ex:
-	 * PreferenceKeyGenerator)
-	 * 
-	 * @deprecated PrefernceKeyGenerator should no longer be needed
-	 * @param key
-	 * @return
-	 */
-	protected String getPreferenceKey(String key) {
-		return key;
-	}
-
-	/**
 	 * Returns the hashtable containing all the text attributes for this line
 	 * style provider. Lazily creates a hashtable if one has not already been
 	 * created.
@@ -185,6 +144,7 @@
 	protected HashMap getTextAttributes() {
 		if (fTextAttributes == null) {
 			fTextAttributes = new HashMap();
+			loadColors();
 		}
 		return fTextAttributes;
 	}
@@ -222,6 +182,8 @@
 	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();
@@ -352,7 +314,7 @@
 		return handled;
 	}
 
-	protected void registerPreferenceManager() {
+	private void registerPreferenceManager() {
 		IPreferenceStore pref = getColorPreferences();
 		if (pref != null) {
 			pref.addPropertyChangeListener(fPreferenceListener);
@@ -361,7 +323,10 @@
 
 	public void release() {
 		unRegisterPreferenceManager();
-		getTextAttributes().clear();
+		if (fTextAttributes != null) {
+			fTextAttributes.clear();
+			fTextAttributes = null;
+		}
 	}
 
 	/**
@@ -370,11 +335,11 @@
 	 * @param initialized
 	 *            The initialized to set
 	 */
-	public void setInitialized(boolean initialized) {
+	private void setInitialized(boolean initialized) {
 		this.fInitialized = initialized;
 	}
 
-	protected void unRegisterPreferenceManager() {
+	private 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/Highlighter.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/provisional/style/Highlighter.java
index 2e81cc7..1a430ad 100644
--- 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
@@ -116,8 +116,7 @@
 			double gammaNormalized(double colorComponent) {
 				if (colorComponent < 0.018) {
 					return colorComponent * 0.45;
-				}
-				else {
+				} else {
 					return 1.099 * Math.pow(colorComponent, 0.45) - 0.099;
 				}
 			}
@@ -176,8 +175,7 @@
 			double inverseGammaNormalized(double colorComponent) {
 				if (colorComponent < 0.018) {
 					return colorComponent * .222;
-				}
-				else {
+				} else {
 					return Math.pow(((.9099 * colorComponent + 0.09)), 2.22);
 				}
 			}
@@ -201,8 +199,7 @@
 			if (y < target) {
 				// is "dark" make lighter
 				y = y + ((target - y) * scaleFactor);
-			}
-			else {
+			} else {
 				// is "light" make darker
 				y = y - ((y - target) * scaleFactor);
 			}
@@ -227,8 +224,7 @@
 			if (target < mid) {
 				// is "dark" make lighter
 				y = target + scaleFactor;
-			}
-			else {
+			} else {
 				// is "light" make darker
 				y = target - scaleFactor;
 			}
@@ -291,6 +287,17 @@
 		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);
 	}
@@ -319,8 +326,7 @@
 					ranges[i].start = region.getOffset();
 					ranges[i].length = region.getLength();
 				} // else what happens if region is not found?!
-			}
-			else {
+			} else {
 				// just adjust the range using the given adjustment
 				ranges[i].start += adjustment;
 			}
@@ -362,8 +368,7 @@
 			// oldRGB = getTextWidget().getForeground().getRGB();
 			oldColor = getTextWidget().getBackground();
 			oldRGB = oldColor.getRGB();
-		}
-		else {
+		} else {
 			oldRGB = oldColor.getRGB();
 		}
 		Color newColor = getCachedColorFor(oldRGB);
@@ -468,8 +473,7 @@
 			// viewer
 			ITextViewerExtension5 extension = (ITextViewerExtension5) viewer;
 			styleRegion = extension.widgetRange2ModelRange(new Region(offset, length));
-		}
-		else {
+		} else {
 			// get document range, taking into account viewer visible region
 			// get visible region in viewer
 			IRegion vr = null;
@@ -515,8 +519,7 @@
 						provider.init(getDocument(), this);
 					}
 					result = provider;
-				}
-				else {
+				} else {
 					result = (LineStyleProvider) getExtendedProviders().get(type);
 				}
 			}
@@ -557,6 +560,12 @@
 		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;
 
@@ -592,8 +601,7 @@
 				// document
 				// it has no length, and there is no node for it!
 				eventStyles = EMPTY_STYLE_RANGE;
-			}
-			else {
+			} else {
 				/*
 				 * LineStyleProviders work using absolute document offsets. To
 				 * support visible regions, adjust the requested range up to
@@ -625,8 +633,7 @@
 								if (offset > 0)
 									adjust(eventStyles, -offset);
 							}
-						}
-						else {
+						} else {
 							if (getTextViewer() instanceof ProjectionViewer) {
 								if (((ProjectionViewer) getTextViewer()).isProjectionMode())
 									adjust(eventStyles, -offset);
@@ -645,8 +652,7 @@
 
 			}
 
-		}
-		catch (Exception e) {
+		} catch (Exception e) {
 			// if ANY exception occurs during highlighting,
 			// just return "no highlighting"
 			eventStyles = EMPTY_STYLE_RANGE;
@@ -678,8 +684,7 @@
 		 */
 		if (offset == fSavedOffset && length == fSavedLength && fSavedRanges != null) {
 			event.styles = fSavedRanges;
-		}
-		else {
+		} else {
 			// need to assign this array here, or else the field won't get
 			// updated
 			event.styles = lineGetStyle(offset, length);
@@ -702,8 +707,7 @@
 
 		if (fHoldStyleResults == null) {
 			fHoldStyleResults = new ArrayList(partitions.length);
-		}
-		else {
+		} else {
 			fHoldStyleResults.clear();
 		}
 
@@ -724,8 +728,7 @@
 		int resultSize = fHoldStyleResults.size();
 		if (resultSize > 0) {
 			result = (StyleRange[]) fHoldStyleResults.toArray(new StyleRange[fHoldStyleResults.size()]);
-		}
-		else {
+		} else {
 			result = EMPTY_STYLE_RANGE;
 		}
 		result = convertReadOnlyRegions(result, start, length);
@@ -755,12 +758,15 @@
 	public void setDocumentPartitioning(String partitioning) {
 		if (partitioning != null) {
 			fPartitioning = partitioning;
-		}
-		else {
+		} 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);
@@ -813,19 +819,16 @@
 				StyleRange last = eventStyles[eventStyles.length - 1];
 				if (startOffset > first.start) {
 					result = false;
-				}
-				else {
+				} else {
 					int lineEndOffset = startOffset + lineLength;
 					int lastOffset = last.start + last.length;
 					if (lastOffset > lineEndOffset) {
 						result = false;
-					}
-					else {
+					} else {
 						result = true;
 					}
 				}
-			}
-			else {
+			} else {
 				// a zero length array is ok
 				result = true;
 			}
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
index 1a34523..b9c51d7 100644
--- 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
@@ -17,6 +17,7 @@
 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
@@ -26,8 +27,12 @@
  * 
  * Not to be subclassed.
  */
-final public class LineStyleProviderForNoOp extends AbstractLineStyleProvider implements LineStyleProvider {
+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)
@@ -37,4 +42,7 @@
 		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/views/contentoutline/ContentOutlineConfiguration.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/provisional/views/contentoutline/ContentOutlineConfiguration.java
index 4335f34..2d07844 100644
--- a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/provisional/views/contentoutline/ContentOutlineConfiguration.java
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/provisional/views/contentoutline/ContentOutlineConfiguration.java
@@ -14,7 +14,10 @@
 
 import java.util.List;
 
+import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExecutableExtension;
 import org.eclipse.jface.action.IContributionItem;
 import org.eclipse.jface.action.IMenuListener;
 import org.eclipse.jface.util.TransferDragSourceListener;
@@ -28,7 +31,6 @@
 import org.eclipse.jface.viewers.TreeViewer;
 import org.eclipse.jface.viewers.Viewer;
 import org.eclipse.swt.events.KeyListener;
-import org.eclipse.wst.sse.ui.internal.IExtendedConfiguration;
 import org.eclipse.wst.sse.ui.internal.view.events.NodeSelectionChangedEvent;
 
 /**
@@ -37,18 +39,13 @@
  * @plannedfor 1.0
  *  
  */
-public class ContentOutlineConfiguration implements IExtendedConfiguration, IAdaptable {
-
-	public final static String ID = "contentoutlineconfiguration"; //$NON-NLS-1$
-
+public class ContentOutlineConfiguration implements IExecutableExtension, IAdaptable {
 	private IContentProvider fContentProvider;
-	private String fDeclaringID = null;
 	private KeyListener[] fKeyListeners;
 	private ILabelProvider fLabelProvider;
 
 	public ContentOutlineConfiguration() {
 		super();
-		fDeclaringID = getClass().getName();
 	}
 
 	private IContentProvider createTreeContentProvider() {
@@ -99,15 +96,6 @@
 	}
 
 	/**
-	 * @return Returns the declaringID, useful for remembering settings.
-	 */
-	public String getDeclaringID() {
-		if (fDeclaringID == null)
-			return "???"; //$NON-NLS-1$
-		return fDeclaringID;
-	}
-
-	/**
 	 * @param viewer
 	 * @return the IDoubleClickListener to be notified when the viewer
 	 *         receives a double click event
@@ -223,14 +211,14 @@
 		return false;
 	}
 
-	/**
-	 * @param declaringID
-	 *            The declaringID to set.
-	 */
-	public void setDeclaringID(String declaringID) {
-		fDeclaringID = declaringID;
+	public void setInitializationData(IConfigurationElement config, String propertyName, Object data) throws CoreException {
+		/*
+		 * Currently no need for initialization data but is good practice to
+		 * implement IExecutableExtension since is a class that can be created
+		 * by executable extension
+		 */
 	}
-
+	
 	/**
 	 * General hook for resource releasing and listener removal when
 	 * configurations change or the viewer is disposed of
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/provisional/views/properties/PropertySheetConfiguration.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/provisional/views/properties/PropertySheetConfiguration.java
index 745ba62..d98aeb1 100644
--- a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/provisional/views/properties/PropertySheetConfiguration.java
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/provisional/views/properties/PropertySheetConfiguration.java
@@ -12,6 +12,9 @@
  *******************************************************************************/
 package org.eclipse.wst.sse.ui.internal.provisional.views.properties;
 
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExecutableExtension;
 import org.eclipse.jface.action.IMenuManager;
 import org.eclipse.jface.action.IStatusLineManager;
 import org.eclipse.jface.action.IToolBarManager;
@@ -21,7 +24,6 @@
 import org.eclipse.ui.views.properties.IPropertyDescriptor;
 import org.eclipse.ui.views.properties.IPropertySource;
 import org.eclipse.ui.views.properties.IPropertySourceProvider;
-import org.eclipse.wst.sse.ui.internal.IExtendedConfiguration;
 
 
 /**
@@ -29,7 +31,7 @@
  * @plannedfor 1.0
  */
 
-public class PropertySheetConfiguration implements IExtendedConfiguration {
+public class PropertySheetConfiguration implements IExecutableExtension {
 
 	private class NullPropertySource implements IPropertySource {
 		private final IPropertyDescriptor[] descriptors = new IPropertyDescriptor[0];
@@ -105,10 +107,6 @@
 		}
 	}
 
-	public static final String ID = "propertysheetconfiguration"; //$NON-NLS-1$
-
-	private String fDeclaringID;
-
 	private IEditorPart fEditor;
 	protected IPropertySourceProvider fPropertySourceProvider = null;
 
@@ -128,13 +126,6 @@
 	}
 
 	/**
-	 * @return Returns the declaringID.
-	 */
-	public String getDeclaringID() {
-		return fDeclaringID;
-	}
-
-	/**
 	 * @return Returns the editor.
 	 */
 	public IEditorPart getEditor() {
@@ -166,15 +157,6 @@
 		// do nothing
 	}
 
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.sse.ui.extension.IExtendedConfiguration#setDeclaringID(java.lang.String)
-	 */
-	public void setDeclaringID(String declaringID) {
-		fDeclaringID = declaringID;
-	}
-
 	/**
 	 * @param editor
 	 *            The editor to set.
@@ -182,6 +164,14 @@
 	public void setEditor(IEditorPart editor) {
 		fEditor = editor;
 	}
+	
+	public void setInitializationData(IConfigurationElement config, String propertyName, Object data) throws CoreException {
+		/*
+		 * Currently no need for initialization data but is good practice to
+		 * implement IExecutableExtension since is a class that can be created
+		 * by executable extension
+		 */
+	}
 
 	public void unconfigure() {
 		// do nothing
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
index 7e76a52..f3715cc 100644
--- 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
@@ -20,7 +20,6 @@
 import java.util.Iterator;
 import java.util.List;
 
-import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IMarker;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IProgressMonitor;
@@ -34,9 +33,7 @@
 import org.eclipse.jface.text.reconciler.IReconcilingStrategy;
 import org.eclipse.jface.text.reconciler.IReconcilingStrategyExtension;
 import org.eclipse.jface.text.source.IAnnotationModel;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.jface.text.source.ISourceViewer;
 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.StructuredModelManager;
@@ -74,7 +71,7 @@
 	protected IDocument fDocument = null;
 	protected IReconcileStep fFirstStep = null;
 	protected IProgressMonitor fProgressMonitor = null;
-	protected ITextEditor fTextEditor = null;
+	protected ISourceViewer fSourceViewer = null;
     private Comparator fComparator;
 
 	// list of "validator" annotations
@@ -87,8 +84,8 @@
 	 * 
 	 * @param editor
 	 */
-	public AbstractStructuredTextReconcilingStrategy(ITextEditor editor) {
-		fTextEditor = editor;
+	public AbstractStructuredTextReconcilingStrategy(ISourceViewer sourceViewer) {
+		fSourceViewer = sourceViewer;
 		init();
 	}
 
@@ -167,8 +164,8 @@
 
 	protected IAnnotationModel getAnnotationModel() {
 		IAnnotationModel model = null;
-		if (fTextEditor != null && fTextEditor.getEditorInput() != null) {
-			model = fTextEditor.getDocumentProvider().getAnnotationModel(fTextEditor.getEditorInput());
+		if (fSourceViewer != null) {
+			model = fSourceViewer.getAnnotationModel();
 		}
 		return model;
 	}
@@ -238,21 +235,6 @@
     }
 
 	/**
-	 * The IFile that this strategy is operating on (the file input for the
-	 * TextEditor)
-	 * 
-	 * @return the IFile that this strategy is operating on
-	 */
-	protected IFile getFile() {
-		if (fTextEditor == null)
-			return null;
-		IEditorInput input = fTextEditor.getEditorInput();
-		if (!(input instanceof IFileEditorInput))
-			return null;
-		return ((IFileEditorInput) input).getFile();
-	}
-
-	/**
 	 * Gets partition types from all steps in this strategy.
 	 * 
 	 * @return parition types from all steps
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/reconcile/IReconcileStepAdapter.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/reconcile/IReconcileStepAdapter.java
deleted file mode 100644
index bd05235..0000000
--- a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/reconcile/IReconcileStepAdapter.java
+++ /dev/null
@@ -1,52 +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.ui.internal.reconcile;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jface.text.reconciler.IReconcileResult;
-import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
-import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
-import org.eclipse.wst.sse.ui.internal.IReleasable;
-
-
-/**
- * This interface is for reconcile steps that need to "work" off of
- * StructuredDocument events, as well as the ReconcilerThread.
- * 
- * @deprecated don't need this now that content model strategy will go away
- */
-public interface IReconcileStepAdapter extends INodeAdapter, IReleasable {
-
-	/**
-	 * Partition types for which this step can add annootations.
-	 * 
-	 * @return partition types for which this step can add annootations.
-	 */
-	String[] getPartitionTypes();
-
-	/**
-	 * Marks a node for reconciling.
-	 * 
-	 * @param o
-	 */
-	void markForReconciling(Object o);
-
-	/**
-	 * Reconcile call seeded with an indexedNode.
-	 * 
-	 * @param monitor
-	 * @param xmlNode
-	 * @return
-	 */
-	IReconcileResult[] reconcile(IProgressMonitor monitor, IndexedRegion indexedNode);
-}
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
index 3dadd39..40cf6e0 100644
--- 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
@@ -26,6 +26,7 @@
 import org.eclipse.jface.text.reconciler.DirtyRegion;
 import org.eclipse.jface.text.reconciler.IReconcilingStrategy;
 import org.eclipse.jface.text.reconciler.IReconcilingStrategyExtension;
+import org.eclipse.jface.text.source.ISourceViewer;
 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;
@@ -41,6 +42,8 @@
 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.ui.internal.IReleasable;
+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;
 
 /**
@@ -85,6 +88,8 @@
 	 * extension point
 	 */
 	private ValidatorStrategy fValidatorStrategy;
+	
+	private final String SSE_EDITOR_ID = "org.eclipse.wst.sse.ui"; //$NON-NLS-1$
 
 	/**
 	 * @return Returns the fDefaultStrategy.
@@ -107,6 +112,38 @@
 	 * @return Returns the fValidatorStrategy.
 	 */
 	public ValidatorStrategy getValidatorStrategy() {
+		if (fValidatorStrategy == null) {
+			ValidatorStrategy validatorStrategy = null;
+			
+			if (getTextViewer() instanceof ISourceViewer) {
+				ISourceViewer viewer = (ISourceViewer)getTextViewer();
+				String contentTypeId = null;
+				
+				IDocument doc = viewer.getDocument();
+				IStructuredModel sModel = null;
+				try {
+					sModel = StructuredModelManager.getModelManager().getExistingModelForRead(doc);
+					if (sModel != null) {
+						contentTypeId = sModel.getContentTypeIdentifier();
+					}
+				} finally {
+					if (sModel != null)
+						sModel.releaseFromRead();
+				}
+				
+				if (contentTypeId != null) {
+					validatorStrategy = new ValidatorStrategy(viewer, contentTypeId);
+				
+					ValidatorBuilder vBuilder = new ValidatorBuilder();
+					ValidatorMetaData[] vmds = vBuilder.getValidatorMetaData(SSE_EDITOR_ID);
+					for (int i = 0; i < vmds.length; i++) {
+						if (vmds[i].canHandleContentType(contentTypeId))
+							validatorStrategy.addValidatorMetaData(vmds[i]);
+					}
+				}
+			}
+			fValidatorStrategy = validatorStrategy;
+		}
 		return fValidatorStrategy;
 	}
 
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
index 36b0bde..c3966f5 100644
--- 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
@@ -28,7 +28,7 @@
 import org.eclipse.jface.text.reconciler.DirtyRegion;
 import org.eclipse.jface.text.reconciler.IReconcileResult;
 import org.eclipse.jface.text.reconciler.IReconcileStep;
-import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.jface.text.source.ISourceViewer;
 import org.eclipse.wst.sse.ui.internal.reconcile.AbstractStructuredTextReconcilingStrategy;
 import org.eclipse.wst.sse.ui.internal.reconcile.DocumentAdapter;
 import org.eclipse.wst.sse.ui.internal.reconcile.StructuredReconcileStep;
@@ -49,8 +49,8 @@
 	private HashMap fVidToVStepMap = null;
 	private List fMetaData = null;
 
-	public ValidatorStrategy(ITextEditor editor, String contentType) {
-		super(editor);
+	public ValidatorStrategy(ISourceViewer sourceViewer, String contentType) {
+		super(sourceViewer);
 		fMetaData = new ArrayList();
 		fContentTypeIds = calculateParentContentTypeIds(contentType);
 		fVidToVStepMap = new HashMap();
@@ -146,7 +146,7 @@
 			return;
 		
 		// for external files, this can be null
-		if (getFile() != null) {
+		if (fDocument != null) {
 
 			String partitionType = tr.getType();
 			if (canValidatePartition(partitionType)) {
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/taginfo/AbstractBestMatchHoverProcessor.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/taginfo/BestMatchHover.java
similarity index 75%
rename from bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/taginfo/AbstractBestMatchHoverProcessor.java
rename to bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/taginfo/BestMatchHover.java
index 37ebdf9..227d229 100644
--- a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/taginfo/AbstractBestMatchHoverProcessor.java
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/taginfo/BestMatchHover.java
@@ -1,15 +1,15 @@
-/*******************************************************************************
- * 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
+/*
+ * Copyright (c) 2005 IBM Corporation and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/cpl-v10.html
  * 
  * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
+ *   IBM - Initial API and implementation
+ *   Jens Lukowski/Innoopract - initial renaming/restructuring
+ * 
+ */
 package org.eclipse.wst.sse.ui.internal.taginfo;
 
 import java.util.ArrayList;
@@ -21,16 +21,20 @@
 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 abstract class AbstractBestMatchHoverProcessor implements ITextHover {
+public class BestMatchHover implements ITextHover {
 	private ITextHover fBestMatchHover; // current best match text hover
+	private ITextHover fTagInfoHover; // documentation/information hover
+	private List fTextHovers; // list of text hovers to consider in best
+								// match
 
-	private List fTextHovers; // list of text hovers to consider in best match
+	public BestMatchHover(ITextHover infotaghover) {
+		fTagInfoHover = infotaghover;
+	}
 
 	/**
 	 * Create a list of text hovers applicable to this best match hover
@@ -38,7 +42,7 @@
 	 * 
 	 * @return List of ITextHover - in abstract class this is empty list
 	 */
-	protected List createTextHoversList() {
+	private List createTextHoversList() {
 		List hoverList = new ArrayList();
 		// if currently debugging, then add the debug hover to the list of
 		// best match
@@ -47,9 +51,8 @@
 		}
 
 		hoverList.add(new ProblemAnnotationHoverProcessor());
-		ITextHover taginfo = getTagInfoHover();
-		if (taginfo != null) {
-			hoverList.add(taginfo);
+		if (fTagInfoHover != null) {
+			hoverList.add(fTagInfoHover);
 		}
 		hoverList.add(new AnnotationHoverProcessor());
 		return hoverList;
@@ -106,12 +109,7 @@
 		return hoverRegion;
 	}
 
-	/**
-	 * @return the appropriate tag info hover help processor
-	 */
-	protected abstract ITextHover getTagInfoHover();
-
-	protected List getTextHovers() {
+	private List getTextHovers() {
 		if (fTextHovers == null) {
 			fTextHovers = createTextHoversList();
 		}
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
index 3bcd005..67d3d07 100644
--- 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
@@ -16,6 +16,7 @@
 import java.util.StringTokenizer;
 
 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;
@@ -143,6 +144,17 @@
 	}
 
 	/**
+	 * Create a best match hover with the give text hover as the documentation
+	 * hover
+	 * 
+	 * @param infoHover
+	 * @return ITextHover
+	 */
+	public ITextHover createBestMatchHover(ITextHover infoHover) {
+		return new BestMatchHover(infoHover);
+	}
+
+	/**
 	 * Generate a list of text hover descriptors from the given delimited
 	 * string
 	 * 
@@ -169,7 +181,8 @@
 				try {
 					label = SSEUIMessages.getResourceBundle().getString(id + LABEL_KEY);
 					description = SSEUIMessages.getResourceBundle().getString(id + DESCRIPTION_KEY);
-				} catch (Exception e) {
+				}
+				catch (Exception e) {
 					Logger.log(Logger.WARNING_DEBUG, e.getMessage(), e);
 				}
 				TextHoverDescriptor descriptor = new TextHoverDescriptor(id, label, description, enabled, modifierString);
@@ -184,13 +197,15 @@
 			TextHoverDescriptor desc = (TextHoverDescriptor) idToModifier.get(TEXT_HOVER_IDS[i]);
 			if (desc != null) {
 				descriptors[i] = desc;
-			} else {
+			}
+			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) {
+				}
+				catch (Exception e) {
 					Logger.log(Logger.WARNING_DEBUG, e.getMessage(), e);
 				}
 				descriptors[i] = new TextHoverDescriptor(TEXT_HOVER_IDS[i], label, description);
diff --git a/bundles/org.eclipse.wst.xml.ui/META-INF/MANIFEST.MF b/bundles/org.eclipse.wst.xml.ui/META-INF/MANIFEST.MF
index eccf385..408ebc7 100644
--- a/bundles/org.eclipse.wst.xml.ui/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.wst.xml.ui/META-INF/MANIFEST.MF
@@ -14,6 +14,7 @@
  org.eclipse.wst.xml.ui.internal.contentassist,
  org.eclipse.wst.xml.ui.internal.contentoutline,
  org.eclipse.wst.xml.ui.internal.correction,
+  org.eclipse.wst.xml.ui.internal.derived,
  org.eclipse.wst.xml.ui.internal.dialogs,
  org.eclipse.wst.xml.ui.internal.dnd,
  org.eclipse.wst.xml.ui.internal.doubleclick,
diff --git a/bundles/org.eclipse.wst.xml.ui/plugin.xml b/bundles/org.eclipse.wst.xml.ui/plugin.xml
index 34b4073..05aa08b 100644
--- a/bundles/org.eclipse.wst.xml.ui/plugin.xml
+++ b/bundles/org.eclipse.wst.xml.ui/plugin.xml
@@ -31,96 +31,40 @@
 			id="org.eclipse.wst.xml.core.ui.catalogFileType.tld">
 		</fileType>
 	</extension>
-	<extension point="org.eclipse.wst.sse.ui.extendedconfiguration">
-		<configuration
-			type="textviewerconfiguration"
+	
+	<!--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.internal.provisional.StructuredTextViewerConfigurationXML"
-			target="org.eclipse.core.runtime.xml" />
-		<configuration
-			type="contentoutlineconfiguration"
+			target="org.eclipse.core.runtime.xml, org.eclipse.wst.xml.core.xmlsource" />
+		<contentOutlineConfiguration
 			class="org.eclipse.wst.xml.ui.internal.views.contentoutline.XMLContentOutlineConfiguration"
-			target="org.eclipse.core.runtime.xml" />
-		<configuration
-			type="propertysheetconfiguration"
+			target="org.eclipse.core.runtime.xml, org.eclipse.wst.xml.core.xmlsource" />
+		<propertySheetConfiguration
 			class="org.eclipse.wst.xml.ui.internal.views.properties.XMLPropertySheetConfiguration"
-			target="org.eclipse.core.runtime.xml" />
-		<configuration
+			target="org.eclipse.core.runtime.xml, org.eclipse.wst.xml.core.xmlsource" />
+		<provisionalConfiguration
 			type="sourceeditingtexttools"
 			class="org.eclipse.wst.xml.ui.internal.provisional.XMLSourceEditingTextTools"
-			target="org.eclipse.core.runtime.xml" />
-		<configuration
+			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" />
-		<configuration
-			type="structuredtextfoldingprovider"
+			target="org.eclipse.core.runtime.xml, org.eclipse.wst.xml.core.xmlsource" />
+		<provisionalConfiguration
+			type="structuredtextfoldingprovider, org.eclipse.wst.xml.core.xmlsource"
 			class="org.eclipse.wst.xml.ui.internal.projection.StructuredTextFoldingProviderXML"
-			target="org.eclipse.core.runtime.xml" />
-		<definition
+			target="org.eclipse.core.runtime.xml, org.eclipse.wst.xml.core.xmlsource" />
+		<provisionalDefinition
 			type="preferencepages"
-			value="org.eclipse.wst.sse.ui.preferences.xml"
-			target="org.eclipse.core.runtime.xml" />
-		<definition
-			type="preferencepages"
-			value="org.eclipse.wst.sse.ui.preferences.xml.source"
-			target="org.eclipse.core.runtime.xml" />
-		<definition
-			type="preferencepages"
-			value="org.eclipse.wst.sse.ui.preferences.xml.templates"
-			target="org.eclipse.core.runtime.xml" />
-		<definition
-			type="preferencepages"
-			value="org.eclipse.wst.sse.ui.preferences.xml.colors"
-			target="org.eclipse.core.runtime.xml" />
+			value="org.eclipse.wst.sse.ui.preferences.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"
+			target="org.eclipse.core.runtime.xml, org.eclipse.wst.xml.core.xmlsource" />
 	</extension>
 
-	<!--  this xmlsource content type is just to handle some special cases of ill-formed xml in a reasonable manner, 
-		and should not be emulated by clients. Use org.eclipse.core.runtime.xml instead. -->
-	<extension point="org.eclipse.wst.sse.ui.extendedconfiguration">
-		<configuration
-			type="textviewerconfiguration"
-			class="org.eclipse.wst.xml.ui.internal.provisional.StructuredTextViewerConfigurationXML"
-			target="org.eclipse.wst.xml.core.xmlsource" />
-		<configuration
-			type="contentoutlineconfiguration"
-			class="org.eclipse.wst.xml.ui.internal.views.contentoutline.XMLContentOutlineConfiguration"
-			target="org.eclipse.wst.xml.core.xmlsource" />
-		<configuration
-			type="propertysheetconfiguration"
-			class="org.eclipse.wst.xml.ui.internal.views.properties.XMLPropertySheetConfiguration"
-			target="org.eclipse.wst.xml.core.xmlsource" />
-		<configuration
-			type="sourceeditingtexttools"
-			class="org.eclipse.wst.xml.ui.internal.provisional.XMLSourceEditingTextTools"
-			target="org.eclipse.wst.xml.core.xmlsource" />
-		<configuration
-			type="characterpairmatcher"
-			class="org.eclipse.wst.xml.ui.internal.text.XMLDocumentRegionEdgeMatcher"
-			target="org.eclipse.wst.xml.core.xmlsource" />
-		<configuration
-			type="structuredtextfoldingprovider"
-			class="org.eclipse.wst.xml.ui.internal.projection.StructuredTextFoldingProviderXML"
-			target="org.eclipse.wst.xml.core.xmlsource" />
-		<definition
-			type="preferencepages"
-			value="org.eclipse.wst.sse.ui.preferences.xml"
-			target="org.eclipse.wst.xml.core.xmlsource" />
-		<definition
-			type="preferencepages"
-			value="org.eclipse.wst.sse.ui.preferences.xml.source"
-			target="org.eclipse.wst.xml.core.xmlsource" />
-		<definition
-			type="preferencepages"
-			value="org.eclipse.wst.sse.ui.preferences.xml.templates"
-			target="org.eclipse.wst.xml.core.xmlsource" />
-		<definition
-			type="preferencepages"
-			value="org.eclipse.wst.sse.ui.preferences.xml.colors"
-			target="org.eclipse.wst.xml.core.xmlsource" />
-	</extension>
-
-
-
 	<extension
 		point="org.eclipse.core.filebuffers.annotationModelCreation">
 		<factory
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
index 5bd9725..9701856 100644
--- 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
@@ -161,7 +161,7 @@
 					public void beginNodeAction(NodeAction action) {
 						super.beginNodeAction(action);
 					}
-	
+
 					public void endNodeAction(NodeAction action) {
 						super.endNodeAction(action);
 					}
@@ -328,22 +328,26 @@
 			fModel.releaseFromEdit();
 		}
 
-		// get model for read and allow text editor to be the one that getmodelforedit
+		// get model for read and allow text editor to be the one that
+		// getModelForEdit
 		IStructuredModel model = null;
-		model = StructuredModelManager.getModelManager().getExistingModelForEdit(document);
+		if (document != null) {
+			model = StructuredModelManager.getModelManager().getExistingModelForEdit(document);
 
-		if (model != null && model instanceof IDOMModel) {
-			Document domDoc = null;
-			model.addModelStateListener(fInternalModelStateListener);
-			ModelQuery mq = ModelQueryUtil.getModelQuery(model);
-			treeExtension.setModelQuery(mq);
-			domDoc = ((IDOMModel) model).getDocument();
-			setInput(domDoc);
-			treeExtension.setIsUnsupportedInput(false);
-		} else {
-			treeExtension.setIsUnsupportedInput(true);
+			if (model != null && model instanceof IDOMModel) {
+				Document domDoc = null;
+				model.addModelStateListener(fInternalModelStateListener);
+				ModelQuery mq = ModelQueryUtil.getModelQuery(model);
+				treeExtension.setModelQuery(mq);
+				domDoc = ((IDOMModel) model).getDocument();
+				setInput(domDoc);
+				treeExtension.setIsUnsupportedInput(false);
+			}
+			else {
+				treeExtension.setIsUnsupportedInput(true);
+			}
 		}
-		
+
 		fModel = model;
 	}
 
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
index 5d31911..7a61fc5 100644
--- 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
@@ -17,7 +17,6 @@
 import java.util.HashMap;
 import java.util.Iterator;
 
-import org.eclipse.core.resources.IResource;
 import org.eclipse.jface.text.BadLocationException;
 import org.eclipse.jface.text.IDocument;
 import org.eclipse.jface.text.ITextViewer;
@@ -30,7 +29,6 @@
 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.sse.ui.internal.contentassist.IResourceDependentProcessor;
 import org.eclipse.wst.xml.core.internal.provisional.text.IXMLPartitions;
 import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
 
@@ -42,7 +40,7 @@
  * 
  * @author pavery
  */
-public class NoRegionContentAssistProcessor implements IContentAssistProcessor, IResourceDependentProcessor, IReleasable {
+public class NoRegionContentAssistProcessor implements IContentAssistProcessor, IReleasable {
 
 	protected char completionProposalAutoActivationCharacters[] = null;
 	protected char contextInformationAutoActivationCharacters[] = null;
@@ -51,7 +49,6 @@
 	protected String fErrorMessage = null;
 	private HashMap fNameToProcessorMap = null;
 	private HashMap fPartitionToProcessorMap = null;
-	protected IResource fResource = null;
 
 	public NoRegionContentAssistProcessor() {
 		super();
@@ -215,17 +212,6 @@
 	}
 
 	/**
-	 * Necessary for certain content assist processors (such as
-	 * JSPJavaContentAssistProcessor). This gets set in
-	 * StructuredTextViewerConfiguration.
-	 *  
-	 */
-	public void initialize(IResource resource) {
-		fResource = resource;
-		setResourceOnProcessors(resource);
-	}
-
-	/**
 	 * Inits map for extra ContentAssistProcessors (useBean, get/setProperty)
 	 */
 	protected void initNameToProcessorMap() {
@@ -267,25 +253,4 @@
 	protected void releasePartitionToProcessorMap() {
 		releaseMap(fPartitionToProcessorMap);
 	}
-
-	private void setResourceOnMap(IResource resource, HashMap map) {
-		if (!map.isEmpty()) {
-			Iterator keys = map.keySet().iterator();
-			Object o = null;
-			while (keys.hasNext()) {
-				o = fPartitionToProcessorMap.get(keys.next());
-				if (o instanceof IResourceDependentProcessor)
-					((IResourceDependentProcessor) o).initialize(resource);
-			}
-		}
-	}
-
-	/**
-	 * @param resource
-	 */
-	private void setResourceOnProcessors(IResource resource) {
-		setResourceOnMap(resource, fPartitionToProcessorMap);
-		setResourceOnMap(resource, fNameToProcessorMap);
-	}
-
 }
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
index bfb47cb..3234825 100644
--- 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
@@ -12,7 +12,7 @@
  *******************************************************************************/
 package org.eclipse.wst.xml.ui.internal.correction;
 
-import org.eclipse.ui.texteditor.ITextEditor;
+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;
@@ -22,8 +22,8 @@
 	protected IQuickAssistProcessor fQuickAssistProcessor;
 	protected IQuickFixProcessor fQuickFixProcessor;
 
-	public CorrectionProcessorXML(ITextEditor editor) {
-		super(editor);
+	public CorrectionProcessorXML(ISourceViewer sourceViewer) {
+		super(sourceViewer);
 	}
 
 	protected IQuickAssistProcessor getQuickAssistProcessor() {
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/editor/HTML2TextReader.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/derived/HTML2TextReader.java
similarity index 67%
copy from bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/editor/HTML2TextReader.java
copy to bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/derived/HTML2TextReader.java
index a35f11c..2f1b643 100644
--- a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/editor/HTML2TextReader.java
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/derived/HTML2TextReader.java
@@ -1,18 +1,16 @@
-/*******************************************************************************
- * 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
+/*
+ * Copyright (c) 2005 IBM Corporation and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/cpl-v10.html
  * 
  * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.ui.internal.editor;
-
-
+ *   IBM - Initial API and implementation
+ *   Jens Lukowski/Innoopract - initial renaming/restructuring
+ * 
+ */
+package org.eclipse.wst.xml.ui.internal.derived;
 
 import java.io.IOException;
 import java.io.PushbackReader;
@@ -26,9 +24,9 @@
 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
+/*
+ * 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
@@ -36,13 +34,13 @@
  */
 public class HTML2TextReader extends SubstitutionTextReader {
 
-	private static final String EMPTY_STRING = ""; //$NON-NLS-1$
+	private static final String EMPTY_STRING= ""; //$NON-NLS-1$
 	private static final Map fgEntityLookup;
 	private static final Set fgTags;
 
 	static {
 
-		fgTags = new HashSet();
+		fgTags= new HashSet();
 		fgTags.add("b"); //$NON-NLS-1$
 		fgTags.add("br"); //$NON-NLS-1$
 		fgTags.add("br/");//$NON-NLS-1$
@@ -55,42 +53,73 @@
 		fgTags.add("ul"); //$NON-NLS-1$
 		fgTags.add("pre"); //$NON-NLS-1$
 
-		fgEntityLookup = new HashMap(7);
+		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$
+		fgEntityLookup.put("quot", "\"");		 //$NON-NLS-1$ //$NON-NLS-2$
 	}
-	private int fBold = 0;
 
-	private int fCounter = 0;
-	private boolean fInParagraph = false;
-	private boolean fIsPreformattedText = false;
-	private int fStartOffset = -1;
+	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.
-	 */
+	 * @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;
+		fTextPresentation= presentation;
 	}
 
-	/**
-	 * @see SubstitutionTextReader#computeSubstitution(char)
+	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();
+			return  processHTMLTag();
 		else if (c == '&')
 			return processEntity();
 		else if (fIsPreformattedText)
@@ -99,38 +128,19 @@
 		return null;
 	}
 
-	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) {
-			}
-		} else {
-			String str = (String) fgEntityLookup.get(symbol);
-			if (str != null) {
-				return str;
-			}
-		}
-		return "&" + symbol; // not found //$NON-NLS-1$
-	}
-
 	private String html2Text(String html) {
+
 		if (html == null || html.length() == 0)
 			return EMPTY_STRING;
 
-		String tag = html;
+		String tag= html;
 		if ('/' == tag.charAt(0))
-			tag = tag.substring(1);
+			tag= tag.substring(1);
 
 		if (!fgTags.contains(tag))
 			return EMPTY_STRING;
 
+
 		if ("pre".equals(html)) { //$NON-NLS-1$
 			startPreformattedText();
 			return EMPTY_STRING;
@@ -168,17 +178,17 @@
 			return EMPTY_STRING;
 		}
 
-		if ("p".equals(html)) { //$NON-NLS-1$
-			fInParagraph = true;
+		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;
+		if ("/p".equals(html))  { //$NON-NLS-1$
+			boolean inParagraph= fInParagraph;
+			fInParagraph= false;
 			return inParagraph ? EMPTY_STRING : LINE_DELIM;
 		}
 
@@ -194,48 +204,28 @@
 	}
 
 	/*
-	 * 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();
-	}
-
-	/*
-	 * A ' <' has been read. Process a html tag
+	 * A '<' has been read. Process a html tag
 	 */
 	private String processHTMLTag() throws IOException {
 
-		StringBuffer buf = new StringBuffer();
+		StringBuffer buf= new StringBuffer();
 		int ch;
 		do {
 
-			ch = nextChar();
+			ch= nextChar();
 
 			while (ch != -1 && ch != '>') {
 				buf.append(Character.toLowerCase((char) ch));
-				ch = nextChar();
-				if (ch == '"') {
+				ch= nextChar();
+				if (ch == '"'){
 					buf.append(Character.toLowerCase((char) ch));
-					ch = nextChar();
-					while (ch != -1 && ch != '"') {
+					ch= nextChar();
+					while (ch != -1 && ch != '"'){
 						buf.append(Character.toLowerCase((char) ch));
-						ch = nextChar();
+						ch= nextChar();
 					}
 				}
-				if (ch == '<') {
+				if (ch == '<'){
 					unread(ch);
 					return '<' + buf.toString();
 				}
@@ -244,10 +234,10 @@
 			if (ch == -1)
 				return null;
 
-			int tagLen = buf.length();
+			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 - 3)))) { //$NON-NLS-1$
+				&& !(tagLen >= 5 && "--".equals(buf.substring(tagLen - 2)))) { //$NON-NLS-1$
 				// unfinished comment
 				buf.append(ch);
 			} else {
@@ -259,46 +249,55 @@
 	}
 
 	private String processPreformattedText(int c) {
-		if (c == '\r' || c == '\n')
+		if  (c == '\r' || c == '\n')
 			fCounter++;
 		return null;
 	}
 
-	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 stopBold() {
-		--fBold;
-		if (fBold == 0) {
-			if (fTextPresentation != null) {
-				fTextPresentation.addStyleRange(new StyleRange(fStartOffset, fCounter - fStartOffset, null, null, SWT.BOLD));
-			}
-			fStartOffset = -1;
-		}
-	}
-
-	protected void stopPreformattedText() {
-		fIsPreformattedText = false;
-		setSkipWhitespace(true);
-	}
-
 
 	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/editor/HTMLTextPresenter.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/derived/HTMLTextPresenter.java
similarity index 84%
copy from bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/editor/HTMLTextPresenter.java
copy to bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/derived/HTMLTextPresenter.java
index c3a1faa..7d60808 100644
--- a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/editor/HTMLTextPresenter.java
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/derived/HTMLTextPresenter.java
@@ -1,18 +1,16 @@
-/*******************************************************************************
- * 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
+/*
+ * Copyright (c) 2005 IBM Corporation and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/cpl-v10.html
  * 
  * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.ui.internal.editor;
-
-
+ *   IBM - Initial API and implementation
+ *   Jens Lukowski/Innoopract - initial renaming/restructuring
+ * 
+ */
+package org.eclipse.wst.xml.ui.internal.derived;
 
 import java.io.IOException;
 import java.io.Reader;
@@ -25,29 +23,31 @@
 import org.eclipse.swt.custom.StyleRange;
 import org.eclipse.swt.graphics.GC;
 import org.eclipse.swt.widgets.Display;
-import org.eclipse.wst.sse.ui.internal.Logger;
+import org.eclipse.wst.xml.ui.internal.Logger;
 
-
-/**
+/*
  * Copied from org.eclipse.jdt.internal.ui.text.HTMLTextPresenter
- * Modifications were made to use sed Logger to log exception, and the
+ * Modifications were made to use own Logger to log exception, and the
  * ellipses constant
  */
 public class HTMLTextPresenter implements DefaultInformationControl.IInformationPresenter {
 	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);
 	}
 
-	public HTMLTextPresenter(boolean enforceUpperLineLimit) {
-		super();
-		fEnforceUpperLineLimit = enforceUpperLineLimit;
+	protected Reader createReader(String hoverInfo, TextPresentation presentation) {
+		return new HTML2TextReader(new StringReader(hoverInfo), presentation);
 	}
 
 	protected void adaptTextPresentation(TextPresentation presentation, int offset, int insertLength) {
@@ -86,10 +86,6 @@
 		fCounter += length;
 	}
 
-	protected Reader createReader(String hoverInfo, TextPresentation presentation) {
-		return new HTML2TextReader(new StringReader(hoverInfo), presentation);
-	}
-
 	private String getIndent(String line) {
 		int length = line.length();
 
@@ -100,31 +96,6 @@
 		return (i == length ? line : line.substring(0, i)) + " "; //$NON-NLS-1$
 	}
 
-	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();
-	}
-
 	/*
 	 * @see IHoverInformationPresenter#updatePresentation(Display display,
 	 *      String, TextPresentation, int, int)
@@ -180,19 +151,44 @@
 				maxNumberOfLines--;
 			}
 
-			if (line != null) {
+			if (line != null && buffer.length() > 0) {
 				append(buffer, LINE_DELIM, lineFormatted ? presentation : null);
-				append(buffer, ELLIPSES, presentation); //$NON-NLS-1$
+				append(buffer, ELLIPSES, presentation);
 			}
 
 			return trim(buffer, presentation);
 
 		} catch (IOException e) {
-			Logger.logException(e); // log exception
+			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/editor/LineBreakingReader.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/derived/LineBreakingReader.java
similarity index 79%
rename from bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/editor/LineBreakingReader.java
rename to bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/derived/LineBreakingReader.java
index 655f23c..f04e897 100644
--- a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/editor/LineBreakingReader.java
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/derived/LineBreakingReader.java
@@ -1,18 +1,16 @@
-/*******************************************************************************
- * 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
+/*
+ * Copyright (c) 2005 IBM Corporation and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/cpl-v10.html
  * 
  * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.ui.internal.editor;
-
-
+ *   IBM - Initial API and implementation
+ *   Jens Lukowski/Innoopract - initial renaming/restructuring
+ * 
+ */
+package org.eclipse.wst.xml.ui.internal.derived;
 
 import java.io.BufferedReader;
 import java.io.IOException;
@@ -22,8 +20,8 @@
 import org.eclipse.swt.graphics.GC;
 
 /**
- * Copied from org.eclipse.jdt.internal.ui.text.LineBreakingReader No
- * modifications were made
+ * Copied from org.eclipse.jdt.internal.ui.text.LineBreakingReader.
+ * Modifications were made to fix warnings.
  */
 /*
  * Not a real reader. Could change if requested
@@ -70,9 +68,8 @@
 			if (nextWidth > fMaxWidth) {
 				if (currWidth > 0) {
 					return currOffset;
-				} else {
-					return nextOffset;
 				}
+				return nextOffset;
 			}
 			currWidth = nextWidth;
 			currOffset = nextOffset;
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/derived/SingleCharReader.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/derived/SingleCharReader.java
new file mode 100644
index 0000000..f87e2b8
--- /dev/null
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/derived/SingleCharReader.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 2005 IBM Corporation and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ * 
+ * Contributors:
+ *   IBM - Initial API and implementation
+ *   Jens Lukowski/Innoopract - initial renaming/restructuring
+ * 
+ */
+package org.eclipse.wst.xml.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/editor/SubstitutionTextReader.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/derived/SubstitutionTextReader.java
similarity index 66%
copy from bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/editor/SubstitutionTextReader.java
copy to bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/derived/SubstitutionTextReader.java
index 0ff800f..df76281 100644
--- a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/editor/SubstitutionTextReader.java
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/derived/SubstitutionTextReader.java
@@ -1,26 +1,24 @@
-/*******************************************************************************
- * 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
+/*
+ * Copyright (c) 2005 IBM Corporation and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
+ * http://www.eclipse.org/legal/cpl-v10.html
  * 
  * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.sse.ui.internal.editor;
-
-
+ *   IBM - Initial API and implementation
+ *   Jens Lukowski/Innoopract - initial renaming/restructuring
+ * 
+ */
+package org.eclipse.wst.xml.ui.internal.derived;
 
 import java.io.IOException;
 import java.io.Reader;
 
-/**
- * Copied from org.eclipse.jdt.internal.ui.text.SubstitutionTextReader
- * Also copied in org.eclipse.wst.javascript.common.ui.contentassist.javadoc.SubstitutionTextReader
- * Modifications were made to read() to allow whitespaces
+/*
+ * 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
@@ -30,19 +28,19 @@
 public abstract class SubstitutionTextReader extends SingleCharReader {
 
 	protected static final String LINE_DELIM = System.getProperty("line.separator", "\n"); //$NON-NLS-1$ //$NON-NLS-2$
-	private StringBuffer fBuffer;
-	private int fCharAfterWhiteSpace;
-	private int fIndex;
 
 	private Reader fReader;
-
-	private boolean fReadFromBuffer;
+	protected boolean fWasWhiteSpace;
+	private int fCharAfterWhiteSpace;
 
 	/**
 	 * Tells whether white space characters are skipped.
 	 */
 	private boolean fSkipWhiteSpace = true;
-	private boolean fWasWhiteSpace;
+
+	private boolean fReadFromBuffer;
+	private StringBuffer fBuffer;
+	private int fIndex;
 
 
 	protected SubstitutionTextReader(Reader reader) {
@@ -55,13 +53,6 @@
 	}
 
 	/**
-	 * @see Reader#close()
-	 */
-	public void close() throws IOException {
-		fReader.close();
-	}
-
-	/**
 	 * Implement to compute the substitution for the given character and if
 	 * necessary subsequent characters. Use <code>nextChar</code> to read
 	 * subsequent characters.
@@ -75,10 +66,6 @@
 		return fReader;
 	}
 
-	protected final boolean isSkippingWhitespace() {
-		return fSkipWhiteSpace;
-	}
-
 	/**
 	 * Returns the next character.
 	 */
@@ -91,24 +78,23 @@
 				fIndex = 0;
 			}
 			return ch;
-		} else {
-			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;
 		}
+		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;
 	}
 
 	/**
@@ -128,28 +114,12 @@
 				c = nextChar();
 			}
 
-		} while (fSkipWhiteSpace && fWasWhiteSpace && ((c == ' ') && !fReadFromBuffer)); // AFW
-		// - if
-		// whitespace
-		// is
-		// from
-		// buffer,
-		// then
-		// it
-		// should
-		// be
-		// read
-		fWasWhiteSpace = ((c == ' ' && !fReadFromBuffer) || c == '\r' || c == '\n'); // AFW
-		// - if
-		// whitespace
-		// is
-		// from
-		// buffer,
-		// then
-		// it
-		// should
-		// be
-		// read
+		} 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;
 	}
 
@@ -161,6 +131,13 @@
 	}
 
 	/**
+	 * @see Reader#close()
+	 */
+	public void close() throws IOException {
+		fReader.close();
+	}
+
+	/**
 	 * @see Reader#reset()
 	 */
 	public void reset() throws IOException {
@@ -174,4 +151,8 @@
 	protected final void setSkipWhitespace(boolean state) {
 		fSkipWhiteSpace = state;
 	}
+
+	protected final boolean isSkippingWhitespace() {
+		return fSkipWhiteSpace;
+	}
 }
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/provisional/StructuredTextViewerConfigurationXML.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/provisional/StructuredTextViewerConfigurationXML.java
index 9ec15ba..3704a94 100644
--- a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/provisional/StructuredTextViewerConfigurationXML.java
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/provisional/StructuredTextViewerConfigurationXML.java
@@ -17,9 +17,10 @@
 import java.util.Vector;
 
 import org.eclipse.core.runtime.Preferences;
-import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.text.DefaultInformationControl;
 import org.eclipse.jface.text.IAutoEditStrategy;
-import org.eclipse.jface.text.IDocument;
+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.contentassist.ContentAssistant;
@@ -34,20 +35,16 @@
 import org.eclipse.jface.text.reconciler.IReconciler;
 import org.eclipse.jface.text.reconciler.IReconcilingStrategy;
 import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Shell;
 import org.eclipse.ui.texteditor.AbstractDecoratedTextEditorPreferenceConstants;
-import org.eclipse.ui.texteditor.ITextEditor;
-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.provisional.text.IStructuredPartitionTypes;
-import org.eclipse.wst.sse.ui.internal.StructuredTextEditor;
+import org.eclipse.wst.sse.ui.internal.SSEUIPlugin;
 import org.eclipse.wst.sse.ui.internal.format.StructuredFormattingStrategy;
 import org.eclipse.wst.sse.ui.internal.provisional.StructuredTextViewerConfiguration;
 import org.eclipse.wst.sse.ui.internal.provisional.preferences.CommonEditorPreferenceNames;
-import org.eclipse.wst.sse.ui.internal.provisional.style.IHighlighter;
 import org.eclipse.wst.sse.ui.internal.provisional.style.LineStyleProvider;
 import org.eclipse.wst.sse.ui.internal.reconcile.StructuredRegionProcessor;
-import org.eclipse.wst.sse.ui.internal.taginfo.AnnotationHoverProcessor;
-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;
 import org.eclipse.wst.xml.core.internal.XMLCorePlugin;
@@ -60,37 +57,40 @@
 import org.eclipse.wst.xml.ui.internal.contentassist.NoRegionContentAssistProcessor;
 import org.eclipse.wst.xml.ui.internal.contentassist.XMLContentAssistProcessor;
 import org.eclipse.wst.xml.ui.internal.correction.CorrectionProcessorXML;
+import org.eclipse.wst.xml.ui.internal.derived.HTMLTextPresenter;
 import org.eclipse.wst.xml.ui.internal.doubleclick.XMLDoubleClickStrategy;
 import org.eclipse.wst.xml.ui.internal.hyperlink.XMLHyperlinkDetector;
 import org.eclipse.wst.xml.ui.internal.style.LineStyleProviderForXML;
-import org.eclipse.wst.xml.ui.internal.taginfo.XMLBestMatchHoverProcessor;
 import org.eclipse.wst.xml.ui.internal.taginfo.XMLInformationProvider;
 import org.eclipse.wst.xml.ui.internal.taginfo.XMLTagInfoHoverProcessor;
 import org.eclipse.wst.xml.ui.internal.validation.StructuredTextReconcilingStrategyForMarkup;
 
 /**
- * This class provides
+ * This class provides a SourceViewerConfiguration for editing XML content
+ * type. Not intended to be subclassed.
  * 
  * @plannedfor 1.0
  */
 public class StructuredTextViewerConfigurationXML extends StructuredTextViewerConfiguration {
-
-	InformationPresenter fInformationPresenter = null;
-
-	public StructuredTextViewerConfigurationXML() {
-		super();
-	}
-
-	public StructuredTextViewerConfigurationXML(IPreferenceStore store) {
-		super(store);
-	}
-
 	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.text.source.SourceViewerConfiguration#getAutoEditStrategies(org.eclipse.jface.text.source.ISourceViewer,
-	 *      java.lang.String)
+	 * One instance per configuration because not sourceviewer-specific and
+	 * it's a String array
 	 */
+	private String[] fConfiguredContentTypes;
+	/*
+	 * One instance per configuration because not sourceviewer-specific and
+	 * requires special uninstall
+	 */
+	private IContentAssistant fCorrectionAssistant;
+	/*
+	 * One instance per configuration
+	 */
+	private LineStyleProvider fLineStyleProviderForXML;
+	/*
+	 * One instance per configuration
+	 */
+	private IReconciler fReconciler;
+
 	public IAutoEditStrategy[] getAutoEditStrategies(ISourceViewer sourceViewer, String contentType) {
 		List allStrategies = new ArrayList(0);
 
@@ -98,7 +98,7 @@
 		for (int i = 0; i < superStrategies.length; i++) {
 			allStrategies.add(superStrategies[i]);
 		}
-		
+
 		if (contentType == IXMLPartitions.XML_DEFAULT) {
 			allStrategies.add(new StructuredAutoEditStrategyXML());
 		}
@@ -113,31 +113,41 @@
 
 	public String[] getConfiguredContentTypes(ISourceViewer sourceViewer) {
 
-		if (configuredContentTypes == null) {
+		if (fConfiguredContentTypes == null) {
 			String[] xmlTypes = StructuredTextPartitionerForXML.getConfiguredContentTypes();
-			configuredContentTypes = new String[xmlTypes.length + 2];
-			configuredContentTypes[0] = IStructuredPartitionTypes.DEFAULT_PARTITION;
-			configuredContentTypes[1] = IStructuredPartitionTypes.UNKNOWN_PARTITION;
+			fConfiguredContentTypes = new String[xmlTypes.length + 2];
+			fConfiguredContentTypes[0] = IStructuredPartitionTypes.DEFAULT_PARTITION;
+			fConfiguredContentTypes[1] = IStructuredPartitionTypes.UNKNOWN_PARTITION;
 			int index = 0;
-			System.arraycopy(xmlTypes, 0, configuredContentTypes, index += 2, xmlTypes.length);
+			System.arraycopy(xmlTypes, 0, fConfiguredContentTypes, index += 2, xmlTypes.length);
 		}
-		return configuredContentTypes;
+		return fConfiguredContentTypes;
 	}
 
 	public IContentAssistant getContentAssistant(ISourceViewer sourceViewer) {
+		ContentAssistant assistant = (ContentAssistant)super.getContentAssistant(sourceViewer);
 
-		IContentAssistant ca = super.getContentAssistant(sourceViewer);
-		if (ca != null && ca instanceof ContentAssistant) {
-			ContentAssistant contentAssistant = (ContentAssistant) ca;
-			IContentAssistProcessor xmlContentAssistProcessor = new XMLContentAssistProcessor();
-			IContentAssistProcessor noRegionProcessor = new NoRegionContentAssistProcessor();
-			setContentAssistProcessor(contentAssistant, xmlContentAssistProcessor, IStructuredPartitionTypes.DEFAULT_PARTITION);
-			setContentAssistProcessor(contentAssistant, xmlContentAssistProcessor, IXMLPartitions.XML_DEFAULT);
-			setContentAssistProcessor(contentAssistant, noRegionProcessor, IStructuredPartitionTypes.UNKNOWN_PARTITION);
-		}
-		return ca;
+		// create content assist processors to be used
+		IContentAssistProcessor xmlContentAssistProcessor = new XMLContentAssistProcessor();
+		IContentAssistProcessor noRegionProcessor = new NoRegionContentAssistProcessor();
+
+		// add processors to content assistant
+		assistant.setContentAssistProcessor(xmlContentAssistProcessor, IStructuredPartitionTypes.DEFAULT_PARTITION);
+		assistant.setContentAssistProcessor(xmlContentAssistProcessor, IXMLPartitions.XML_DEFAULT);
+		assistant.setContentAssistProcessor(noRegionProcessor, IStructuredPartitionTypes.UNKNOWN_PARTITION);
+
+		return assistant;
 	}
 
+	/**
+	 * Returns the content formatter ready to be used with the given source
+	 * viewer.
+	 * 
+	 * @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) {
 		final MultiPassContentFormatter formatter = new MultiPassContentFormatter(getConfiguredDocumentPartitioning(sourceViewer), IXMLPartitions.XML_DEFAULT);
 
@@ -147,22 +157,38 @@
 	}
 
 	public IContentAssistant getCorrectionAssistant(ISourceViewer sourceViewer) {
-		IContentAssistant ca = super.getCorrectionAssistant(sourceViewer);
+		/*
+		 * Ensure that only one assistant is ever returned. Creating a second
+		 * assistant that is added to a viewer can cause odd key-eating by the
+		 * wrong one. Also do not create correction assistant if sourceviewer
+		 * is null.
+		 */
+		if (fCorrectionAssistant == null && sourceViewer != null) {
+			ContentAssistant assistant;
 
-		if (ca != null && ca instanceof ContentAssistant) {
-			ContentAssistant correctionAssistant = (ContentAssistant) ca;
-			ITextEditor editor = getTextEditor();
-			if (editor != null) {
-				IContentAssistProcessor correctionProcessor = new CorrectionProcessorXML(editor);
-				correctionAssistant.setContentAssistProcessor(correctionProcessor, IXMLPartitions.XML_DEFAULT);
-				correctionAssistant.setContentAssistProcessor(correctionProcessor, IXMLPartitions.XML_CDATA);
-				correctionAssistant.setContentAssistProcessor(correctionProcessor, IXMLPartitions.XML_COMMENT);
-				correctionAssistant.setContentAssistProcessor(correctionProcessor, IXMLPartitions.XML_DECLARATION);
-				correctionAssistant.setContentAssistProcessor(correctionProcessor, IXMLPartitions.XML_PI);
-				correctionAssistant.setContentAssistProcessor(correctionProcessor, IXMLPartitions.DTD_SUBSET);
+			IContentAssistant ca = super.getCorrectionAssistant(sourceViewer);
+			if (!(ca instanceof ContentAssistant)) {
+				assistant = new ContentAssistant();
+
+				// content assistant configurations
+				assistant.setDocumentPartitioning(getConfiguredDocumentPartitioning(sourceViewer));
 			}
+			else {
+				assistant = (ContentAssistant) ca;
+			}
+			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);
+			}
+			fCorrectionAssistant = assistant;
 		}
-		return ca;
+
+		return fCorrectionAssistant;
 	}
 
 	public ITextDoubleClickStrategy getDoubleClickStrategy(ISourceViewer sourceViewer, String contentType) {
@@ -175,119 +201,6 @@
 		return doubleClickStrategy;
 	}
 
-	public IHighlighter getHighlighter(ISourceViewer sourceViewer) {
-
-		IHighlighter highlighter = super.getHighlighter(sourceViewer);
-		if (highlighter != null) {
-			LineStyleProvider xmlProvider = new LineStyleProviderForXML();
-			highlighter.addProvider(IXMLPartitions.XML_DEFAULT, xmlProvider);
-			highlighter.addProvider(IXMLPartitions.XML_CDATA, xmlProvider);
-			highlighter.addProvider(IXMLPartitions.XML_COMMENT, xmlProvider);
-			highlighter.addProvider(IXMLPartitions.XML_DECLARATION, xmlProvider);
-			highlighter.addProvider(IXMLPartitions.XML_PI, xmlProvider);
-		}
-		return highlighter;
-	}
-
-	public IInformationPresenter getInformationPresenter(ISourceViewer sourceViewer) {
-
-		if (fInformationPresenter == null) {
-			fInformationPresenter = new InformationPresenter(getInformationPresenterControlCreator(sourceViewer));
-			IInformationProvider xmlInformationProvider = new XMLInformationProvider();
-			fInformationPresenter.setInformationProvider(xmlInformationProvider, IStructuredPartitionTypes.DEFAULT_PARTITION);
-			fInformationPresenter.setInformationProvider(xmlInformationProvider, IXMLPartitions.XML_DEFAULT);
-			fInformationPresenter.setSizeConstraints(60, 10, true, true);
-			fInformationPresenter.setDocumentPartitioning(getConfiguredDocumentPartitioning(sourceViewer));
-		}
-		return fInformationPresenter;
-	}
-
-	public IReconciler getReconciler(ISourceViewer sourceViewer) {
-
-		if (fReconciler != null) {
-			// a reconciler should always be installed or disposed of
-			if (!fReconciler.isInstalled()) {
-				fReconciler = null;
-			}
-		}
-
-		if (fReconciler == null) {
-			fReconciler = new StructuredRegionProcessor();
-			fReconciler.setDocumentPartitioning(getConfiguredDocumentPartitioning(sourceViewer));
-		}
-
-		boolean reconcilingEnabled = fPreferenceStore.getBoolean(CommonEditorPreferenceNames.EVALUATE_TEMPORARY_PROBLEMS);
-
-		if (!reconcilingEnabled)
-			return fReconciler;
-
-		// the second time through, the strategies are set
-		if (fReconciler != null) {
-
-			IDocument doc = ((StructuredTextEditor) editorPart).getDocumentProvider().getDocument(editorPart.getEditorInput());
-			IStructuredModel sModel = StructuredModelManager.getModelManager().getExistingModelForRead(doc);
-
-			try {
-
-				if (sModel != null) {
-
-					IReconcilingStrategy markupStrategy = new StructuredTextReconcilingStrategyForMarkup((ITextEditor) editorPart);
-					fReconciler.setReconcilingStrategy(markupStrategy, IXMLPartitions.XML_DEFAULT);
-					fReconciler.setDefaultStrategy(markupStrategy);
-
-					String contentTypeId = sModel.getContentTypeIdentifier();
-					if (contentTypeId != null)
-						fReconciler.setValidatorStrategy(createValidatorStrategy(contentTypeId));
-				}
-			} finally {
-				if (sModel != null)
-					sModel.releaseFromRead();
-			}
-		}
-		return fReconciler;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.text.source.SourceViewerConfiguration#getTextHover(org.eclipse.jface.text.source.ISourceViewer,
-	 *      java.lang.String, int)
-	 */
-	public ITextHover getTextHover(ISourceViewer sourceViewer, String contentType, int stateMask) {
-		// look for appropriate text hover processor to return based on
-		// content type and state mask
-		if ((contentType == IStructuredPartitionTypes.DEFAULT_PARTITION) || (contentType == IXMLPartitions.XML_DEFAULT)) {
-			// check which of xml's text hover is handling stateMask
-			TextHoverManager.TextHoverDescriptor[] hoverDescs = getTextHovers();
-			int i = 0;
-			while (i < hoverDescs.length) {
-				if (hoverDescs[i].isEnabled() && EditorUtility.computeStateMask(hoverDescs[i].getModifierString()) == stateMask) {
-					String hoverType = hoverDescs[i].getId();
-					if (TextHoverManager.COMBINATION_HOVER.equalsIgnoreCase(hoverType))
-						return new XMLBestMatchHoverProcessor();
-					else if (TextHoverManager.PROBLEM_HOVER.equalsIgnoreCase(hoverType))
-						return new ProblemAnnotationHoverProcessor();
-					else if (TextHoverManager.ANNOTATION_HOVER.equalsIgnoreCase(hoverType))
-						return new AnnotationHoverProcessor();
-					else if (TextHoverManager.DOCUMENTATION_HOVER.equalsIgnoreCase(hoverType))
-						return new XMLTagInfoHoverProcessor();
-				}
-				i++;
-			}
-		}
-		return super.getTextHover(sourceViewer, contentType, stateMask);
-	}
-
-	public void unConfigure(ISourceViewer viewer) {
-
-		super.unConfigure(viewer);
-
-		// InformationPresenters
-		if (fInformationPresenter != null) {
-			fInformationPresenter.uninstall();
-		}
-	}
-
 	/*
 	 * (non-Javadoc)
 	 * 
@@ -329,7 +242,8 @@
 
 				if (i != 0)
 					appendTab = true;
-			} else {
+			}
+			else {
 				for (int j = 0; j < i; j++)
 					prefix.append(' ');
 
@@ -351,4 +265,130 @@
 
 		return (String[]) vector.toArray(new String[vector.size()]);
 	}
+
+	/**
+	 * Returns the information control creator. The creator is a factory
+	 * creating information controls for the given source viewer.
+	 * 
+	 * @param sourceViewer
+	 *            the source viewer to be configured by this configuration
+	 * @return the information control creator or <code>null</code> if no
+	 *         information support should be installed
+	 * @since 2.0
+	 */
+	public IInformationControlCreator getInformationControlCreator(ISourceViewer sourceViewer) {
+		// used by hover help
+		return new IInformationControlCreator() {
+			public IInformationControl createInformationControl(Shell parent) {
+				return new DefaultInformationControl(parent, SWT.NONE, new HTMLTextPresenter(false));
+			}
+		};
+	}
+
+	public IInformationPresenter getInformationPresenter(ISourceViewer sourceViewer) {
+		InformationPresenter presenter = new InformationPresenter(getInformationPresenterControlCreator(sourceViewer));
+
+		// information presenter configurations
+		presenter.setSizeConstraints(60, 10, true, true);
+		presenter.setDocumentPartitioning(getConfiguredDocumentPartitioning(sourceViewer));
+
+		// information providers to be used
+		IInformationProvider xmlInformationProvider = new XMLInformationProvider();
+
+		// add information providers to information presenter
+		presenter.setInformationProvider(xmlInformationProvider, IStructuredPartitionTypes.DEFAULT_PARTITION);
+		presenter.setInformationProvider(xmlInformationProvider, IXMLPartitions.XML_DEFAULT);
+
+		return presenter;
+	}
+
+	/**
+	 * 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));
+			}
+		};
+	}
+
+	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 IReconciler getReconciler(ISourceViewer sourceViewer) {
+		boolean reconcilingEnabled = fPreferenceStore.getBoolean(CommonEditorPreferenceNames.EVALUATE_TEMPORARY_PROBLEMS);
+		if (sourceViewer == null || !reconcilingEnabled)
+			return null;
+
+		/*
+		 * Only create reconciler if sourceviewer is present
+		 */
+		if (fReconciler == null && sourceViewer != null) {
+			StructuredRegionProcessor reconciler = new StructuredRegionProcessor();
+
+			// reconciler configurations
+			reconciler.setDocumentPartitioning(getConfiguredDocumentPartitioning(sourceViewer));
+
+			// reconciling strategies for reconciler
+			IReconcilingStrategy markupStrategy = new StructuredTextReconcilingStrategyForMarkup(sourceViewer);
+
+			// add reconciling strategies
+			reconciler.setReconcilingStrategy(markupStrategy, IXMLPartitions.XML_DEFAULT);
+			reconciler.setDefaultStrategy(markupStrategy);
+
+			fReconciler = reconciler;
+		}
+		return fReconciler;
+	}
+
+	public ITextHover getTextHover(ISourceViewer sourceViewer, String contentType, int stateMask) {
+		ITextHover textHover = null;
+
+		// look for appropriate text hover processor to return based on
+		// content type and state mask
+		if ((contentType == IStructuredPartitionTypes.DEFAULT_PARTITION) || (contentType == IXMLPartitions.XML_DEFAULT)) {
+			// check which of xml's text hover is handling stateMask
+			TextHoverManager manager = SSEUIPlugin.getDefault().getTextHoverManager();
+			TextHoverManager.TextHoverDescriptor[] hoverDescs = manager.getTextHovers();
+			int i = 0;
+			while (i < hoverDescs.length && textHover == null) {
+				if (hoverDescs[i].isEnabled() && EditorUtility.computeStateMask(hoverDescs[i].getModifierString()) == stateMask) {
+					String hoverType = hoverDescs[i].getId();
+					if (TextHoverManager.COMBINATION_HOVER.equalsIgnoreCase(hoverType))
+						textHover = manager.createBestMatchHover(new XMLTagInfoHoverProcessor());
+					else if (TextHoverManager.DOCUMENTATION_HOVER.equalsIgnoreCase(hoverType))
+						textHover = new XMLTagInfoHoverProcessor();
+				}
+				i++;
+			}
+		}
+
+		// no appropriate text hovers found, try super
+		if (textHover == null)
+			textHover = super.getTextHover(sourceViewer, contentType, stateMask);
+
+		return textHover;
+	}
 }
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
index 5e5708c..a56a635 100644
--- 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
@@ -24,11 +24,6 @@
 public class LineStyleProviderForXML extends AbstractLineStyleProvider implements LineStyleProvider {
 	public LineStyleProviderForXML() {
 		super();
-		loadColors();
-	}
-
-	protected void clearColors() {
-		getTextAttributes().clear();
 	}
 
 	protected TextAttribute getAttributeFor(ITextRegion region) {
@@ -149,9 +144,11 @@
 		}
 	}
 
+	/**
+	 * Loads text attributes into map. Make sure map is cleared before calling
+	 * this.
+	 */
 	protected void loadColors() {
-		clearColors();
-
 		addTextAttribute(IStyleConstantsXML.TAG_NAME);
 		addTextAttribute(IStyleConstantsXML.TAG_BORDER);
 		addTextAttribute(IStyleConstantsXML.TAG_ATTRIBUTE_NAME);
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/taginfo/XMLBestMatchHoverProcessor.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/taginfo/XMLBestMatchHoverProcessor.java
deleted file mode 100644
index 90b2024..0000000
--- a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/taginfo/XMLBestMatchHoverProcessor.java
+++ /dev/null
@@ -1,39 +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.xml.ui.internal.taginfo;
-
-import org.eclipse.jface.text.ITextHover;
-import org.eclipse.wst.sse.ui.internal.taginfo.AbstractBestMatchHoverProcessor;
-
-
-/**
- * Provides the best xml hover help documentation (by using other hover help
- * processors) Priority of hover help processors is: ProblemHoverProcessor,
- * XMLTagInfoHoverProcessor, AnnotationHoverProcessor
- */
-public class XMLBestMatchHoverProcessor extends AbstractBestMatchHoverProcessor {
-	XMLTagInfoHoverProcessor fTagInfoHover;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.sse.ui.structured.taginfo.AbstractBestMatchHoverProcessor#getTagInfoHover()
-	 */
-	protected ITextHover getTagInfoHover() {
-		if (fTagInfoHover == null) {
-			fTagInfoHover = new XMLTagInfoHoverProcessor();
-		}
-		return fTagInfoHover;
-	}
-
-}
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
index ac4e54d..3dfee20 100644
--- 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
@@ -15,9 +15,11 @@
 
 
 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)
@@ -26,10 +28,10 @@
  */
 public class XMLInformationProvider implements IInformationProvider, IInformationProviderExtension {
 
-	private XMLBestMatchHoverProcessor fTextHover = null;
+	private ITextHover fTextHover = null;
 
 	public XMLInformationProvider() {
-		fTextHover = new XMLBestMatchHoverProcessor();
+		fTextHover = SSEUIPlugin.getDefault().getTextHoverManager().createBestMatchHover(new XMLTagInfoHoverProcessor());
 	}
 
 	/*
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/validation/StructuredTextReconcilingStrategyForMarkup.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/validation/StructuredTextReconcilingStrategyForMarkup.java
index 4178890..efa0a2d 100644
--- a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/validation/StructuredTextReconcilingStrategyForMarkup.java
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/validation/StructuredTextReconcilingStrategyForMarkup.java
@@ -12,7 +12,7 @@
  *******************************************************************************/
 package org.eclipse.wst.xml.ui.internal.validation;
 
-import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.jface.text.source.ISourceViewer;
 import org.eclipse.wst.sse.ui.internal.reconcile.AbstractStructuredTextReconcilingStrategy;
 
 
@@ -23,8 +23,8 @@
  */
 public class StructuredTextReconcilingStrategyForMarkup extends AbstractStructuredTextReconcilingStrategy {
 
-	public StructuredTextReconcilingStrategyForMarkup(ITextEditor editor) {
-		super(editor);
+	public StructuredTextReconcilingStrategyForMarkup(ISourceViewer sourceViewer) {
+		super(sourceViewer);
 	}
 
 	public void createReconcileSteps() {