several fixes and some renames to 'internal'
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/Assert.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/Assert.java
new file mode 100644
index 0000000..c634c56
--- /dev/null
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/Assert.java
@@ -0,0 +1,123 @@
+/*******************************************************************************
+ * 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.jst.jsp.core.internal;
+
+
+
+/**
+ * <code>Assert</code> is useful for for embedding runtime sanity checks in
+ * code. The predicate methods all test a condition and throw some type of
+ * unchecked exception if the condition does not hold.
+ * <p>
+ * Assertion failure exceptions, like most runtime exceptions, are thrown when
+ * something is misbehaving. Assertion failures are invariably unspecified
+ * behavior; consequently, clients should never rely on these being thrown
+ * (and certainly should not being catching them specifically).
+ * </p>
+ */
+public final class Assert {
+
+	/**
+	 * <code>AssertionFailedException</code> is a runtime exception thrown
+	 * by some of the methods in <code>Assert</code>.
+	 * <p>
+	 * This class is not declared public to prevent some misuses; programs
+	 * that catch or otherwise depend on assertion failures are susceptible to
+	 * unexpected breakage when assertions in the code are added or removed.
+	 * </p>
+	 */
+	class AssertionFailedException extends RuntimeException {
+		/**
+		 * Comment for <code>serialVersionUID</code>
+		 */
+		private static final long serialVersionUID = 1L;
+
+		/**
+		 * Constructs a new exception.
+		 */
+		public AssertionFailedException() {
+			super();
+		}
+
+		/**
+		 * Constructs a new exception with the given message.
+		 */
+		public AssertionFailedException(String detail) {
+			super(detail);
+		}
+	}
+
+	/**
+	 * Asserts that an argument is legal. If the given boolean is not
+	 * <code>true</code>, an <code>IllegalArgumentException</code> is
+	 * thrown. The given message is included in that exception, to aid
+	 * debugging.
+	 * 
+	 * @param expression
+	 *            the outcode of the check
+	 * @param message
+	 *            the message to include in the exception
+	 * @return <code>true</code> if the check passes (does not return if the
+	 *         check fails)
+	 * @exception IllegalArgumentException
+	 *                if the legality test failed
+	 */
+	public static boolean isLegal(boolean expression, String message) {
+		if (!expression)
+			throw new IllegalArgumentException(message);
+		return expression;
+	}
+
+	/**
+	 * Asserts that the given object is not <code>null</code>. If this is
+	 * not the case, some kind of unchecked exception is thrown. The given
+	 * message is included in that exception, to aid debugging.
+	 * 
+	 * @param object
+	 *            the value to test
+	 * @param message
+	 *            the message to include in the exception
+	 * @exception IllegalArgumentException
+	 *                if the object is <code>null</code>
+	 */
+	public static void isNotNull(Object object, String message) {
+		if (object == null) {
+			Logger.log(Logger.ERROR, "null_argument: " + message); //$NON-NLS-1$
+			throw new Assert().new AssertionFailedException(message);
+		}
+	}
+
+	/**
+	 * Asserts that the given boolean is <code>true</code>. If this is not
+	 * the case, some kind of unchecked exception is thrown. The given message
+	 * is included in that exception, to aid debugging.
+	 * 
+	 * @param expression
+	 *            the outcode of the check
+	 * @param message
+	 *            the message to include in the exception
+	 * @return <code>true</code> if the check passes (does not return if the
+	 *         check fails)
+	 */
+	public static boolean isTrue(boolean expression, String message) {
+		if (!expression) {
+			Logger.log(Logger.ERROR, "assertion failed: " + message); //$NON-NLS-1$
+			throw new Assert().new AssertionFailedException(message);
+		}
+		return expression;
+	}
+
+	/* This class is not intended to be instantiated. */
+	private Assert() {
+	}
+}
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contentmodel/tld/TLDCMDocumentManager.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contentmodel/tld/TLDCMDocumentManager.java
index 330bd64..c5fd9db 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contentmodel/tld/TLDCMDocumentManager.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contentmodel/tld/TLDCMDocumentManager.java
@@ -27,6 +27,7 @@
 import java.util.Stack;
 
 import org.eclipse.core.filebuffers.FileBuffers;
+import org.eclipse.core.filebuffers.ITextFileBuffer;
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IResource;
 import org.eclipse.core.resources.ResourcesPlugin;
@@ -36,7 +37,6 @@
 import org.eclipse.core.runtime.Platform;
 import org.eclipse.core.runtime.QualifiedName;
 import org.eclipse.core.runtime.content.IContentDescription;
-import org.eclipse.jst.jsp.core.JSP12Namespace;
 import org.eclipse.jst.jsp.core.internal.Logger;
 import org.eclipse.jst.jsp.core.internal.contentmodel.ITaglibIndexListener;
 import org.eclipse.jst.jsp.core.internal.contentmodel.ITaglibRecord;
@@ -49,6 +49,7 @@
 import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDDocument;
 import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDElementDeclaration;
 import org.eclipse.jst.jsp.core.internal.parser.JSPSourceParser;
+import org.eclipse.jst.jsp.core.internal.provisional.JSP12Namespace;
 import org.eclipse.jst.jsp.core.internal.regions.DOMJSPRegionContexts;
 import org.eclipse.wst.common.uriresolver.URIResolverPlugin;
 import org.eclipse.wst.sse.core.internal.ltk.parser.BlockMarker;
@@ -297,17 +298,18 @@
 				IPath fileLocation = new Path(URIHelper.normalize(StringUtils.strip(includedFile).trim(), getCurrentBaseLocation().toString(), root.toString()));
 				// check for "loops"
 				if (!getIncludes().contains(fileLocation) && fileLocation != null && !fileLocation.equals(getCurrentBaseLocation())) {
-					
-				    // prevent slow performance when editing scriptlet part of the JSP
+
+					// prevent slow performance when editing scriptlet part of
+					// the JSP
 					// only process includes if they've been modified
-				    if(hasAnyIncludeBeenModified(fileLocation.toString())) {
+					if (hasAnyIncludeBeenModified(fileLocation.toString())) {
 						getIncludes().push(fileLocation);
 						if (getParser() != null)
 							new IncludeHelper(anchorStructuredDocumentRegion, getParser()).parse(fileLocation.toString());
 						else
 							Logger.log(Logger.WARNING, "Warning: parser text was requested by " + getClass().getName() + " but none was available; taglib support disabled"); //$NON-NLS-1$ //$NON-NLS-2$
 						getIncludes().pop();
-				    }
+					}
 				}
 				else {
 					if (Debug.debugTokenizer)
@@ -466,7 +468,7 @@
 		protected IStructuredDocumentRegion fAnchor = null;
 		protected JSPSourceParser fLocalParser = null;
 		protected JSPSourceParser fParentParser = null;
-		
+
 		public IncludeHelper(IStructuredDocumentRegion anchor, JSPSourceParser rootParser) {
 			super();
 			fAnchor = anchor;
@@ -682,7 +684,7 @@
 	// of included files
 	// String (filepath) > Long (modification stamp)
 	HashMap fInclude2TimestampMap = new HashMap();
-	
+
 	public TLDCMDocumentManager() {
 		super();
 	}
@@ -862,7 +864,7 @@
 			fTaglibTrackers = new ArrayList();
 		return fTaglibTrackers;
 	}
-	
+
 	public void indexChanged(ITaglibRecordEvent event) {
 	}
 
@@ -894,17 +896,20 @@
 	 */
 	protected CMDocument loadTaglib(String uri) {
 		CMDocument document = null;
-		ITaglibRecord reference = TaglibIndex.resolve(TaglibController.getFileBuffer(this).getLocation().toString(), uri, false);
-		if (reference != null) {
-			document = getCMDocumentBuilder().createCMDocument(reference);
-		}
-		else {
-			String location = URIResolverPlugin.createResolver().resolve(getCurrentBaseLocation().toString(), null, uri);
-			if (location != null) {
-				if (_debug) {
-					System.out.println("Loading tags from " + uri + " at " + location); //$NON-NLS-2$//$NON-NLS-1$
+		ITextFileBuffer fileBuffer = TaglibController.getFileBuffer(this);
+		if (fileBuffer != null) {
+			ITaglibRecord reference = TaglibIndex.resolve(fileBuffer.getLocation().toString(), uri, false);
+			if (reference != null) {
+				document = getCMDocumentBuilder().createCMDocument(reference);
+			}
+			else {
+				String location = URIResolverPlugin.createResolver().resolve(getCurrentBaseLocation().toString(), null, uri);
+				if (location != null) {
+					if (_debug) {
+						System.out.println("Loading tags from " + uri + " at " + location); //$NON-NLS-2$//$NON-NLS-1$
+					}
+					document = getCMDocumentBuilder().createCMDocument(location);
 				}
-				document = getCMDocumentBuilder().createCMDocument(location);
 			}
 		}
 		return document;
@@ -924,61 +929,63 @@
 		if (fParser != null)
 			fParser.addStructuredDocumentRegionHandler(getStructuredDocumentRegionHandler());
 	}
-	
+
 	/**
-     * @param fileLocation the "root" file
-     */
-    boolean hasAnyIncludeBeenModified(String fileLocation) {
-        
-        boolean result = false;
-        // check the top level
-        if (hasBeenModified(fileLocation)) {
-            result = true;
-        } else {
-            // check all includees
-            Iterator iter = fInclude2TimestampMap.keySet().iterator();
-            while (iter.hasNext()) {
-                if (hasBeenModified((String) iter.next())) {
-                    result = true;
-                    break;
-                }
-            }
-        }
-        return result;
-    }
-	
+	 * @param fileLocation
+	 *            the "root" file
+	 */
+	boolean hasAnyIncludeBeenModified(String fileLocation) {
+
+		boolean result = false;
+		// check the top level
+		if (hasBeenModified(fileLocation)) {
+			result = true;
+		}
+		else {
+			// check all includees
+			Iterator iter = fInclude2TimestampMap.keySet().iterator();
+			while (iter.hasNext()) {
+				if (hasBeenModified((String) iter.next())) {
+					result = true;
+					break;
+				}
+			}
+		}
+		return result;
+	}
+
 	/**
-     * @param filename
-     * @return
-     */
-    boolean hasBeenModified(String filename) {		
-		
-        boolean result = false;
-        // quick filename/timestamp cache check here...
-        IPath filePath = new Path(filename);
-	    IFile f = ResourcesPlugin.getWorkspace().getRoot().getFileForLocation(filePath);
-	    if(f == null && filePath.segmentCount() > 1) {
-	        f = ResourcesPlugin.getWorkspace().getRoot().getFile(filePath);
-	    }
-	    if(f != null && f.exists()) {
-	        Long currentStamp = new Long(f.getModificationStamp());
-	        Object o = fInclude2TimestampMap.get(filename);
-	        if(o != null) {
-	            Long previousStamp = (Long)o;
-	            // stamps don't match, file changed
-	            if(currentStamp.longValue() != previousStamp.longValue()) {
-	                result = true;
-		            // store for next time
-		            fInclude2TimestampMap.put(filename, currentStamp);
-	            }
-	        }
-	        else {
-	            // return true, since we've not encountered this file yet.
-	            result = true;
-	            // store for next time
-	            fInclude2TimestampMap.put(filename, currentStamp);
-	        }
-	    }
-	    return result;
-    }
+	 * @param filename
+	 * @return
+	 */
+	boolean hasBeenModified(String filename) {
+
+		boolean result = false;
+		// quick filename/timestamp cache check here...
+		IPath filePath = new Path(filename);
+		IFile f = ResourcesPlugin.getWorkspace().getRoot().getFileForLocation(filePath);
+		if (f == null && filePath.segmentCount() > 1) {
+			f = ResourcesPlugin.getWorkspace().getRoot().getFile(filePath);
+		}
+		if (f != null && f.exists()) {
+			Long currentStamp = new Long(f.getModificationStamp());
+			Object o = fInclude2TimestampMap.get(filename);
+			if (o != null) {
+				Long previousStamp = (Long) o;
+				// stamps don't match, file changed
+				if (currentStamp.longValue() != previousStamp.longValue()) {
+					result = true;
+					// store for next time
+					fInclude2TimestampMap.put(filename, currentStamp);
+				}
+			}
+			else {
+				// return true, since we've not encountered this file yet.
+				result = true;
+				// store for next time
+				fInclude2TimestampMap.put(filename, currentStamp);
+			}
+		}
+		return result;
+	}
 }
\ No newline at end of file
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contenttype/AbstractContentDescriber.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contenttype/AbstractContentDescriber.java
deleted file mode 100644
index 79e9d37..0000000
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contenttype/AbstractContentDescriber.java
+++ /dev/null
@@ -1,208 +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.jst.jsp.core.internal.contenttype;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Reader;
-
-import org.eclipse.core.runtime.QualifiedName;
-import org.eclipse.core.runtime.content.IContentDescriber;
-import org.eclipse.core.runtime.content.IContentDescription;
-import org.eclipse.core.runtime.content.ITextContentDescriber;
-import org.eclipse.wst.sse.core.internal.encoding.EncodingMemento;
-import org.eclipse.wst.sse.core.internal.encoding.IContentDescriptionExtended;
-import org.eclipse.wst.sse.core.internal.encoding.IResourceCharsetDetector;
-
-public abstract class AbstractContentDescriber implements ITextContentDescriber {
-
-	private final static QualifiedName[] SUPPORTED_OPTIONS = {IContentDescription.CHARSET, IContentDescription.BYTE_ORDER_MARK, IContentDescriptionExtended.DETECTED_CHARSET, IContentDescriptionExtended.UNSUPPORTED_CHARSET, IContentDescriptionExtended.APPROPRIATE_DEFAULT};
-
-	private void calculateSupportedOptions(InputStream contents, IContentDescription description) throws IOException {
-		if (isRelevent(description)) {
-			IResourceCharsetDetector detector = getDetector();
-			detector.set(contents);
-			handleCalculations(description, detector);
-		}
-	}
-
-	/**
-	 * @param contents
-	 * @param description
-	 * @throws IOException
-	 */
-	private void calculateSupportedOptions(Reader contents, IContentDescription description) throws IOException {
-		if (isRelevent(description)) {
-			IResourceCharsetDetector detector = getDetector();
-			detector.set(contents);
-			handleCalculations(description, detector);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.content.IContentDescriber#describe(java.io.InputStream,
-	 *      org.eclipse.core.runtime.content.IContentDescription)
-	 */
-	public int describe(InputStream contents, IContentDescription description) throws IOException {
-		int result = IContentDescriber.VALID;
-
-		calculateSupportedOptions(contents, description);
-
-		// assume if we're called at all that we are valid (few types could be
-		// disproved, maybe XML -- or, maybe if exception occurs above?)
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.content.ITextContentDescriber#describe(java.io.Reader,
-	 *      org.eclipse.core.runtime.content.IContentDescription)
-	 */
-	public int describe(Reader contents, IContentDescription description) throws IOException {
-		int result = IContentDescriber.VALID;
-
-		calculateSupportedOptions(contents, description);
-
-		// assume if we're called at all that we are valid (few types could be
-		// disproved, maybe XML -- or, maybe if exception occurs above?)
-		return result;
-	}
-
-	protected abstract IResourceCharsetDetector getDetector();
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.content.IContentDescriber#getSupportedOptions()
-	 */
-	public QualifiedName[] getSupportedOptions() {
-
-		return SUPPORTED_OPTIONS;
-	}
-
-	/**
-	 * @param description
-	 * @param detector
-	 * @throws IOException
-	 */
-	protected void handleCalculations(IContentDescription description, IResourceCharsetDetector detector) throws IOException {
-		// note: if we're asked for one, we set them all. I need to be sure if
-		// called
-		// mulitiple times (one for each, say) that we don't waste time
-		// processing same
-		// content again.
-		EncodingMemento encodingMemento = detector.getEncodingMemento();
-		// TODO: I need to verify to see if this BOM work is always done
-		// by text type.
-		Object detectedByteOrderMark = encodingMemento.getUnicodeBOM();
-		if (detectedByteOrderMark != null) {
-			Object existingByteOrderMark = description.getProperty(IContentDescription.BYTE_ORDER_MARK);
-			// not sure why would ever be different, so if is different, may
-			// need to "push" up into base.
-			if (!detectedByteOrderMark.equals(existingByteOrderMark))
-				description.setProperty(IContentDescription.BYTE_ORDER_MARK, detectedByteOrderMark);
-		}
-
-
-		if (!encodingMemento.isValid()) {
-			// note: after setting here, its the mere presence of
-			// IContentDescriptionExtended.UNSUPPORTED_CHARSET
-			// in the resource's description that can be used to determine if
-			// invalid
-			// in those cases, the "detected" property contains an
-			// "appropriate default" to use.
-			description.setProperty(IContentDescriptionExtended.UNSUPPORTED_CHARSET, encodingMemento.getInvalidEncoding());
-			description.setProperty(IContentDescriptionExtended.APPROPRIATE_DEFAULT, encodingMemento.getAppropriateDefault());
-		}
-
-		Object detectedCharset = encodingMemento.getDetectedCharsetName();
-		Object javaCharset = encodingMemento.getJavaCharsetName();
-
-		// we always include detected, if its different than java
-		handleDetectedSpecialCase(description, detectedCharset, javaCharset);
-
-		if (javaCharset != null) {
-			Object existingCharset = description.getProperty(IContentDescription.CHARSET);
-			if (javaCharset.equals(existingCharset)) {
-				handleDetectedSpecialCase(description, detectedCharset, javaCharset);
-			} else {
-				// we may need to add what we found, but only need to add
-				// if different from default.the
-				Object defaultCharset = getDetector().getSpecDefaultEncoding();
-				if (defaultCharset != null) {
-					if (!defaultCharset.equals(javaCharset)) {
-						description.setProperty(IContentDescription.CHARSET, javaCharset);
-					}
-				} else {
-					// assuming if there is no spec default, we always need to
-					// add, I'm assuming
-					description.setProperty(IContentDescription.CHARSET, javaCharset);
-				}
-			}
-		}
-
-		// avoid adding anything if not absolutly needed, since always
-		// "cached" per session
-		//description.setProperty(IContentDescriptionExtended.ENCODING_MEMENTO,
-		// encodingMemento);
-	}
-
-	private void handleDetectedSpecialCase(IContentDescription description, Object detectedCharset, Object javaCharset) {
-		// since equal, we don't need to add, but if our detected version is
-		// different than
-		// javaCharset, then we should add it. This will happen, for example,
-		// if there's
-		// differences in case, or differences due to override properties
-		if (detectedCharset != null) {
-			//			if (!detectedCharset.equals(javaCharset)) {
-			//				description.setProperty(IContentDescriptionExtended.DETECTED_CHARSET,
-			// detectedCharset);
-			//			}
-
-			// Once we detected a charset, we should set the property even
-			// though it's the same as javaCharset
-			// because there are clients that rely on this property to
-			// determine if the charset is actually detected in file or not.
-			description.setProperty(IContentDescriptionExtended.DETECTED_CHARSET, detectedCharset);
-		}
-	}
-
-	/**
-	 * @param description
-	 * @return
-	 */
-	private boolean isRelevent(IContentDescription description) {
-		boolean result = false;
-		if (description == null)
-			result = false;
-		else if (description.isRequested(IContentDescription.BYTE_ORDER_MARK))
-			result = true;
-		else if (description.isRequested(IContentDescription.CHARSET))
-			result = true;
-		else if (description.isRequested(IContentDescriptionExtended.APPROPRIATE_DEFAULT))
-			result = true;
-		else if (description.isRequested(IContentDescriptionExtended.DETECTED_CHARSET))
-			result = true;
-		else if (description.isRequested(IContentDescriptionExtended.UNSUPPORTED_CHARSET))
-			result = true;
-		//		else if
-		// (description.isRequested(IContentDescriptionExtended.ENCODING_MEMENTO))
-		//			result = true;
-		return result;
-	}
-
-
-}
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contenttype/AbstractResourceEncodingDetector.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contenttype/AbstractResourceEncodingDetector.java
deleted file mode 100644
index 532524f..0000000
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contenttype/AbstractResourceEncodingDetector.java
+++ /dev/null
@@ -1,258 +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.jst.jsp.core.internal.contenttype;
-
-import java.io.BufferedInputStream;
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Reader;
-import java.nio.charset.Charset;
-import java.nio.charset.IllegalCharsetNameException;
-import java.nio.charset.UnsupportedCharsetException;
-
-import org.eclipse.core.resources.IStorage;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.wst.sse.core.internal.encoding.CodedIO;
-import org.eclipse.wst.sse.core.internal.encoding.EncodingMemento;
-import org.eclipse.wst.sse.core.internal.encoding.IResourceCharsetDetector;
-import org.eclipse.wst.sse.core.internal.encoding.util.ByteReader;
-
-
-public abstract class AbstractResourceEncodingDetector implements IResourceCharsetDetector {
-
-	protected EncodingMemento fEncodingMemento;
-
-	protected boolean fHeaderParsed;
-
-	protected Reader fReader;
-
-	/**
-	 *  
-	 */
-	public AbstractResourceEncodingDetector() {
-		super();
-	}
-
-	/**
-	 * Note: once this instance is created, trace info still needs to be
-	 * appended by caller, depending on the context its created.
-	 */
-	private void createEncodingMemento(String detectedCharsetName) {
-		fEncodingMemento = new EncodingMemento();
-		fEncodingMemento.setJavaCharsetName(getAppropriateJavaCharset(detectedCharsetName));
-		fEncodingMemento.setDetectedCharsetName(detectedCharsetName);
-		// TODO: if detectedCharset and spec default is
-		// null, need to use "work
-		// bench based" defaults.
-		fEncodingMemento.setAppropriateDefault(getSpecDefaultEncoding());
-	}
-
-	/**
-	 * convience method all subclasses can use (but not override)
-	 * 
-	 * @param detectedCharsetName
-	 * @param reason
-	 */
-	final protected void createEncodingMemento(String detectedCharsetName, String reason) {
-		createEncodingMemento(detectedCharsetName);
-	}
-
-	/**
-	 * convience method all subclasses can use (but not override)
-	 */
-	final protected void ensureInputSet() {
-		if (fReader == null) {
-			throw new IllegalStateException("input must be set before use"); //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * This method can return null, if invalid charset name (in which case
-	 * "appropriateDefault" should be used, if a name is really need for some
-	 * "save anyway" cases).
-	 * 
-	 * @param detectedCharsetName
-	 * @return
-	 */
-	private String getAppropriateJavaCharset(String detectedCharsetName) {
-		String result = null;
-		// 1. Check explicit mapping overrides from
-		// property file -- its here we pick up "rules" for cases
-		// that are not even in Java
-		result = CodedIO.checkMappingOverrides(detectedCharsetName);
-		// 2. Use the "canonical" name from JRE mappings
-		// Note: see Charset JavaDoc, the name you get one
-		// with can be alias,
-		// the name you get back is "standard" name.
-		Charset javaCharset = null;
-		try {
-			javaCharset = Charset.forName(detectedCharsetName);
-		} catch (UnsupportedCharsetException e) {
-			// only set invalid, if result is same as detected -- they won't
-			// be equal if
-			// overridden
-			if (result != null && result.equals(detectedCharsetName)) {
-				fEncodingMemento.setInvalidEncoding(detectedCharsetName);
-			}
-		} catch (IllegalCharsetNameException e) {
-			// only set invalid, if result is same as detected -- they won't
-			// be equal if
-			// overridden
-			if (result != null && result.equals(detectedCharsetName)) {
-				fEncodingMemento.setInvalidEncoding(detectedCharsetName);
-			}
-		}
-		// give priority to java cononical name, if present
-		if (javaCharset != null) {
-			result = javaCharset.name();
-			// but still allow overrides
-			result = CodedIO.checkMappingOverrides(result);
-		}
-		return result;
-	}
-
-	public String getEncoding() throws IOException {
-		return getEncodingMemento().getDetectedCharsetName();
-	}
-
-	// to ensure consist overall rules used, we'll mark as
-	// final,
-	// and require subclasses to provide certain pieces of
-	// the
-	// implementation
-	public EncodingMemento getEncodingMemento() throws IOException {
-		ensureInputSet();
-		if (!fHeaderParsed) {
-			parseInput();
-			// we keep track of if header's already been
-			// parse, so can make
-			// multiple 'get' calls, without causing
-			// reparsing.
-			fHeaderParsed = true;
-			// Note: there is a "hidden assumption" here
-			// that an empty
-			// string in content should be treated same as
-			// not present.
-		}
-		if (fEncodingMemento == null) {
-			handleSpecDefault();
-		}
-		if (fEncodingMemento == null) {
-			// safty net
-			fEncodingMemento = new NullMemento();
-		}
-		return fEncodingMemento;
-	}
-
-	/**
-	 * This is to return a default encoding -- as specified by an industry
-	 * content type spec -- when not present in the stream, for example, XML
-	 * specifies UTF-8, JSP specifies ISO-8859-1. This method should return
-	 * null if there is no such "spec default".
-	 */
-	abstract public String getSpecDefaultEncoding();
-
-	public EncodingMemento getSpecDefaultEncodingMemento() {
-		resetAll();
-		EncodingMemento result = null;
-		String enc = getSpecDefaultEncoding();
-		if (enc != null) {
-			createEncodingMemento(enc, EncodingMemento.DEFAULTS_ASSUMED_FOR_EMPTY_INPUT);
-			fEncodingMemento.setAppropriateDefault(enc);
-			result = fEncodingMemento;
-		}
-		return result;
-	}
-
-	private void handleSpecDefault() {
-		String encodingName;
-		encodingName = getSpecDefaultEncoding();
-		if (encodingName != null) {
-			//createEncodingMemento(encodingName,
-			// EncodingMemento.USED_CONTENT_TYPE_DEFAULT);
-			fEncodingMemento = new EncodingMemento();
-			fEncodingMemento.setJavaCharsetName(encodingName);
-			fEncodingMemento.setAppropriateDefault(encodingName);
-		}
-	}
-
-	/**
-	 * Every subclass must provide a way to parse the input. This method has
-	 * several critical responsibilities:
-	 * <li>set the fEncodingMemento field appropriately, according to the
-	 * results of the parse of fReader.</li>
-	 * <li>set fHarderParsed to true, to avoid wasted re-parsing.</li>
-	 */
-	abstract protected void parseInput() throws IOException;
-
-	/**
-	 *  
-	 */
-	private void resetAll() {
-		fReader = null;
-		fHeaderParsed = false;
-		fEncodingMemento = null;
-	}
-
-	/**
-	 *  
-	 */
-	public void set(InputStream inputStream) {
-		resetAll();
-		fReader = new ByteReader(inputStream);
-		try {
-			fReader.mark(CodedIO.MAX_MARK_SIZE);
-		} catch (IOException e) {
-			// impossible, since we know ByteReader
-			// supports marking
-			throw new Error(e);
-		}
-	}
-
-	/**
-	 *  
-	 */
-	public void set(IStorage iStorage) throws CoreException {
-		resetAll();
-		InputStream inputStream = iStorage.getContents();
-		InputStream resettableStream = new BufferedInputStream(inputStream, CodedIO.MAX_BUF_SIZE);
-		resettableStream.mark(CodedIO.MAX_MARK_SIZE);
-		set(resettableStream);
-		// TODO we'll need to "remember" IFile, or
-		// get its (or its project's) settings, in case
-		// those are needed to handle cases when the
-		// encoding is not in the file stream.
-	}
-
-	/**
-	 * Note: this is not part of interface to help avoid confusion ... it
-	 * expected this Reader is a well formed character reader ... that is, its
-	 * all ready been determined to not be a unicode marked input stream. And,
-	 * its assumed to be in the correct position, at position zero, ready to
-	 * read first character.
-	 */
-	public void set(Reader reader) {
-		resetAll();
-		fReader = reader;
-		if (!fReader.markSupported()) {
-			fReader = new BufferedReader(fReader);
-		}
-		try {
-			fReader.mark(CodedIO.MAX_MARK_SIZE);
-		} catch (IOException e) {
-			// impossble, since we just checked if markable
-			throw new Error(e);
-		}
-	}
-}
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contenttype/ContentDescriberForJSP.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contenttype/ContentDescriberForJSP.java
index 3f6a6d0..3706254 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contenttype/ContentDescriberForJSP.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contenttype/ContentDescriberForJSP.java
@@ -11,46 +11,204 @@
 package org.eclipse.jst.jsp.core.internal.contenttype;
 
 import java.io.IOException;
+import java.io.InputStream;
+import java.io.Reader;
 
 import org.eclipse.core.runtime.QualifiedName;
+import org.eclipse.core.runtime.content.IContentDescriber;
 import org.eclipse.core.runtime.content.IContentDescription;
 import org.eclipse.core.runtime.content.ITextContentDescriber;
+import org.eclipse.jst.jsp.core.internal.provisional.contenttype.IContentDescriptionForJSP;
+import org.eclipse.wst.sse.core.internal.encoding.EncodingMemento;
 import org.eclipse.wst.sse.core.internal.encoding.IContentDescriptionExtended;
 import org.eclipse.wst.sse.core.internal.encoding.IResourceCharsetDetector;
 
-public class ContentDescriberForJSP extends AbstractContentDescriber implements ITextContentDescriber {
-	private final static QualifiedName[] SUPPORTED_OPTIONS = {
-				IContentDescription.CHARSET, 
-				IContentDescription.BYTE_ORDER_MARK, 
-				IContentDescriptionExtended.DETECTED_CHARSET, 
-				IContentDescriptionExtended.UNSUPPORTED_CHARSET, 
-				IContentDescriptionExtended.APPROPRIATE_DEFAULT,
-				IContentDescriptionForJSP.CONTENT_TYPE_ATTRIBUTE, 
-				IContentDescriptionForJSP.LANGUAGE_ATTRIBUTE};
+public final class ContentDescriberForJSP implements ITextContentDescriber {
+	private final static QualifiedName[] SUPPORTED_OPTIONS = {IContentDescription.CHARSET, IContentDescription.BYTE_ORDER_MARK, IContentDescriptionExtended.DETECTED_CHARSET, IContentDescriptionExtended.UNSUPPORTED_CHARSET, IContentDescriptionExtended.APPROPRIATE_DEFAULT, IContentDescriptionForJSP.CONTENT_TYPE_ATTRIBUTE, IContentDescriptionForJSP.LANGUAGE_ATTRIBUTE};
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.core.runtime.content.IContentDescriber#describe(java.io.InputStream,
+	 *      org.eclipse.core.runtime.content.IContentDescription)
+	 */
+	public int describe(InputStream contents, IContentDescription description) throws IOException {
+		int result = IContentDescriber.INDETERMINATE;
+
+		calculateSupportedOptions(contents, description);
+
+		return result;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.core.runtime.content.ITextContentDescriber#describe(java.io.Reader,
+	 *      org.eclipse.core.runtime.content.IContentDescription)
+	 */
+	public int describe(Reader contents, IContentDescription description) throws IOException {
+		int result = IContentDescriber.INDETERMINATE;
+
+		calculateSupportedOptions(contents, description);
+
+		return result;
+	}
 
 	public QualifiedName[] getSupportedOptions() {
 		return SUPPORTED_OPTIONS;
 	}
 
-	protected IResourceCharsetDetector getDetector() {
+	private void calculateSupportedOptions(InputStream contents, IContentDescription description) throws IOException {
+		if (isRelevent(description)) {
+			IResourceCharsetDetector detector = getDetector();
+			detector.set(contents);
+			handleCalculations(description, detector);
+		}
+	}
+
+	/**
+	 * @param contents
+	 * @param description
+	 * @throws IOException
+	 */
+	private void calculateSupportedOptions(Reader contents, IContentDescription description) throws IOException {
+		if (isRelevent(description)) {
+			IResourceCharsetDetector detector = getDetector();
+			detector.set(contents);
+			handleCalculations(description, detector);
+		}
+	}
+
+	private IResourceCharsetDetector getDetector() {
 		return new JSPResourceEncodingDetector();
 	}
 
-	protected void handleCalculations(IContentDescription description, IResourceCharsetDetector detector) throws IOException {
+	private void handleCalculations(IContentDescription description, IResourceCharsetDetector detector) throws IOException {
 		// handle standard ones first, to be sure detector processes
-		super.handleCalculations(description, detector);
+		handleStandardCalculations(description, detector);
 		// now do those specific for JSPs
-		// note: detector should always be of correct instance, but we'll check, for now.
+		// note: detector should always be of correct instance, but we'll
+		// check, for now.
 		if (detector instanceof JSPResourceEncodingDetector) {
 			JSPResourceEncodingDetector jspDetector = (JSPResourceEncodingDetector) detector;
 			String language = jspDetector.getLanguage();
 			if (language != null && language.length() > 0) {
 				description.setProperty(IContentDescriptionForJSP.LANGUAGE_ATTRIBUTE, language);
 			}
-			String contentTypeAttribute = jspDetector.getContentType(); 
+			String contentTypeAttribute = jspDetector.getContentType();
 			if (contentTypeAttribute != null && contentTypeAttribute.length() > 0) {
 				description.setProperty(IContentDescriptionForJSP.CONTENT_TYPE_ATTRIBUTE, contentTypeAttribute);
 			}
 		}
 	}
+
+	private void handleDetectedSpecialCase(IContentDescription description, Object detectedCharset, Object javaCharset) {
+		// since equal, we don't need to add, but if our detected version is
+		// different than
+		// javaCharset, then we should add it. This will happen, for example,
+		// if there's
+		// differences in case, or differences due to override properties
+		if (detectedCharset != null) {
+			// if (!detectedCharset.equals(javaCharset)) {
+			// description.setProperty(IContentDescriptionExtended.DETECTED_CHARSET,
+			// detectedCharset);
+			// }
+
+			// Once we detected a charset, we should set the property even
+			// though it's the same as javaCharset
+			// because there are clients that rely on this property to
+			// determine if the charset is actually detected in file or not.
+			description.setProperty(IContentDescriptionExtended.DETECTED_CHARSET, detectedCharset);
+		}
+	}
+
+	/**
+	 * @param description
+	 * @param detector
+	 * @throws IOException
+	 */
+	private void handleStandardCalculations(IContentDescription description, IResourceCharsetDetector detector) throws IOException {
+		// note: if we're asked for one, we set them all. I need to be sure if
+		// called
+		// mulitiple times (one for each, say) that we don't waste time
+		// processing same
+		// content again.
+		EncodingMemento encodingMemento = detector.getEncodingMemento();
+		// TODO: I need to verify to see if this BOM work is always done
+		// by text type.
+		Object detectedByteOrderMark = encodingMemento.getUnicodeBOM();
+		if (detectedByteOrderMark != null) {
+			Object existingByteOrderMark = description.getProperty(IContentDescription.BYTE_ORDER_MARK);
+			// not sure why would ever be different, so if is different, may
+			// need to "push" up into base.
+			if (!detectedByteOrderMark.equals(existingByteOrderMark))
+				description.setProperty(IContentDescription.BYTE_ORDER_MARK, detectedByteOrderMark);
+		}
+
+
+		if (!encodingMemento.isValid()) {
+			// note: after setting here, its the mere presence of
+			// IContentDescriptionExtended.UNSUPPORTED_CHARSET
+			// in the resource's description that can be used to determine if
+			// invalid
+			// in those cases, the "detected" property contains an
+			// "appropriate default" to use.
+			description.setProperty(IContentDescriptionExtended.UNSUPPORTED_CHARSET, encodingMemento.getInvalidEncoding());
+			description.setProperty(IContentDescriptionExtended.APPROPRIATE_DEFAULT, encodingMemento.getAppropriateDefault());
+		}
+
+		Object detectedCharset = encodingMemento.getDetectedCharsetName();
+		Object javaCharset = encodingMemento.getJavaCharsetName();
+
+		// we always include detected, if its different than java
+		handleDetectedSpecialCase(description, detectedCharset, javaCharset);
+
+		if (javaCharset != null) {
+			Object existingCharset = description.getProperty(IContentDescription.CHARSET);
+			if (javaCharset.equals(existingCharset)) {
+				handleDetectedSpecialCase(description, detectedCharset, javaCharset);
+			}
+			else {
+				// we may need to add what we found, but only need to add
+				// if different from default.the
+				Object defaultCharset = getDetector().getSpecDefaultEncoding();
+				if (defaultCharset != null) {
+					if (!defaultCharset.equals(javaCharset)) {
+						description.setProperty(IContentDescription.CHARSET, javaCharset);
+					}
+				}
+				else {
+					// assuming if there is no spec default, we always need to
+					// add, I'm assuming
+					description.setProperty(IContentDescription.CHARSET, javaCharset);
+				}
+			}
+		}
+
+		// avoid adding anything if not absolutly needed, since always
+		// "cached" per session
+		// description.setProperty(IContentDescriptionExtended.ENCODING_MEMENTO,
+		// encodingMemento);
+	}
+
+	/**
+	 * @param description
+	 * @return
+	 */
+	private boolean isRelevent(IContentDescription description) {
+		boolean result = false;
+		if (description == null)
+			result = false;
+		else if (description.isRequested(IContentDescription.BYTE_ORDER_MARK))
+			result = true;
+		else if (description.isRequested(IContentDescription.CHARSET))
+			result = true;
+		else if (description.isRequested(IContentDescriptionExtended.APPROPRIATE_DEFAULT))
+			result = true;
+		else if (description.isRequested(IContentDescriptionExtended.DETECTED_CHARSET))
+			result = true;
+		else if (description.isRequested(IContentDescriptionExtended.UNSUPPORTED_CHARSET))
+			result = true;
+		return result;
+	}
 }
\ No newline at end of file
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contenttype/JSPHeadTokenizer.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contenttype/JSPHeadTokenizer.java
index ff51ba8..c0b35c8 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contenttype/JSPHeadTokenizer.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contenttype/JSPHeadTokenizer.java
@@ -145,7 +145,7 @@
 
 
 	private boolean hasMore = true;
-	private final static int MAX_TO_SCAN = 1000;
+	private final static int MAX_TO_SCAN = 8000;
 	StringBuffer string = new StringBuffer();
 	// state stack for easier state handling
 	private IntStack fStateStack = new IntStack();
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contenttype/JSPResourceEncodingDetector.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contenttype/JSPResourceEncodingDetector.java
index 2760e9a..133b892 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contenttype/JSPResourceEncodingDetector.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contenttype/JSPResourceEncodingDetector.java
@@ -10,80 +10,201 @@
  *******************************************************************************/
 package org.eclipse.jst.jsp.core.internal.contenttype;
 
+import java.io.BufferedInputStream;
+import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.Reader;
+import java.nio.charset.Charset;
+import java.nio.charset.IllegalCharsetNameException;
+import java.nio.charset.UnsupportedCharsetException;
 import java.util.regex.Pattern;
 
-import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IStorage;
 import org.eclipse.core.runtime.CoreException;
+import org.eclipse.wst.sse.core.internal.encoding.CodedIO;
 import org.eclipse.wst.sse.core.internal.encoding.EncodingMemento;
 import org.eclipse.wst.sse.core.internal.encoding.IResourceCharsetDetector;
+import org.eclipse.wst.sse.core.internal.encoding.NonContentBasedEncodingRules;
+import org.eclipse.wst.sse.core.internal.encoding.util.ByteReader;
 import org.eclipse.wst.xml.core.internal.contenttype.EncodingParserConstants;
 import org.eclipse.wst.xml.core.internal.contenttype.XMLHeadTokenizerConstants;
 
-public class JSPResourceEncodingDetector extends AbstractResourceEncodingDetector implements IResourceCharsetDetector {
+public class JSPResourceEncodingDetector implements IResourceCharsetDetector {
 
-	private String fPageEncodingValue = null;
-	private JSPHeadTokenizer fTokenizer = null;
-	private String fLanguage;
-
-	private String fContentTypeValue;
-	private String fXMLDecEncodingName;
 	private String fCharset;
-	private boolean unicodeCase;
+
 	private String fContentType;
 
-	protected void parseInput() throws IOException {
-		JSPHeadTokenizer tokenizer = getTokinizer();
-		tokenizer.reset(fReader);
-		parseHeader(tokenizer);
-		// unicode stream cases are created directly in parseHeader
-		if (!unicodeCase) {
-			String enc = getAppropriateEncoding();
-			if (enc != null && enc.length() > 0) {
-				createEncodingMemento(enc, EncodingMemento.FOUND_ENCODING_IN_CONTENT);
-			}
-		}
-	}
+	private String fContentTypeValue;
 
-	private JSPHeadTokenizer getTokinizer() {
-		if (fTokenizer == null) {
-			fTokenizer = new JSPHeadTokenizer();
-		}
-		return fTokenizer;
-	}
+	private String fLanguage;
+
+	private String fPageEncodingValue;
+
+	private JSPHeadTokenizer fTokenizer;
+
+	private String fXMLDecEncodingName;
+
+	private boolean unicodeCase;
+
+	private EncodingMemento fEncodingMemento;
+
+	private boolean fHeaderParsed;
+
+	private Reader fReader;
+
 
 	/**
-	 * There can sometimes be mulitple 'encodings' specified in a file. This
-	 * is an attempt to centralize the rules for deciding between them.
-	 * Returns encoding according to priority: 1. XML Declaration 2. page
-	 * directive pageEncoding name 3. page directive contentType charset name
-	 */
-	private String getAppropriateEncoding() {
-		String result = null;
-		if (fXMLDecEncodingName != null)
-			result = fXMLDecEncodingName;
-		else if (fPageEncodingValue != null)
-			result = fPageEncodingValue;
-		else if (fCharset != null)
-			result = fCharset;
-		return result;
-	}
-
-	/**
-	 *  
+	 * No Arg constructor.
 	 */
 	public JSPResourceEncodingDetector() {
 		super();
 	}
 
+	class NullMemento extends EncodingMemento {
+		/**
+		 * 
+		 */
+		public NullMemento() {
+			super();
+			String defaultCharset = NonContentBasedEncodingRules.useDefaultNameRules(null);
+			setJavaCharsetName(defaultCharset);
+			setAppropriateDefault(defaultCharset);
+			setDetectedCharsetName(null);
+		}
+
+	}
+
+	/**
+	 * @return Returns the contentType.
+	 */
+	public String getContentType() throws IOException {
+		ensureInputSet();
+		if (!fHeaderParsed) {
+			parseInput();
+			// we keep track of if header's already been parse, so can make
+			// multiple 'get' calls, without causing reparsing.
+			fHeaderParsed = true;
+			// Note: there is a "hidden assumption" here that an empty
+			// string in content should be treated same as not present.
+		}
+		return fContentType;
+	}
+
+	public String getEncoding() throws IOException {
+		return getEncodingMemento().getDetectedCharsetName();
+	}
+
+	// to ensure consist overall rules used, we'll mark as
+	// final,
+	// and require subclasses to provide certain pieces of
+	// the
+	// implementation
+	public EncodingMemento getEncodingMemento() throws IOException {
+		ensureInputSet();
+		if (!fHeaderParsed) {
+			parseInput();
+			// we keep track of if header's already been
+			// parse, so can make
+			// multiple 'get' calls, without causing
+			// reparsing.
+			fHeaderParsed = true;
+			// Note: there is a "hidden assumption" here
+			// that an empty
+			// string in content should be treated same as
+			// not present.
+		}
+		if (fEncodingMemento == null) {
+			handleSpecDefault();
+		}
+		if (fEncodingMemento == null) {
+			// safty net
+			fEncodingMemento = new NullMemento();
+		}
+		return fEncodingMemento;
+	}
+
+	public String getLanguage() throws IOException {
+		ensureInputSet();
+		if (!fHeaderParsed) {
+			parseInput();
+			fHeaderParsed = true;
+		}
+		return fLanguage;
+	}
+
 	public String getSpecDefaultEncoding() {
 		// by JSP Spec
 		final String enc = "ISO-8859-1"; //$NON-NLS-1$
 		return enc;
 	}
 
+	public EncodingMemento getSpecDefaultEncodingMemento() {
+		resetAll();
+		EncodingMemento result = null;
+		String enc = getSpecDefaultEncoding();
+		if (enc != null) {
+			createEncodingMemento(enc, EncodingMemento.DEFAULTS_ASSUMED_FOR_EMPTY_INPUT);
+			fEncodingMemento.setAppropriateDefault(enc);
+			result = fEncodingMemento;
+		}
+		return result;
+	}
+
+	/**
+	 * 
+	 */
+	public void set(InputStream inputStream) {
+		resetAll();
+		fReader = new ByteReader(inputStream);
+		try {
+			fReader.mark(CodedIO.MAX_MARK_SIZE);
+		}
+		catch (IOException e) {
+			// impossible, since we know ByteReader
+			// supports marking
+			throw new Error(e);
+		}
+	}
+
+	/**
+	 * 
+	 */
+	public void set(IStorage iStorage) throws CoreException {
+		resetAll();
+		InputStream inputStream = iStorage.getContents();
+		InputStream resettableStream = new BufferedInputStream(inputStream, CodedIO.MAX_BUF_SIZE);
+		resettableStream.mark(CodedIO.MAX_MARK_SIZE);
+		set(resettableStream);
+		// TODO we'll need to "remember" IFile, or
+		// get its (or its project's) settings, in case
+		// those are needed to handle cases when the
+		// encoding is not in the file stream.
+	}
+
+	/**
+	 * Note: this is not part of interface to help avoid confusion ... it
+	 * expected this Reader is a well formed character reader ... that is, its
+	 * all ready been determined to not be a unicode marked input stream. And,
+	 * its assumed to be in the correct position, at position zero, ready to
+	 * read first character.
+	 */
+	public void set(Reader reader) {
+		resetAll();
+		fReader = reader;
+		if (!fReader.markSupported()) {
+			fReader = new BufferedReader(fReader);
+		}
+		try {
+			fReader.mark(CodedIO.MAX_MARK_SIZE);
+		}
+		catch (IOException e) {
+			// impossble, since we just checked if markable
+			throw new Error(e);
+		}
+	}
+
 	private boolean canHandleAsUnicodeStream(String tokenType) {
 		boolean canHandleAsUnicode = false;
 		if (tokenType == EncodingParserConstants.UTF83ByteBOM) {
@@ -106,6 +227,139 @@
 	}
 
 	/**
+	 * Note: once this instance is created, trace info still needs to be
+	 * appended by caller, depending on the context its created.
+	 */
+	private void createEncodingMemento(String detectedCharsetName) {
+		fEncodingMemento = new EncodingMemento();
+		fEncodingMemento.setJavaCharsetName(getAppropriateJavaCharset(detectedCharsetName));
+		fEncodingMemento.setDetectedCharsetName(detectedCharsetName);
+		// TODO: if detectedCharset and spec default is
+		// null, need to use "work
+		// bench based" defaults.
+		fEncodingMemento.setAppropriateDefault(getSpecDefaultEncoding());
+	}
+
+	/**
+	 * There can sometimes be mulitple 'encodings' specified in a file. This
+	 * is an attempt to centralize the rules for deciding between them.
+	 * Returns encoding according to priority: 1. XML Declaration 2. page
+	 * directive pageEncoding name 3. page directive contentType charset name
+	 */
+	private String getAppropriateEncoding() {
+		String result = null;
+		if (fXMLDecEncodingName != null)
+			result = fXMLDecEncodingName;
+		else if (fPageEncodingValue != null)
+			result = fPageEncodingValue;
+		else if (fCharset != null)
+			result = fCharset;
+		return result;
+	}
+
+	/**
+	 * This method can return null, if invalid charset name (in which case
+	 * "appropriateDefault" should be used, if a name is really need for some
+	 * "save anyway" cases).
+	 * 
+	 * @param detectedCharsetName
+	 * @return
+	 */
+	private String getAppropriateJavaCharset(String detectedCharsetName) {
+		String result = null;
+		// 1. Check explicit mapping overrides from
+		// property file -- its here we pick up "rules" for cases
+		// that are not even in Java
+		result = CodedIO.checkMappingOverrides(detectedCharsetName);
+		// 2. Use the "canonical" name from JRE mappings
+		// Note: see Charset JavaDoc, the name you get one
+		// with can be alias,
+		// the name you get back is "standard" name.
+		Charset javaCharset = null;
+		try {
+			javaCharset = Charset.forName(detectedCharsetName);
+		}
+		catch (UnsupportedCharsetException e) {
+			// only set invalid, if result is same as detected -- they won't
+			// be equal if
+			// overridden
+			if (result != null && result.equals(detectedCharsetName)) {
+				fEncodingMemento.setInvalidEncoding(detectedCharsetName);
+			}
+		}
+		catch (IllegalCharsetNameException e) {
+			// only set invalid, if result is same as detected -- they won't
+			// be equal if
+			// overridden
+			if (result != null && result.equals(detectedCharsetName)) {
+				fEncodingMemento.setInvalidEncoding(detectedCharsetName);
+			}
+		}
+		// give priority to java cononical name, if present
+		if (javaCharset != null) {
+			result = javaCharset.name();
+			// but still allow overrides
+			result = CodedIO.checkMappingOverrides(result);
+		}
+		return result;
+	}
+
+	private JSPHeadTokenizer getTokinizer() {
+		if (fTokenizer == null) {
+			fTokenizer = new JSPHeadTokenizer();
+		}
+		return fTokenizer;
+	}
+
+	private void handleSpecDefault() {
+		String encodingName;
+		encodingName = getSpecDefaultEncoding();
+		if (encodingName != null) {
+			// createEncodingMemento(encodingName,
+			// EncodingMemento.USED_CONTENT_TYPE_DEFAULT);
+			fEncodingMemento = new EncodingMemento();
+			fEncodingMemento.setJavaCharsetName(encodingName);
+			fEncodingMemento.setAppropriateDefault(encodingName);
+		}
+	}
+
+	private boolean isLegalString(String valueTokenType) {
+		boolean result = false;
+		if (valueTokenType != null) {
+			result = valueTokenType.equals(EncodingParserConstants.StringValue) || valueTokenType.equals(EncodingParserConstants.UnDelimitedStringValue) || valueTokenType.equals(EncodingParserConstants.InvalidTerminatedStringValue) || valueTokenType.equals(EncodingParserConstants.InvalidTermintatedUnDelimitedStringValue);
+		}
+		return result;
+	}
+
+	private void parseContentTypeValue(String contentType) {
+		Pattern pattern = Pattern.compile(";\\s*charset\\s*=\\s*"); //$NON-NLS-1$
+		String[] parts = pattern.split(contentType);
+		if (parts.length > 0) {
+			// if only one item, it can still be charset instead of
+			// contentType
+			if (parts.length == 1) {
+				if (parts[0].length() > 6) {
+					String checkForCharset = parts[0].substring(0, 7);
+					if (checkForCharset.equalsIgnoreCase("charset")) { //$NON-NLS-1$
+						int eqpos = parts[0].indexOf('=');
+						eqpos = eqpos + 1;
+						if (eqpos < parts[0].length()) {
+							fCharset = parts[0].substring(eqpos);
+							fCharset = fCharset.trim();
+						}
+					}
+				}
+			}
+			else {
+				fContentType = parts[0];
+			}
+		}
+		if (parts.length > 1) {
+			fCharset = parts[1];
+		}
+	}
+
+	/**
 	 * Looks for what ever encoding properties the tokenizer returns. Its the
 	 * responsibility of the tokenizer to stop when appropriate and not go too
 	 * far.
@@ -168,51 +422,27 @@
 
 	}
 
-	private boolean isLegalString(String valueTokenType) {
-		if (valueTokenType == null)
-			return false;
-		else
-			return valueTokenType.equals(EncodingParserConstants.StringValue) || valueTokenType.equals(EncodingParserConstants.UnDelimitedStringValue) || valueTokenType.equals(EncodingParserConstants.InvalidTerminatedStringValue) || valueTokenType.equals(EncodingParserConstants.InvalidTermintatedUnDelimitedStringValue);
-	}
-
-	private void parseContentTypeValue(String contentType) {
-		Pattern pattern = Pattern.compile(";\\s*charset\\s*=\\s*"); //$NON-NLS-1$
-		String[] parts = pattern.split(contentType);
-		if (parts.length > 0) {
-			// if only one item, it can still be charset instead of
-			// contentType
-			if (parts.length == 1) {
-				if (parts[0].length() > 6) {
-					String checkForCharset = parts[0].substring(0, 7);
-					if (checkForCharset.equalsIgnoreCase("charset")) { //$NON-NLS-1$
-						int eqpos = parts[0].indexOf('=');
-						eqpos = eqpos + 1;
-						if (eqpos < parts[0].length()) {
-							fCharset = parts[0].substring(eqpos);
-							fCharset = fCharset.trim();
-						}
-					}
-				}
+	private void parseInput() throws IOException {
+		JSPHeadTokenizer tokenizer = getTokinizer();
+		fReader.reset();
+		tokenizer.reset(fReader);
+		parseHeader(tokenizer);
+		// unicode stream cases are created directly in parseHeader
+		if (!unicodeCase) {
+			String enc = getAppropriateEncoding();
+			if (enc != null && enc.length() > 0) {
+				createEncodingMemento(enc, EncodingMemento.FOUND_ENCODING_IN_CONTENT);
 			}
-			else {
-				fContentType = parts[0];
-			}
-		}
-		if (parts.length > 1) {
-			fCharset = parts[1];
 		}
 	}
 
 	/**
-	 *  
+	 * 
 	 */
-
-	public void set(IFile iFile) throws CoreException {
-		reset();
-		super.set(iFile);
-	}
-
-	private void reset() {
+	private void resetAll() {
+		fReader = null;
+		fHeaderParsed = false;
+		fEncodingMemento = null;
 		fCharset = null;
 		fContentTypeValue = null;
 		fPageEncodingValue = null;
@@ -220,38 +450,24 @@
 		unicodeCase = false;
 	}
 
-	public void set(InputStream inputStream) {
-		reset();
-		super.set(inputStream);
-	}
 
-	public void set(Reader reader) {
-		reset();
-		super.set(reader);
-	}
 
-	public String getLanguage() throws IOException {
-		ensureInputSet();
-		if (!fHeaderParsed) {
-			parseInput();
-			fHeaderParsed = true;
-		}
-		return fLanguage;
+	/**
+	 * convience method all subclasses can use (but not override)
+	 * 
+	 * @param detectedCharsetName
+	 * @param reason
+	 */
+	private void createEncodingMemento(String detectedCharsetName, String reason) {
+		createEncodingMemento(detectedCharsetName);
 	}
 
 	/**
-	 * @return Returns the contentType.
+	 * convience method all subclasses can use (but not override)
 	 */
-	public String getContentType() throws IOException {
-		ensureInputSet();
-		if (!fHeaderParsed) {
-			parseInput();
-			// we keep track of if header's already been parse, so can make
-			// multiple 'get' calls, without causing reparsing.
-			fHeaderParsed = true;
-			// Note: there is a "hidden assumption" here that an empty
-			// string in content should be treated same as not present.
+	private void ensureInputSet() {
+		if (fReader == null) {
+			throw new IllegalStateException("input must be set before use"); //$NON-NLS-1$
 		}
-		return fContentType;
 	}
 }
\ No newline at end of file
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contenttype/NullMemento.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contenttype/NullMemento.java
deleted file mode 100644
index 8c04324..0000000
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contenttype/NullMemento.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.jst.jsp.core.internal.contenttype;
-
-import org.eclipse.wst.sse.core.internal.encoding.EncodingMemento;
-import org.eclipse.wst.sse.core.internal.encoding.NonContentBasedEncodingRules;
-
-
-
-/**
- * This class can be used in place of an EncodingMemento (its super class),
- * when there is not in fact ANY encoding information. For example, when a
- * structuredDocument is created directly from a String
- */
-public class NullMemento extends EncodingMemento {
-	/**
-	 *  
-	 */
-	public NullMemento() {
-		super();
-		String defaultCharset = NonContentBasedEncodingRules.useDefaultNameRules(null);
-		setJavaCharsetName(defaultCharset);
-		setAppropriateDefault(defaultCharset);
-		setDetectedCharsetName(null);
-	}
-
-}
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/document/DocumentFactoryForJSP.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/document/DocumentFactoryForJSP.java
index 5a1c5ff..d0050e2 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/document/DocumentFactoryForJSP.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/document/DocumentFactoryForJSP.java
@@ -12,8 +12,8 @@
 
 import org.eclipse.core.filebuffers.IDocumentFactory;
 import org.eclipse.jface.text.IDocument;
-import org.eclipse.jst.jsp.core.JSP11Namespace;
 import org.eclipse.jst.jsp.core.internal.parser.JSPSourceParser;
+import org.eclipse.jst.jsp.core.internal.provisional.JSP11Namespace;
 import org.eclipse.wst.sse.core.internal.document.StructuredDocumentFactory;
 import org.eclipse.wst.sse.core.internal.ltk.parser.RegionParser;
 import org.eclipse.wst.sse.core.internal.ltk.parser.TagMarker;
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/encoding/JSPDocumentLoader.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/encoding/JSPDocumentLoader.java
index b53230c..7703566 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/encoding/JSPDocumentLoader.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/encoding/JSPDocumentLoader.java
@@ -12,6 +12,7 @@
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.Reader;
 import java.io.UnsupportedEncodingException;
 
 import org.eclipse.core.resources.IFile;
@@ -21,20 +22,23 @@
 import org.eclipse.core.runtime.Path;
 import org.eclipse.jface.text.IDocument;
 import org.eclipse.jface.text.IDocumentPartitioner;
-import org.eclipse.jst.jsp.core.JSP11Namespace;
-import org.eclipse.jst.jsp.core.contenttype.ContentTypeIdForJSP;
+import org.eclipse.jst.jsp.core.internal.Assert;
 import org.eclipse.jst.jsp.core.internal.document.PageDirectiveAdapter;
 import org.eclipse.jst.jsp.core.internal.document.PageDirectiveWatcherFactory;
 import org.eclipse.jst.jsp.core.internal.parser.JSPReParser;
 import org.eclipse.jst.jsp.core.internal.parser.JSPSourceParser;
+import org.eclipse.jst.jsp.core.internal.provisional.JSP11Namespace;
+import org.eclipse.jst.jsp.core.internal.provisional.contenttype.ContentTypeIdForJSP;
 import org.eclipse.jst.jsp.core.internal.text.StructuredTextPartitionerForJSP;
 import org.eclipse.wst.sse.core.internal.PropagatingAdapter;
 import org.eclipse.wst.sse.core.internal.document.AbstractDocumentLoader;
 import org.eclipse.wst.sse.core.internal.document.IDocumentCharsetDetector;
 import org.eclipse.wst.sse.core.internal.document.IDocumentLoader;
 import org.eclipse.wst.sse.core.internal.document.StructuredDocumentFactory;
+import org.eclipse.wst.sse.core.internal.encoding.CodedIO;
 import org.eclipse.wst.sse.core.internal.encoding.CodedReaderCreator;
 import org.eclipse.wst.sse.core.internal.encoding.ContentTypeEncodingPreferences;
+import org.eclipse.wst.sse.core.internal.encoding.util.BufferedLimitedReader;
 import org.eclipse.wst.sse.core.internal.ltk.modelhandler.EmbeddedTypeHandler;
 import org.eclipse.wst.sse.core.internal.ltk.parser.JSPCapableParser;
 import org.eclipse.wst.sse.core.internal.ltk.parser.RegionParser;
@@ -46,7 +50,6 @@
 import org.eclipse.wst.sse.core.internal.provisional.document.IEncodedDocument;
 import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
 import org.eclipse.wst.sse.core.internal.text.BasicStructuredDocument;
-import org.eclipse.wst.sse.ui.internal.util.Assert;
 import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
 import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
 import org.eclipse.wst.xml.core.internal.ssemodelquery.ModelQueryAdapter;
@@ -211,9 +214,12 @@
 			String mimeType = null;
 
 			IDocumentCharsetDetector jspProvider = getDocumentEncodingDetector();
-			jspProvider.set(getFullPreparedReader());
+			Reader fullPreparedReader = getFullPreparedReader();
+			BufferedLimitedReader limitedReader = new BufferedLimitedReader(fullPreparedReader, CodedIO.MAX_BUF_SIZE);
+			jspProvider.set(limitedReader);
 			if (jspProvider instanceof IJSPHeadContentDetector) {
 				mimeType = ((IJSPHeadContentDetector) jspProvider).getContentType();
+				fullPreparedReader.reset();
 			}
 
 			EmbeddedTypeRegistry reg = getEmbeddedContentTypeRegistry();
@@ -365,7 +371,7 @@
 			initEmbeddedType(newModel);
 		}
 		else {
-			//initEmbeddedType(newModel);
+			// initEmbeddedType(newModel);
 			initCloneOfEmbeddedType(newModel, existingEmbeddedType, newEmbeddedContentType);
 		}
 		setLanguageInPageDirective(newModel);
@@ -400,8 +406,8 @@
 		// being initialized, and doesn't even have content
 		// or an ID yet. I thought I'd leave, since it wouldn't
 		// hurt, in case its called in other circumstances.
-		//		String language = getLanguage(model);
-		//		pageDirectiveAdapter.setLanguage(language);
+		// String language = getLanguage(model);
+		// pageDirectiveAdapter.setLanguage(language);
 	}
 
 	/**
@@ -427,7 +433,7 @@
 	protected IEncodedDocument newEncodedDocument() {
 		IStructuredDocument structuredDocument = StructuredDocumentFactory.getNewStructuredDocumentInstance(getParser());
 		((BasicStructuredDocument) structuredDocument).setReParser(new JSPReParser());
-		//		structuredDocument.setDocumentPartitioner(new
+		// structuredDocument.setDocumentPartitioner(new
 		// JSPJavaDocumentPartioner());
 		// even though this is an "empty model" ... we want it to have at
 		// least
@@ -448,7 +454,7 @@
 		// document must have already been set for this to
 		// work.
 		Document document = domModel.getDocument();
-		Assert.isNotNull(document);
+		Assert.isNotNull(document, "Program Error: structured model had no structuredDocument");
 		// if there is a model in the adapter, this will adapt it to
 		// first node. After that the PropagatingAdater spreads over the
 		// children being
@@ -463,8 +469,7 @@
 		// before content is set in the model, so taglib initization can
 		// take place.
 		((INodeNotifier) document).getAdapterFor(ModelQueryAdapter.class);
-		//
-		// 
+		
 	}
 
 	/**
@@ -499,33 +504,33 @@
 		// to accomplish this, we'll just remove all, then
 		// add back with a call to pre-load adapt.
 		// let clients decide to unload adapters from document
-		//		Collection oldAdapters = document.getAdapters();
-		//		Iterator oldAdaptersIterator = oldAdapters.iterator();
-		//		while (oldAdaptersIterator.hasNext()) {
-		//			INodeAdapter oldAdapter = (INodeAdapter)
+		// Collection oldAdapters = document.getAdapters();
+		// Iterator oldAdaptersIterator = oldAdapters.iterator();
+		// while (oldAdaptersIterator.hasNext()) {
+		// INodeAdapter oldAdapter = (INodeAdapter)
 		// oldAdaptersIterator.next();
-		//			if (oldAdapter != pageDirectiveAdapter && oldAdapter !=
+		// if (oldAdapter != pageDirectiveAdapter && oldAdapter !=
 		// propagatingAdapter && oldAdapter != modelQueryAdapter) {
-		//				// DO NOT remove directly!
-		//				// can change contents while in notifity loop!
-		//				//oldAdaptersIterator.remove();
-		//				document.removeAdapter(oldAdapter);
-		//			}
-		//		}
+		// // DO NOT remove directly!
+		// // can change contents while in notifity loop!
+		// //oldAdaptersIterator.remove();
+		// document.removeAdapter(oldAdapter);
+		// }
+		// }
 		// DMW: I believe something like the following is needed,
 		// since releases cached adapters
-		//				if (document instanceof DocumentImpl) {
-		//					((DocumentImpl) document).releaseDocumentType();
-		//					((DocumentImpl) document).releaseStyleSheets();
-		//				}
+		// if (document instanceof DocumentImpl) {
+		// ((DocumentImpl) document).releaseDocumentType();
+		// ((DocumentImpl) document).releaseStyleSheets();
+		// }
 		// remember, embedded type factories are automatically cleared when
 		// embededType changed
 		pageDirectiveAdapter.setEmbeddedType(newEmbeddedContentType);
-		//		// but still need to clear the page directive watchers, and let
+		// // but still need to clear the page directive watchers, and let
 		// them
 		// be
 		// rediscovered (with new, accurate node as target)
-		//		pageDirectiveAdapter.clearPageWatchers();
+		// pageDirectiveAdapter.clearPageWatchers();
 		if (newEmbeddedContentType != null) {
 			newEmbeddedContentType.initializeFactoryRegistry(model.getFactoryRegistry());
 			newEmbeddedContentType.initializeParser((JSPCapableParser) structuredDocument.getParser());
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/search/IndexWorkspaceJob.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/search/IndexWorkspaceJob.java
index f1eb227..85d3b67 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/search/IndexWorkspaceJob.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/search/IndexWorkspaceJob.java
@@ -25,8 +25,8 @@
 import org.eclipse.core.runtime.Status;
 import org.eclipse.core.runtime.content.IContentType;
 import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jst.jsp.core.contenttype.ContentTypeIdForJSP;
 import org.eclipse.jst.jsp.core.internal.JSPCoreMessages;
+import org.eclipse.jst.jsp.core.internal.provisional.contenttype.ContentTypeIdForJSP;
 
 /**
  * Re-indexes the entire workspace.
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/search/JSPIndexManager.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/search/JSPIndexManager.java
index c7607ff..c1f348b 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/search/JSPIndexManager.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/search/JSPIndexManager.java
@@ -33,10 +33,10 @@
 import org.eclipse.jdt.internal.core.JavaModelManager;
 import org.eclipse.jdt.internal.core.index.Index;
 import org.eclipse.jdt.internal.core.search.indexing.IndexManager;
-import org.eclipse.jst.jsp.core.contenttype.ContentTypeIdForJSP;
 import org.eclipse.jst.jsp.core.internal.JSPCoreMessages;
 import org.eclipse.jst.jsp.core.internal.JSPCorePlugin;
 import org.eclipse.jst.jsp.core.internal.Logger;
+import org.eclipse.jst.jsp.core.internal.provisional.contenttype.ContentTypeIdForJSP;
 import org.eclipse.osgi.util.NLS;
 import org.osgi.framework.Bundle;
 
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/search/JSPPathIndexer.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/search/JSPPathIndexer.java
index cb45463..3919f96 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/search/JSPPathIndexer.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/search/JSPPathIndexer.java
@@ -24,7 +24,7 @@
 import org.eclipse.core.runtime.content.IContentType;
 import org.eclipse.jdt.core.search.IJavaSearchScope;
 import org.eclipse.jdt.core.search.SearchPattern;
-import org.eclipse.jst.jsp.core.contenttype.ContentTypeIdForJSP;
+import org.eclipse.jst.jsp.core.internal.provisional.contenttype.ContentTypeIdForJSP;
 
 /**
  * pa_TODO Still need to take into consideration:
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/search/JSPSearchParticipant.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/search/JSPSearchParticipant.java
index 044f5aa..45e02e9 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/search/JSPSearchParticipant.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/search/JSPSearchParticipant.java
@@ -33,20 +33,23 @@
 public class JSPSearchParticipant extends SearchParticipant {
 
 	// for debugging
-	private static final boolean DEBUG;
-	static {
-		String value= Platform.getDebugOption("org.eclipse.jst.jsp.core/debug/jspsearch"); //$NON-NLS-1$
-		DEBUG= value != null && value.equalsIgnoreCase("true"); //$NON-NLS-1$
+	private static final boolean DEBUG = calculateValue();
+
+	private static boolean calculateValue() {
+		String value = Platform.getDebugOption("org.eclipse.jst.jsp.core/debug/jspsearch"); //$NON-NLS-1$
+		boolean debug = value != null && value.equalsIgnoreCase("true"); //$NON-NLS-1$
+		return debug;
 	}
-	
+
 	/**
-	 * Important to never return null here or else Java search participation will break.
+	 * Important to never return null here or else Java search participation
+	 * will break.
 	 */
 	public SearchDocument getDocument(String documentPath) {
-		
+
 		SearchDocument sDoc = JSPSearchSupport.getInstance().getSearchDocument(documentPath);
 
-		if(sDoc == null){
+		if (sDoc == null) {
 			// return a dummy doc here so search participation doesn't break
 			return new NullSearchDocument(documentPath);
 		}
@@ -72,9 +75,9 @@
 
 	public void locateMatches(SearchDocument[] indexMatches, SearchPattern pattern, IJavaSearchScope scope, SearchRequestor requestor, IProgressMonitor monitor) throws CoreException {
 
-		if(monitor != null && monitor.isCanceled())
+		if (monitor != null && monitor.isCanceled())
 			return;
-			
+
 		// filter out null matches
 		List filtered = new ArrayList();
 		SearchDocument match = null;
@@ -83,9 +86,10 @@
 				System.out.println("found possible matching JavaSearchDocumentDelegate: " + indexMatches[i]); //$NON-NLS-1$
 			match = indexMatches[i];
 			if (match != null) {
-				// some matches may be null, or if the index is out of date, the file may not even exist
-				if(match instanceof JavaSearchDocumentDelegate && ((JavaSearchDocumentDelegate)match).getFile().exists())
-				filtered.add(match);
+				// some matches may be null, or if the index is out of date,
+				// the file may not even exist
+				if (match instanceof JavaSearchDocumentDelegate && ((JavaSearchDocumentDelegate) match).getFile().exists())
+					filtered.add(match);
 			}
 		}
 
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/search/JSPSearchSupport.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/search/JSPSearchSupport.java
index 2f96a45..e430847 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/search/JSPSearchSupport.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/search/JSPSearchSupport.java
@@ -39,11 +39,11 @@
 import org.eclipse.jdt.internal.compiler.util.SimpleLookupTable;
 import org.eclipse.jdt.internal.core.JavaModelManager;
 import org.eclipse.jdt.internal.core.search.indexing.IndexManager;
-import org.eclipse.jst.jsp.core.contenttype.ContentTypeIdForJSP;
 import org.eclipse.jst.jsp.core.internal.JSPCoreMessages;
 import org.eclipse.jst.jsp.core.internal.JSPCorePlugin;
 import org.eclipse.jst.jsp.core.internal.Logger;
 import org.eclipse.jst.jsp.core.internal.java.JSP2ServletNameUtil;
+import org.eclipse.jst.jsp.core.internal.provisional.contenttype.ContentTypeIdForJSP;
 
 /**
  * Central access to java indexing and search. All contact between JDT indexing
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/parser/JSPReParser.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/parser/JSPReParser.java
index 98ef0c1..effcef2 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/parser/JSPReParser.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/parser/JSPReParser.java
@@ -13,8 +13,8 @@
 
 import java.util.Iterator;
 
-import org.eclipse.jst.jsp.core.JSP12Namespace;
 import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.JSP11TLDNames;
+import org.eclipse.jst.jsp.core.internal.provisional.JSP12Namespace;
 import org.eclipse.jst.jsp.core.internal.regions.DOMJSPRegionContexts;
 import org.eclipse.wst.sse.core.internal.ltk.parser.RegionParser;
 import org.eclipse.wst.sse.core.internal.ltk.parser.StructuredDocumentRegionParser;
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/parser/JSPSourceParser.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/parser/JSPSourceParser.java
index 4794289..26d84c7 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/parser/JSPSourceParser.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/parser/JSPSourceParser.java
@@ -13,9 +13,9 @@
 import java.util.Iterator;
 import java.util.List;
 
-import org.eclipse.jst.jsp.core.JSP12Namespace;
 import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.JSP12TLDNames;
 import org.eclipse.jst.jsp.core.internal.parser.internal.JSPTokenizer;
+import org.eclipse.jst.jsp.core.internal.provisional.JSP12Namespace;
 import org.eclipse.jst.jsp.core.internal.regions.DOMJSPRegionContexts;
 import org.eclipse.wst.sse.core.internal.ltk.parser.BlockTokenizer;
 import org.eclipse.wst.sse.core.internal.ltk.parser.JSPCapableParser;
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/JSP11Namespace.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/provisional/JSP11Namespace.java
similarity index 98%
rename from bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/JSP11Namespace.java
rename to bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/provisional/JSP11Namespace.java
index a92bc94..0c179a7 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/JSP11Namespace.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/provisional/JSP11Namespace.java
@@ -8,7 +8,7 @@
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
-package org.eclipse.jst.jsp.core;
+package org.eclipse.jst.jsp.core.internal.provisional;
 
 
 /**
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/JSP12Namespace.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/provisional/JSP12Namespace.java
similarity index 92%
rename from bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/JSP12Namespace.java
rename to bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/provisional/JSP12Namespace.java
index 5c241ef..c24b244 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/JSP12Namespace.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/provisional/JSP12Namespace.java
@@ -8,7 +8,7 @@
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
-package org.eclipse.jst.jsp.core;
+package org.eclipse.jst.jsp.core.internal.provisional;
 
 /**
  * Names for JSP 1.2 spec.
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/JSP20Namespace.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/provisional/JSP20Namespace.java
similarity index 94%
rename from bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/JSP20Namespace.java
rename to bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/provisional/JSP20Namespace.java
index 26b38ca..5852c43 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/JSP20Namespace.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/provisional/JSP20Namespace.java
@@ -8,7 +8,7 @@
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
-package org.eclipse.jst.jsp.core;
+package org.eclipse.jst.jsp.core.internal.provisional;
 
 /**
  * New names for JSP 2.0 spec.
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/contenttype/ContentTypeIdForJSP.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/provisional/contenttype/ContentTypeIdForJSP.java
similarity index 94%
rename from bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/contenttype/ContentTypeIdForJSP.java
rename to bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/provisional/contenttype/ContentTypeIdForJSP.java
index 70c3e68..07f47a3 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/contenttype/ContentTypeIdForJSP.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/provisional/contenttype/ContentTypeIdForJSP.java
@@ -10,7 +10,7 @@
  *     
  *******************************************************************************/
 
-package org.eclipse.jst.jsp.core.contenttype;
+package org.eclipse.jst.jsp.core.internal.provisional.contenttype;
 
 /**
  * This class, with its one field, is a convience to provide compile-time
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contenttype/IContentDescriptionForJSP.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/provisional/contenttype/IContentDescriptionForJSP.java
similarity index 86%
rename from bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contenttype/IContentDescriptionForJSP.java
rename to bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/provisional/contenttype/IContentDescriptionForJSP.java
index 2b7a4af..6caee22 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contenttype/IContentDescriptionForJSP.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/provisional/contenttype/IContentDescriptionForJSP.java
@@ -8,7 +8,7 @@
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
-package org.eclipse.jst.jsp.core.internal.contenttype;
+package org.eclipse.jst.jsp.core.internal.provisional.contenttype;
 
 import org.eclipse.core.runtime.QualifiedName;
 import org.eclipse.wst.sse.core.internal.encoding.ICodedResourcePlugin;
@@ -16,8 +16,7 @@
 
 public interface IContentDescriptionForJSP {
 	/**
-	 * This should not be considered API at this point. It should probably be
-	 * moved in future.
+	 * Extra properties as part of ContentDescription, if the content is JSP.
 	 */
 	public final static QualifiedName CONTENT_TYPE_ATTRIBUTE = new QualifiedName(ICodedResourcePlugin.ID, "contentTypeAttribute"); //$NON-NLS-1$
 	public final static QualifiedName LANGUAGE_ATTRIBUTE = new QualifiedName(ICodedResourcePlugin.ID, "languageAttribute"); //$NON-NLS-1$
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/text/IJSPPartitionTypes.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/provisional/text/IJSPPartitionTypes.java
similarity index 93%
rename from bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/text/IJSPPartitionTypes.java
rename to bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/provisional/text/IJSPPartitionTypes.java
index 52fe6d4..b4a23b9 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/text/IJSPPartitionTypes.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/provisional/text/IJSPPartitionTypes.java
@@ -1,4 +1,4 @@
-package org.eclipse.jst.jsp.core.text;
+package org.eclipse.jst.jsp.core.internal.provisional.text;
 
 
 /**
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/text/StructuredTextPartitionerForJSP.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/text/StructuredTextPartitionerForJSP.java
index 0abc9c4..30144e9 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/text/StructuredTextPartitionerForJSP.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/text/StructuredTextPartitionerForJSP.java
@@ -18,13 +18,13 @@
 import org.eclipse.core.runtime.Platform;
 import org.eclipse.jface.text.IDocument;
 import org.eclipse.jface.text.IDocumentPartitioner;
-import org.eclipse.jst.jsp.core.JSP11Namespace;
-import org.eclipse.jst.jsp.core.JSP12Namespace;
 import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.JSP12TLDNames;
 import org.eclipse.jst.jsp.core.internal.encoding.JSPDocumentHeadContentDetector;
 import org.eclipse.jst.jsp.core.internal.parser.JSPSourceParser;
+import org.eclipse.jst.jsp.core.internal.provisional.JSP11Namespace;
+import org.eclipse.jst.jsp.core.internal.provisional.JSP12Namespace;
+import org.eclipse.jst.jsp.core.internal.provisional.text.IJSPPartitionTypes;
 import org.eclipse.jst.jsp.core.internal.regions.DOMJSPRegionContexts;
-import org.eclipse.jst.jsp.core.text.IJSPPartitionTypes;
 import org.eclipse.wst.html.core.internal.text.StructuredTextPartitionerForHTML;
 import org.eclipse.wst.sse.core.internal.ltk.parser.StructuredDocumentRegionHandler;
 import org.eclipse.wst.sse.core.internal.ltk.parser.StructuredDocumentRegionHandlerExtension;
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/util/DocumentProvider.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/util/DocumentProvider.java
index b8ee4c8..1122fd2 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/util/DocumentProvider.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/util/DocumentProvider.java
@@ -15,7 +15,6 @@
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
@@ -30,7 +29,6 @@
 import javax.xml.parsers.ParserConfigurationException;
 
 import org.eclipse.jst.jsp.core.internal.Logger;
-import org.eclipse.wst.sse.core.internal.provisional.exceptions.SourceEditingRuntimeException;
 import org.eclipse.wst.sse.core.internal.util.JarUtilities;
 import org.w3c.dom.DOMException;
 import org.w3c.dom.DOMImplementation;
@@ -52,22 +50,23 @@
  */
 
 public class DocumentProvider {
-	protected Document document = null;
-	protected ErrorHandler errorHandler = null;
+	private Document document = null;
+	private ErrorHandler errorHandler = null;
 	private String fBaseReference;
-	protected String fileName = null;
-	protected boolean fValidating = true;
-	protected InputStream inputStream = null;
-	protected String jarFileName = null;
-	protected EntityResolver resolver = null;
+	private String fileName = null;
+	private boolean fValidating = true;
+	private InputStream inputStream = null;
+	private String jarFileName = null;
+	private EntityResolver resolver = null;
 
-	protected Node rootElement = null;
-	protected String rootElementName = null;
+	private Node rootElement = null;
+	private String rootElementName = null;
 
 	public DocumentProvider() {
+		super();
 	}
 
-	protected Document _getParsedDocumentDOM2() {
+	private Document _getParsedDocumentDOM2() {
 		Document result = null;
 
 		InputStream is = null;
@@ -128,11 +127,11 @@
 		return document;
 	}
 
-	protected DocumentBuilder getDocumentBuilder() {
+	private DocumentBuilder getDocumentBuilder() {
 		return CommonXML.getDocumentBuilder(isValidating());
 	}
 
-	protected DOMImplementation getDomImplementation() {
+	private DOMImplementation getDomImplementation() {
 		DocumentBuilder builder = null;
 		try {
 			builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
@@ -156,12 +155,13 @@
 	 * child element manipulation.
 	 ************************************************************************/
 	public Element getElement(String name) {
+		Element result = null;
 		if (document == null)
 			load();
-		if (document != null)
-			return (Element) getNode(getRootElement(), name);
-		else
-			return null;
+		if (document != null) {
+			result = (Element) getNode(getRootElement(), name);
+		}
+		return result;
 	}
 
 	/**
@@ -234,7 +234,7 @@
 		return jarFileName;
 	}
 
-	protected Node getNamedChild(Node parent, String childName) {
+	private Node getNamedChild(Node parent, String childName) {
 		if (parent == null) {
 			return null;
 		}
@@ -246,7 +246,7 @@
 		return null;
 	}
 
-	protected Document getNewDocument() {
+	private Document getNewDocument() {
 		Document result = null;
 		try {
 			result = getDomImplementation().createDocument("", getRootElementName(), null); //$NON-NLS-1$
@@ -270,7 +270,7 @@
 	 * structure exists below the head element, down through 'c', and returns
 	 * the element 'c'.
 	 ************************************************************************/
-	protected Node getNode(Node node, String name) {
+	private Node getNode(Node node, String name) {
 		StringTokenizer tokenizer = new StringTokenizer(name, "/"); //$NON-NLS-1$
 		String token = null;
 		while (tokenizer.hasMoreTokens()) {
@@ -305,7 +305,7 @@
 		return errorHandler;
 	}
 
-	protected Document getParsedDocument() {
+	private Document getParsedDocument() {
 		Document result = null;
 		if (inputStream == null) {
 			File existenceTester = null;
@@ -337,7 +337,7 @@
 	 * 
 	 * @return org.w3c.dom.Element
 	 */
-	protected Node getRootElement(Document doc) {
+	private Node getRootElement(Document doc) {
 		if (doc == null)
 			return null;
 		if (doc.getDocumentElement() != null)
@@ -361,7 +361,7 @@
 		return rootElementName;
 	}
 
-	protected boolean isJAR() {
+	private boolean isJAR() {
 		return getJarFileName() != null;
 	}
 
@@ -403,7 +403,7 @@
 		}
 	}
 
-	protected void saveDocument(Document odocument, OutputStream stream) throws IOException {
+	private void saveDocument(Document odocument, OutputStream stream) throws IOException {
 		CommonXML.serialize(odocument, stream);
 	}
 
@@ -457,36 +457,4 @@
 	public void setValidating(boolean b) {
 		fValidating = b;
 	}
-
-	public void store() {
-		if (isJAR())
-			return;
-
-		if (rootElement == null) {
-			document = getNewDocument();
-			rootElement = document.getDocumentElement();
-		}
-
-		try {
-			OutputStream ostream = new FileOutputStream(getFileName());
-
-			storeDocument(document, ostream);
-
-			ostream.flush();
-			ostream.close();
-		}
-		catch (IOException e) {
-			Logger.logException("Exception saving document " + getFileName(), e); //$NON-NLS-1$
-			throw new SourceEditingRuntimeException(e);
-		}
-	}
-
-	protected void storeDocument(Document odocument, OutputStream ostream) {
-		try {
-			saveDocument(odocument, ostream);
-		}
-		catch (IOException e) {
-			Logger.logException(e);
-		}
-	}
 }
\ No newline at end of file
diff --git a/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/breakpointproviders/AbstractBreakpointProvider.java b/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/breakpointproviders/AbstractBreakpointProvider.java
index e0b10b6..33629b9 100644
--- a/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/breakpointproviders/AbstractBreakpointProvider.java
+++ b/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/breakpointproviders/AbstractBreakpointProvider.java
@@ -14,8 +14,8 @@
 import org.eclipse.core.resources.IResource;
 import org.eclipse.jface.text.BadLocationException;
 import org.eclipse.jface.text.IDocument;
-import org.eclipse.jst.jsp.core.JSP12Namespace;
 import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDElementDeclaration;
+import org.eclipse.jst.jsp.core.internal.provisional.JSP12Namespace;
 import org.eclipse.jst.jsp.core.internal.regions.DOMJSPRegionContexts;
 import org.eclipse.ui.IEditorInput;
 import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
diff --git a/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/breakpointproviders/JavaStratumBreakpointProvider.java b/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/breakpointproviders/JavaStratumBreakpointProvider.java
index 1329f0a..5685625 100644
--- a/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/breakpointproviders/JavaStratumBreakpointProvider.java
+++ b/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/breakpointproviders/JavaStratumBreakpointProvider.java
@@ -27,7 +27,7 @@
 import org.eclipse.jface.text.IDocument;
 import org.eclipse.jface.text.IRegion;
 import org.eclipse.jface.text.ITypedRegion;
-import org.eclipse.jst.jsp.core.text.IJSPPartitionTypes;
+import org.eclipse.jst.jsp.core.internal.provisional.text.IJSPPartitionTypes;
 import org.eclipse.jst.jsp.ui.internal.JSPUIMessages;
 import org.eclipse.jst.jsp.ui.internal.JSPUIPlugin;
 import org.eclipse.ui.IEditorInput;
diff --git a/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/contentassist/JSPContentAssistProcessor.java b/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/contentassist/JSPContentAssistProcessor.java
index 7f31145..e143bb7 100644
--- a/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/contentassist/JSPContentAssistProcessor.java
+++ b/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/contentassist/JSPContentAssistProcessor.java
@@ -28,15 +28,15 @@
 import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
 import org.eclipse.jface.text.contentassist.IContextInformation;
 import org.eclipse.jface.text.contentassist.IContextInformationValidator;
-import org.eclipse.jst.jsp.core.JSP11Namespace;
-import org.eclipse.jst.jsp.core.JSP12Namespace;
-import org.eclipse.jst.jsp.core.contenttype.ContentTypeIdForJSP;
 import org.eclipse.jst.jsp.core.internal.contentmodel.TaglibController;
 import org.eclipse.jst.jsp.core.internal.contentmodel.tld.TLDCMDocumentManager;
 import org.eclipse.jst.jsp.core.internal.document.PageDirectiveAdapter;
 import org.eclipse.jst.jsp.core.internal.document.PageDirectiveAdapterFactory;
+import org.eclipse.jst.jsp.core.internal.provisional.JSP11Namespace;
+import org.eclipse.jst.jsp.core.internal.provisional.JSP12Namespace;
+import org.eclipse.jst.jsp.core.internal.provisional.contenttype.ContentTypeIdForJSP;
+import org.eclipse.jst.jsp.core.internal.provisional.text.IJSPPartitionTypes;
 import org.eclipse.jst.jsp.core.internal.regions.DOMJSPRegionContexts;
-import org.eclipse.jst.jsp.core.text.IJSPPartitionTypes;
 import org.eclipse.jst.jsp.ui.internal.JSPUIPlugin;
 import org.eclipse.jst.jsp.ui.internal.Logger;
 import org.eclipse.jst.jsp.ui.internal.editor.JSPEditorPluginImageHelper;
diff --git a/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/contentassist/JSPJavaContentAssistProcessor.java b/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/contentassist/JSPJavaContentAssistProcessor.java
index c80b9b2..1bd8650 100644
--- a/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/contentassist/JSPJavaContentAssistProcessor.java
+++ b/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/contentassist/JSPJavaContentAssistProcessor.java
@@ -20,8 +20,8 @@
 import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
 import org.eclipse.jface.text.contentassist.IContextInformation;
 import org.eclipse.jface.text.contentassist.IContextInformationValidator;
+import org.eclipse.jst.jsp.core.internal.provisional.text.IJSPPartitionTypes;
 import org.eclipse.jst.jsp.core.internal.regions.DOMJSPRegionContexts;
-import org.eclipse.jst.jsp.core.text.IJSPPartitionTypes;
 import org.eclipse.jst.jsp.ui.internal.JSPUIMessages;
 import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
 import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
diff --git a/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/contentassist/JSPPropertyContentAssistProcessor.java b/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/contentassist/JSPPropertyContentAssistProcessor.java
index 2d8d345..4a2e028 100644
--- a/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/contentassist/JSPPropertyContentAssistProcessor.java
+++ b/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/contentassist/JSPPropertyContentAssistProcessor.java
@@ -13,7 +13,7 @@
 
 
 import org.eclipse.core.resources.IResource;
-import org.eclipse.jst.jsp.core.JSP11Namespace;
+import org.eclipse.jst.jsp.core.internal.provisional.JSP11Namespace;
 import org.eclipse.jst.jsp.ui.internal.editor.JSPEditorPluginImageHelper;
 import org.eclipse.jst.jsp.ui.internal.editor.JSPEditorPluginImages;
 import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
diff --git a/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/contentassist/JSPUseBeanContentAssistProcessor.java b/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/contentassist/JSPUseBeanContentAssistProcessor.java
index fbbe3d5..808a179 100644
--- a/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/contentassist/JSPUseBeanContentAssistProcessor.java
+++ b/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/contentassist/JSPUseBeanContentAssistProcessor.java
@@ -13,7 +13,7 @@
 
 
 import org.eclipse.jface.text.contentassist.ICompletionProposal;
-import org.eclipse.jst.jsp.core.JSP11Namespace;
+import org.eclipse.jst.jsp.core.internal.provisional.JSP11Namespace;
 import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
 import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
 import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionContainer;
diff --git a/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/contentassist/JavaTypeCompletionProposal.java b/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/contentassist/JavaTypeCompletionProposal.java
index f9cf8d3..5029428 100644
--- a/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/contentassist/JavaTypeCompletionProposal.java
+++ b/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/contentassist/JavaTypeCompletionProposal.java
@@ -20,8 +20,8 @@
 import org.eclipse.jface.text.IDocument;
 import org.eclipse.jface.text.IRegion;
 import org.eclipse.jface.text.ITextViewer;
-import org.eclipse.jst.jsp.core.JSP11Namespace;
-import org.eclipse.jst.jsp.core.JSP12Namespace;
+import org.eclipse.jst.jsp.core.internal.provisional.JSP11Namespace;
+import org.eclipse.jst.jsp.core.internal.provisional.JSP12Namespace;
 import org.eclipse.jst.jsp.core.internal.regions.DOMJSPRegionContexts;
 import org.eclipse.swt.graphics.Image;
 import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
diff --git a/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/contentassist/NoRegionContentAssistProcessorForJSP.java b/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/contentassist/NoRegionContentAssistProcessorForJSP.java
index 61b56ba..e209096 100644
--- a/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/contentassist/NoRegionContentAssistProcessorForJSP.java
+++ b/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/contentassist/NoRegionContentAssistProcessorForJSP.java
@@ -12,9 +12,9 @@
 
 import org.eclipse.jface.text.ITextViewer;
 import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
-import org.eclipse.jst.jsp.core.JSP11Namespace;
+import org.eclipse.jst.jsp.core.internal.provisional.JSP11Namespace;
+import org.eclipse.jst.jsp.core.internal.provisional.text.IJSPPartitionTypes;
 import org.eclipse.jst.jsp.core.internal.regions.DOMJSPRegionContexts;
-import org.eclipse.jst.jsp.core.text.IJSPPartitionTypes;
 import org.eclipse.wst.html.core.internal.provisional.text.IHTMLPartitionTypes;
 import org.eclipse.wst.html.ui.internal.contentassist.NoRegionContentAssistProcessorForHTML;
 import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
diff --git a/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/editor/JSPSourceEditingTextTools.java b/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/editor/JSPSourceEditingTextTools.java
index c37d401..37d6bdd 100644
--- a/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/editor/JSPSourceEditingTextTools.java
+++ b/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/editor/JSPSourceEditingTextTools.java
@@ -12,9 +12,9 @@
 
 
 
-import org.eclipse.jst.jsp.core.JSP11Namespace;
-import org.eclipse.jst.jsp.core.JSP12Namespace;
 import org.eclipse.jst.jsp.core.internal.document.PageDirectiveAdapter;
+import org.eclipse.jst.jsp.core.internal.provisional.JSP11Namespace;
+import org.eclipse.jst.jsp.core.internal.provisional.JSP12Namespace;
 import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
 import org.eclipse.wst.xml.ui.internal.provisional.XMLSourceEditingTextTools;
 import org.w3c.dom.Document;
diff --git a/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/hyperlink/TaglibHyperlinkDetector.java b/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/hyperlink/TaglibHyperlinkDetector.java
index 3ee0710..2f780c0 100644
--- a/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/hyperlink/TaglibHyperlinkDetector.java
+++ b/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/hyperlink/TaglibHyperlinkDetector.java
@@ -15,11 +15,11 @@
 import org.eclipse.jface.text.hyperlink.IHyperlink;
 import org.eclipse.jface.text.hyperlink.IHyperlinkDetector;
 import org.eclipse.jface.text.hyperlink.URLHyperlink;
-import org.eclipse.jst.jsp.core.JSP11Namespace;
 import org.eclipse.jst.jsp.core.internal.contentmodel.ITaglibRecord;
 import org.eclipse.jst.jsp.core.internal.contentmodel.TLDRecord;
 import org.eclipse.jst.jsp.core.internal.contentmodel.TaglibIndex;
-import org.eclipse.jst.jsp.core.text.IJSPPartitionTypes;
+import org.eclipse.jst.jsp.core.internal.provisional.JSP11Namespace;
+import org.eclipse.jst.jsp.core.internal.provisional.text.IJSPPartitionTypes;
 import org.eclipse.jst.jsp.ui.internal.Logger;
 import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
 import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
diff --git a/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/java/search/JSPFindOccurrencesAction.java b/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/java/search/JSPFindOccurrencesAction.java
index 553d2cc..e082091 100644
--- a/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/java/search/JSPFindOccurrencesAction.java
+++ b/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/java/search/JSPFindOccurrencesAction.java
@@ -18,8 +18,8 @@
 import org.eclipse.jst.jsp.core.internal.java.IJSPTranslation;
 import org.eclipse.jst.jsp.core.internal.java.JSPTranslation;
 import org.eclipse.jst.jsp.core.internal.java.JSPTranslationAdapter;
+import org.eclipse.jst.jsp.core.internal.provisional.text.IJSPPartitionTypes;
 import org.eclipse.jst.jsp.core.internal.regions.DOMJSPRegionContexts;
-import org.eclipse.jst.jsp.core.text.IJSPPartitionTypes;
 import org.eclipse.search.ui.ISearchQuery;
 import org.eclipse.swt.graphics.Point;
 import org.eclipse.ui.texteditor.ITextEditor;
diff --git a/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/preferences/ui/JSPColorPage.java b/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/preferences/ui/JSPColorPage.java
index 10d3730..e199d3c 100644
--- a/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/preferences/ui/JSPColorPage.java
+++ b/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/preferences/ui/JSPColorPage.java
@@ -16,7 +16,7 @@
 import java.util.Iterator;
 
 import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jst.jsp.core.contenttype.ContentTypeIdForJSP;
+import org.eclipse.jst.jsp.core.internal.provisional.contenttype.ContentTypeIdForJSP;
 import org.eclipse.jst.jsp.core.internal.regions.DOMJSPRegionContexts;
 import org.eclipse.jst.jsp.ui.internal.JSPUIMessages;
 import org.eclipse.jst.jsp.ui.internal.JSPUIPlugin;
diff --git a/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/projection/ProjectionModelNodeAdapterFactoryJSP.java b/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/projection/ProjectionModelNodeAdapterFactoryJSP.java
index 334949d..0941a19 100644
--- a/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/projection/ProjectionModelNodeAdapterFactoryJSP.java
+++ b/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/projection/ProjectionModelNodeAdapterFactoryJSP.java
@@ -11,7 +11,7 @@
  *******************************************************************************/
 package org.eclipse.jst.jsp.ui.internal.projection;
 
-import org.eclipse.jst.jsp.core.JSP11Namespace;
+import org.eclipse.jst.jsp.core.internal.provisional.JSP11Namespace;
 import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
 import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
 import org.w3c.dom.Node;
diff --git a/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/provisional/StructuredTextViewerConfigurationJSP.java b/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/provisional/StructuredTextViewerConfigurationJSP.java
index c32dd79..9816754 100644
--- a/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/provisional/StructuredTextViewerConfigurationJSP.java
+++ b/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/provisional/StructuredTextViewerConfigurationJSP.java
@@ -34,8 +34,8 @@
 import org.eclipse.jface.text.reconciler.IReconciler;
 import org.eclipse.jface.text.reconciler.IReconcilingStrategy;
 import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.jst.jsp.core.internal.provisional.text.IJSPPartitionTypes;
 import org.eclipse.jst.jsp.core.internal.text.StructuredTextPartitionerForJSP;
-import org.eclipse.jst.jsp.core.text.IJSPPartitionTypes;
 import org.eclipse.jst.jsp.ui.internal.autoedit.StructuredAutoEditStrategyJSP;
 import org.eclipse.jst.jsp.ui.internal.contentassist.JSPContentAssistProcessor;
 import org.eclipse.jst.jsp.ui.internal.contentassist.JSPJavaContentAssistProcessor;
diff --git a/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/reconcile/ReconcileStepForJava.java b/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/reconcile/ReconcileStepForJava.java
index f7f1f5d..4161f40 100644
--- a/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/reconcile/ReconcileStepForJava.java
+++ b/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/reconcile/ReconcileStepForJava.java
@@ -24,7 +24,7 @@
 import org.eclipse.jface.text.reconciler.IReconcileStep;
 import org.eclipse.jst.jsp.core.internal.java.JSPTranslation;
 import org.eclipse.jst.jsp.core.internal.java.JSPTranslationExtension;
-import org.eclipse.jst.jsp.core.text.IJSPPartitionTypes;
+import org.eclipse.jst.jsp.core.internal.provisional.text.IJSPPartitionTypes;
 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;
diff --git a/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/wizard/NewJSPWizard.java b/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/wizard/NewJSPWizard.java
index f9edb4b..3787046 100644
--- a/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/wizard/NewJSPWizard.java
+++ b/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/wizard/NewJSPWizard.java
@@ -17,8 +17,8 @@
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.viewers.StructuredSelection;
 import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.jst.jsp.core.contenttype.ContentTypeIdForJSP;
 import org.eclipse.jst.jsp.core.internal.JSPCorePlugin;
+import org.eclipse.jst.jsp.core.internal.provisional.contenttype.ContentTypeIdForJSP;
 import org.eclipse.jst.jsp.ui.internal.JSPUIMessages;
 import org.eclipse.jst.jsp.ui.internal.JSPUIPlugin;
 import org.eclipse.jst.jsp.ui.internal.Logger;
diff --git a/bundles/org.eclipse.wst.css.core/cssprofile/cssprofile-wap.xml b/bundles/org.eclipse.wst.css.core/cssprofile/cssprofile-wap.xml
index d3b2a09..241bca3 100644
--- a/bundles/org.eclipse.wst.css.core/cssprofile/cssprofile-wap.xml
+++ b/bundles/org.eclipse.wst.css.core/cssprofile/cssprofile-wap.xml
@@ -1,614 +1,618 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <!--<!DOCTYPE css-profile SYSTEM "css-profile.dtd" >-->
 <css-profile>
-	<profile-import name="cssprofile-css2.xml"/>
-	<stylesheet-def>
-		<description>%wap.stylesheet-def.description</description>
-		<charset-rule/>
-		<import-rule/>
-		<media-rule/>
-		<style-rule/>
-	</stylesheet-def>
+        <profile-import name="cssprofile-css2.xml"/>
+        <stylesheet-def>
+                <description>%wap.stylesheet-def.description</description>
+                <charset-rule/>
+                <import-rule/>
+                <media-rule/>
+                <style-rule/>
+        </stylesheet-def>
 
-	<!-- Which properties can style rule include ? -->
-	<!-- using "overwrite" method: only disabled properties are written. -->
+        <!-- Which properties can style rule include ? -->
+        <!-- using "overwrite" method: only disabled properties are written. -->
 
-	<style-rule-def overwrite="true">
-		<property name="azimuth" enabled="false"/>
-		<property name="border-collapse" enabled="false"/>
-		<property name="border-spacing" enabled="false"/>
-		<property name="bottom" enabled="false"/>
-		<property name="caption-side" enabled="false"/>
-		<property name="clip" enabled="false"/>
-		<property name="content" enabled="false"/>
-		<property name="cue" enabled="false"/>
-		<property name="cue-after" enabled="false"/>
-		<property name="cue-before" enabled="false"/>
-		<property name="cursor" enabled="false"/>
-		<property name="direction" enabled="false"/>
-		<property name="elevation" enabled="false"/>
-		<property name="empty-cells" enabled="false"/>
-		<property name="font-size-adjust" enabled="false"/>
-		<property name="font-stretch" enabled="false"/>
-		<property name="left" enabled="false"/>
-		<property name="letter-spacing" enabled="false"/>
-		<property name="line-height" enabled="false"/>
-		<property name="marker-offset" enabled="false"/>
-		<property name="marks" enabled="false"/>
-		<property name="max-height" enabled="false"/>
-		<property name="max-width" enabled="false"/>
-		<property name="min-height" enabled="false"/>
-		<property name="min-width" enabled="false"/>
-		<property name="orphans" enabled="false"/>
-		<property name="outline" enabled="false"/>
-		<property name="outline-color" enabled="false"/>
-		<property name="outline-style" enabled="false"/>
-		<property name="outline-width" enabled="false"/>
-		<property name="overflow" enabled="false"/>
-		<property name="page" enabled="false"/>
-		<property name="page-break-after" enabled="false"/>
-		<property name="page-break-before" enabled="false"/>
-		<property name="page-break-inside" enabled="false"/>
-		<property name="pause" enabled="false"/>
-		<property name="pause-after" enabled="false"/>
-		<property name="pause-before" enabled="false"/>
-		<property name="pitch" enabled="false"/>
-		<property name="pitch-range" enabled="false"/>
-		<property name="play-during" enabled="false"/>
-		<property name="position" enabled="false"/>
-		<property name="quotes" enabled="false"/>
-		<property name="richness" enabled="false"/>
-		<property name="right" enabled="false"/>
-		<property name="size" enabled="false"/>
-		<property name="speak" enabled="false"/>
-		<property name="speak-header" enabled="false"/>
-		<property name="speak-numeral" enabled="false"/>
-		<property name="speak-punctuation" enabled="false"/>
-		<property name="speech-rate" enabled="false"/>
-		<property name="stress" enabled="false"/>
-		<property name="table-layout" enabled="false"/>
-		<property name="text-shadow" enabled="false"/>
-		<property name="top" enabled="false"/>
-		<property name="unicode-bidi" enabled="false"/>
-		<property name="voice-family" enabled="false"/>
-		<property name="volume" enabled="false"/>
-		<property name="widows" enabled="false"/>
-		<property name="word-spacing" enabled="false"/>
-		<property name="z-index" enabled="false"/>
-		<property name="-wap-marquee-style"/>
-		<property name="-wap-marquee-loop"/>
-		<property name="-wap-marquee-dir"/>
-		<property name="-wap-marquee-speed"/>
-		<property name="-wap-accesskey"/>
-		<property name="-wap-input-format"/>
-		<property name="-wap-input-required"/>
-	</style-rule-def>
+        <style-rule-def overwrite="true">
+                <property name="azimuth" enabled="false"/>
+                <property name="border-collapse" enabled="false"/>
+                <property name="border-spacing" enabled="false"/>
+                <property name="bottom" enabled="false"/>
+                <property name="caption-side" enabled="false"/>
+                <property name="clip" enabled="false"/>
+                <property name="content" enabled="false"/>
+                <property name="cue" enabled="false"/>
+                <property name="cue-after" enabled="false"/>
+                <property name="cue-before" enabled="false"/>
+                <property name="cursor" enabled="false"/>
+                <property name="direction" enabled="false"/>
+                <property name="elevation" enabled="false"/>
+                <property name="empty-cells" enabled="false"/>
+                <property name="font-size-adjust" enabled="false"/>
+                <property name="font-stretch" enabled="false"/>
+                <property name="left" enabled="false"/>
+                <property name="letter-spacing" enabled="false"/>
+                <property name="line-height" enabled="false"/>
+                <property name="marker-offset" enabled="false"/>
+                <property name="marks" enabled="false"/>
+                <property name="max-height" enabled="false"/>
+                <property name="max-width" enabled="false"/>
+                <property name="min-height" enabled="false"/>
+                <property name="min-width" enabled="false"/>
+                <property name="orphans" enabled="false"/>
+                <property name="outline" enabled="false"/>
+                <property name="outline-color" enabled="false"/>
+                <property name="outline-style" enabled="false"/>
+                <property name="outline-width" enabled="false"/>
+                <property name="overflow" enabled="false"/>
+                <property name="page" enabled="false"/>
+                <property name="page-break-after" enabled="false"/>
+                <property name="page-break-before" enabled="false"/>
+                <property name="page-break-inside" enabled="false"/>
+                <property name="pause" enabled="false"/>
+                <property name="pause-after" enabled="false"/>
+                <property name="pause-before" enabled="false"/>
+                <property name="pitch" enabled="false"/>
+                <property name="pitch-range" enabled="false"/>
+                <property name="play-during" enabled="false"/>
+                <property name="position" enabled="false"/>
+                <property name="quotes" enabled="false"/>
+                <property name="richness" enabled="false"/>
+                <property name="right" enabled="false"/>
+                <property name="size" enabled="false"/>
+                <property name="speak" enabled="false"/>
+                <property name="speak-header" enabled="false"/>
+                <property name="speak-numeral" enabled="false"/>
+                <property name="speak-punctuation" enabled="false"/>
+                <property name="speech-rate" enabled="false"/>
+                <property name="stress" enabled="false"/>
+                <property name="table-layout" enabled="false"/>
+                <property name="text-shadow" enabled="false"/>
+                <property name="top" enabled="false"/>
+                <property name="unicode-bidi" enabled="false"/>
+                <property name="voice-family" enabled="false"/>
+                <property name="volume" enabled="false"/>
+                <property name="widows" enabled="false"/>
+                <property name="word-spacing" enabled="false"/>
+                <property name="z-index" enabled="false"/>
+                <property name="-wap-marquee-style"/>
+                <property name="-wap-marquee-loop"/>
+                <property name="-wap-marquee-dir"/>
+                <property name="-wap-marquee-speed"/>
+                <property name="-wap-accesskey"/>
+                <property name="-wap-input-format"/>
+                <property name="-wap-input-required"/>
+        </style-rule-def>
 
-	<!-- property definition -->
-	<!-- using "redifine" method: if "overwrite" attribute is set to
-	"false"	or not set, it means the node is cleanly redifined -->
+        <!-- property definition -->
+        <!-- using "redifine" method: if "overwrite" attribute is set to
+        "false" or not set, it means the node is cleanly redifined -->
 
-	<property-def name="display"
-		inherited="no" mediagroup="all" category="visual">
-		<keyword name="inline"/>
-		<keyword name="block"/>
-		<keyword name="list-item"/>
-		<keyword name="-wap-marquee"/>
-		<keyword name="none"/>
-	</property-def>
-	<property-def name="list-style-type"
-		inherited="yes" mediagroup="visual" category="content">
-		<keyword name="disc"/>
-		<keyword name="circle"/>
-		<keyword name="square"/>
-		<keyword name="decimal"/>
-		<keyword name="lower-roman"/>
-		<keyword name="upper-roman"/>
-		<keyword name="lower-alpha"/>
-		<keyword name="upper-alpha"/>
-		<keyword name="none"/>
-		<keyword name="inherit"/>
-	</property-def>
-	<property-def name="text-align"
-		inherited="yes" mediagroup="visual" category="text">
-		<keyword name="left"/>
-		<keyword name="right"/>
-		<keyword name="center"/>
-		<keyword name="justify"/>
-		<keyword name="inherit"/>
-	</property-def>
-	<property-def name="text-decoration"
-		inherited="no" mediagroup="visual" category="text">
-		<keyword name="none"/>
-		<keyword name="underline"/>
-		<keyword name="blink"/>
-		<keyword name="inherit"/>
-	</property-def>
-	<property-def name="vertical-align"
-		inherited="no" mediagroup="visual" category="visual">
-		<keyword name="baseline"/>
-		<keyword name="sub"/>
-		<keyword name="super"/>
-		<keyword name="top"/>
-		<keyword name="middle"/>
-		<keyword name="bottom"/>
-		<keyword name="inherit"/>
-	</property-def>
+        <property-def name="display"
+                inherited="no" mediagroup="all" category="visual">
+                <keyword name="inline"/>
+                <keyword name="block"/>
+                <keyword name="list-item"/>
+                <keyword name="-wap-marquee"/>
+                <keyword name="none"/>
+        </property-def>
+        <property-def name="list-style-type"
+                inherited="yes" mediagroup="visual" category="content">
+                <keyword name="disc"/>
+                <keyword name="circle"/>
+                <keyword name="square"/>
+                <keyword name="decimal"/>
+                <keyword name="lower-roman"/>
+                <keyword name="upper-roman"/>
+                <keyword name="lower-alpha"/>
+                <keyword name="upper-alpha"/>
+                <keyword name="none"/>
+                <keyword name="inherit"/>
+        </property-def>
+        <property-def name="text-align"
+                inherited="yes" mediagroup="visual" category="text">
+                <keyword name="left"/>
+                <keyword name="right"/>
+                <keyword name="center"/>
+                <keyword name="justify"/>
+                <keyword name="inherit"/>
+        </property-def>
+        <property-def name="text-decoration"
+                inherited="no" mediagroup="visual" category="text">
+                <keyword name="none"/>
+                <keyword name="underline"/>
+                <keyword name="blink"/>
+                <keyword name="inherit"/>
+        </property-def>
+        <property-def name="vertical-align"
+                inherited="no" mediagroup="visual" category="visual">
+                <keyword name="baseline"/>
+                <keyword name="sub"/>
+                <keyword name="super"/>
+                <keyword name="top"/>
+                <keyword name="middle"/>
+                <keyword name="bottom"/>
+                <keyword name="inherit"/>
+        </property-def>
     <property-def name="-wap-marquee-style"
-		inherited="no" mediagroup="visual" category="wap">
-		<keyword name="scroll"/>
-		<keyword name="slide"/>
-		<keyword name="alternate"/>
-		<keyword name="inherit"/>
-	</property-def>
+                inherited="no" mediagroup="visual" category="wap">
+                <keyword name="scroll"/>
+                <keyword name="slide"/>
+                <keyword name="alternate"/>
+                <keyword name="inherit"/>
+        </property-def>
     <property-def name="-wap-marquee-loop"
-		inherited="no" mediagroup="visual" category="wap">
-		<number name="integer"/>
-		<keyword name="infinite"/>
-		<keyword name="inherit"/>
-	</property-def>
+                inherited="no" mediagroup="visual" category="wap">
+                <number name="integer"/>
+                <keyword name="infinite"/>
+                <keyword name="inherit"/>
+        </property-def>
     <property-def name="-wap-marquee-dir"
-		inherited="no" mediagroup="visual" category="wap">
-		<keyword name="ltr"/>
-		<keyword name="rtl"/>
-		<keyword name="inherit"/>
-	</property-def>
+                inherited="no" mediagroup="visual" category="wap">
+                <keyword name="ltr"/>
+                <keyword name="rtl"/>
+                <keyword name="inherit"/>
+        </property-def>
     <property-def name="-wap-marquee-speed"
-		inherited="no" mediagroup="visual" category="wap">
-		<keyword name="slow"/>
-		<keyword name="normal"/>
-		<keyword name="fast"/>
-		<keyword name="inherit"/>
-	</property-def>
+                inherited="no" mediagroup="visual" category="wap">
+                <keyword name="slow"/>
+                <keyword name="normal"/>
+                <keyword name="fast"/>
+                <keyword name="inherit"/>
+        </property-def>
     <property-def name="-wap-accesskey"
-		inherited="no" mediagroup="interactive" category="wap">
-		<container name="keycombination"/>
-		<keyword name="inherit"/>
-	</property-def>
+                inherited="no" mediagroup="interactive" category="wap">
+                <container name="keycombination"/>
+                <keyword name="inherit"/>
+        </property-def>
     <property-def name="-wap-input-format"
-		inherited="no" mediagroup="interactive" category="wap">
-		<container name="format"/>
-		<keyword name="inherit"/>
-	</property-def>
+                inherited="no" mediagroup="interactive" category="wap">
+                <container name="format"/>
+                <keyword name="inherit"/>
+        </property-def>
     <property-def name="-wap-input-required"
-		inherited="no" mediagroup="interactive" category="wap">
-		<keyword name="true"/>
-		<keyword name="false"/>
-		<keyword name="inherit"/>
-	</property-def>
+                inherited="no" mediagroup="interactive" category="wap">
+                <keyword name="true"/>
+                <keyword name="false"/>
+                <keyword name="inherit"/>
+        </property-def>
 
-	<!-- container definition : Container is the lump of values.
-	It can be used like macros. -->
-	<container-def name="color" overwrite="true">
-		<container name="system-color" enabled="false"/>
-	</container-def>
-	<container-def name="format">
-		<string name="any"/>
-	</container-def>
-	<container-def name="keycombination">
-		<container name="key"/>
-		<keyword name="-"/>
-	</container-def>
-	<container-def name="key">
-		<keyword name="space"/>
-		<container name="specialkey"/>
-	</container-def>
-	<container-def name="specialkey">
-		<container name="modifierkey"/>
-		<container name="functionkey"/>
-		<container name="navigationkey"/>
-		<container name="editkey"/>
-		<container name="misckey"/>
-		<container name="volumecontrolkey"/>
-		<container name="applicationkey"/>
-		<container name="phonekey"/>
-		<container name="vendorkey"/>
-	</container-def>
-	<container-def name="modifierkey">
-		<keyword name="accesskey"/>
-		<container name="cmdkey"/>
-		<container name="optkey"/>
-		<container name="ctrlkey"/>
-		<container name="shiftkey"/>
-		<container name="altkey"/>
-		<container name="winkey"/>
-		<container name="metakey"/>
-		<keyword name="fn"/>
-		<keyword name="fcn"/>
-		<keyword name="caps"/>
-	</container-def>
-	<container-def name="cmdkey">
-		<keyword name="cmd"/>
-		<keyword name="rcmd"/>
-		<keyword name="lcmd"/>
-	</container-def>
-	<container-def name="optkey">
-		<keyword name="opt"/>
-		<keyword name="ropt"/>
-		<keyword name="lopt"/>
-	</container-def>
-	<container-def name="ctrlkey">
-		<keyword name="ctrl"/>
-		<keyword name="rctrl"/>
-		<keyword name="lctrl"/>
-	</container-def>
-	<container-def name="shiftkey">
-		<keyword name="shift"/>
-		<keyword name="rshift"/>
-		<keyword name="lshift"/>
-	</container-def>
-	<container-def name="altkey">
-		<keyword name="alt"/>
-		<keyword name="ralt"/>
-		<keyword name="lalt"/>
-	</container-def>
-	<container-def name="winkey">
-		<keyword name="win"/>
-		<keyword name="rwin"/>
-		<keyword name="lwin"/>
-	</container-def>
-	<container-def name="metakey">
-		<keyword name="meta"/>
-		<keyword name="rmeta"/>
-		<keyword name="lmeta"/>
-	</container-def>
-	<container-def name="functionkey">
-		<keyword name="f1"/>
-		<keyword name="f2"/>
-		<keyword name="f3"/>
-		<keyword name="f4"/>
-		<keyword name="f5"/>
-		<keyword name="f6"/>
-		<keyword name="f7"/>
-		<keyword name="f8"/>
-		<keyword name="f9"/>
-		<keyword name="f10"/>
-		<keyword name="f11"/>
-		<keyword name="f12"/>
-		<keyword name="f13"/>
-		<keyword name="f14"/>
-		<keyword name="f15"/>
-	</container-def>
-	<container-def name="navigationkey">
-		<keyword name="tab"/>
-		<keyword name="esc"/>
-		<keyword name="enter"/>
-		<keyword name="return"/>
-		<keyword name="menu"/>
-		<keyword name="help"/>
-		<keyword name="namemenu"/>
-		<keyword name="rcl"/>
-		<keyword name="snd"/>
-		<keyword name="arrowkey"/>
-		<keyword name="pagekey"/>
-	</container-def>
-	<container-def name="arrowkey">
-		<keyword name="up"/>
-		<keyword name="down"/>
-		<keyword name="left"/>
-		<keyword name="right"/>
-	</container-def>
-	<container-def name="pagekey">
-		<keyword name="home"/>
-		<keyword name="end"/>
-		<keyword name="pgup"/>
-		<keyword name="pgdn"/>
-	</container-def>
-	<container-def name="editkey">
-		<keyword name="bs"/>
-		<keyword name="del"/>
-		<keyword name="ins"/>
-		<keyword name="undo"/>
-		<keyword name="cut"/>
-		<keyword name="copy"/>
-		<keyword name="paste"/>
-		<keyword name="clr"/>
-		<keyword name="sto"/>
-	</container-def>
-	<container-def name="misckey">
-		<keyword name="prtsc"/>
-		<keyword name="sysrq"/>
-		<keyword name="scrlock"/>
-		<keyword name="pause"/>
-		<keyword name="brk"/>
-		<keyword name="numlock"/>
-		<keyword name="pwr"/>
-	</container-def>
-	<container-def name="volumecontrolkey">
-		<keyword name="volumeup"/>
-		<keyword name="volumedown"/>
-	</container-def>
-	<container-def name="applicationkey">
-		<keyword name="memo"/>
-		<keyword name="todo"/>
-		<keyword name="calendar"/>
-		<keyword name="mail"/>
-		<keyword name="address"/>
-	</container-def>
-	<container-def name="phonekey">
-		<keyword name="phone-send"/>
-		<keyword name="phone-end"/>
-		<keyword name="phone-accept"/>
-	</container-def>
-	<container-def name="vendorkey">
-		<keyword name="vnd."/>
-	</container-def>
+        <!-- container definition : Container is the lump of values.
+        It can be used like macros. -->
+        <container-def name="color" overwrite="true">
+                <container name="system-color" enabled="false"/>
+        </container-def>
+        <container-def name="format">
+                <string name="any"/>
+        </container-def>
+        <container-def name="keycombination">
+                <container name="key"/>
+                <keyword name="-"/>
+        </container-def>
+        <container-def name="key">
+                <keyword name="space"/>
+                <container name="specialkey"/>
+        </container-def>
+        <container-def name="specialkey">
+                <container name="modifierkey"/>
+                <container name="functionkey"/>
+                <container name="navigationkey"/>
+                <container name="editkey"/>
+                <container name="misckey"/>
+                <container name="volumecontrolkey"/>
+                <container name="applicationkey"/>
+                <container name="phonekey"/>
+                <container name="vendorkey"/>
+        </container-def>
+        <container-def name="modifierkey">
+                <keyword name="accesskey"/>
+                <container name="cmdkey"/>
+                <container name="optkey"/>
+                <container name="ctrlkey"/>
+                <container name="shiftkey"/>
+                <container name="altkey"/>
+                <container name="winkey"/>
+                <container name="metakey"/>
+                <keyword name="fn"/>
+                <keyword name="fcn"/>
+                <keyword name="caps"/>
+        </container-def>
+        <container-def name="cmdkey">
+                <keyword name="cmd"/>
+                <keyword name="rcmd"/>
+                <keyword name="lcmd"/>
+        </container-def>
+        <container-def name="optkey">
+                <keyword name="opt"/>
+                <keyword name="ropt"/>
+                <keyword name="lopt"/>
+        </container-def>
+        <container-def name="ctrlkey">
+                <keyword name="ctrl"/>
+                <keyword name="rctrl"/>
+                <keyword name="lctrl"/>
+        </container-def>
+        <container-def name="shiftkey">
+                <keyword name="shift"/>
+                <keyword name="rshift"/>
+                <keyword name="lshift"/>
+        </container-def>
+        <container-def name="altkey">
+                <keyword name="alt"/>
+                <keyword name="ralt"/>
+                <keyword name="lalt"/>
+        </container-def>
+        <container-def name="winkey">
+                <keyword name="win"/>
+                <keyword name="rwin"/>
+                <keyword name="lwin"/>
+        </container-def>
+        <container-def name="metakey">
+                <keyword name="meta"/>
+                <keyword name="rmeta"/>
+                <keyword name="lmeta"/>
+        </container-def>
+        <container-def name="functionkey">
+                <keyword name="f1"/>
+                <keyword name="f2"/>
+                <keyword name="f3"/>
+                <keyword name="f4"/>
+                <keyword name="f5"/>
+                <keyword name="f6"/>
+                <keyword name="f7"/>
+                <keyword name="f8"/>
+                <keyword name="f9"/>
+                <keyword name="f10"/>
+                <keyword name="f11"/>
+                <keyword name="f12"/>
+                <keyword name="f13"/>
+                <keyword name="f14"/>
+                <keyword name="f15"/>
+        </container-def>
+        <container-def name="navigationkey">
+                <keyword name="tab"/>
+                <keyword name="esc"/>
+                <keyword name="enter"/>
+                <keyword name="return"/>
+                <keyword name="menu"/>
+                <keyword name="help"/>
+                <keyword name="namemenu"/>
+                <keyword name="rcl"/>
+                <keyword name="snd"/>
+                <keyword name="arrowkey"/>
+                <keyword name="pagekey"/>
+        </container-def>
+        <container-def name="arrowkey">
+                <keyword name="up"/>
+                <keyword name="down"/>
+                <keyword name="left"/>
+                <keyword name="right"/>
+        </container-def>
+        <container-def name="pagekey">
+                <keyword name="home"/>
+                <keyword name="end"/>
+                <keyword name="pgup"/>
+                <keyword name="pgdn"/>
+        </container-def>
+        <container-def name="editkey">
+                <keyword name="bs"/>
+                <keyword name="del"/>
+                <keyword name="ins"/>
+                <keyword name="undo"/>
+                <keyword name="cut"/>
+                <keyword name="copy"/>
+                <keyword name="paste"/>
+                <keyword name="clr"/>
+                <keyword name="sto"/>
+        </container-def>
+        <container-def name="misckey">
+                <keyword name="prtsc"/>
+                <keyword name="sysrq"/>
+                <keyword name="scrlock"/>
+                <keyword name="pause"/>
+                <keyword name="brk"/>
+                <keyword name="numlock"/>
+                <keyword name="pwr"/>
+        </container-def>
+        <container-def name="volumecontrolkey">
+                <keyword name="volumeup"/>
+                <keyword name="volumedown"/>
+        </container-def>
+        <container-def name="applicationkey">
+                <keyword name="memo"/>
+                <keyword name="todo"/>
+                <keyword name="calendar"/>
+                <keyword name="mail"/>
+                <keyword name="address"/>
+        </container-def>
+        <container-def name="phonekey">
+                <keyword name="phone-send"/>
+                <keyword name="phone-end"/>
+                <keyword name="phone-accept"/>
+        </container-def>
+        <container-def name="vendorkey">
+                <keyword name="vnd."/>
+        </container-def>
 
-	<category-def name="wap">
-		<caption>%wap.category-def.wap.caption</caption>
-	</category-def>
+        <category-def name="wap">
+                <caption>%wap.category-def.wap.caption</caption>
+        </category-def>
 
-	<number-def name="length">
+        <number-def name="length">
         <unit name="em"/>
         <unit name="ex"/>
         <unit name="px"/>
-	</number-def>
+        </number-def>
 
     <keyword-def name="-wap-marquee">
         <keyword-value>-wap-marquee</keyword-value>
     </keyword-def>
-	<keyword-def name="slide">
-		<keyword-value>slide</keyword-value>
-	</keyword-def>
-	<keyword-def name="alternate">
-		<keyword-value>alternate</keyword-value>
-	</keyword-def>
-	<keyword-def name="infinite">
-		<keyword-value>infinite</keyword-value>
-	</keyword-def>
-	<keyword-def name="-">
-		<keyword-value>-</keyword-value>
-	</keyword-def>
-	<keyword-def name="space">
-		<keyword-value>space</keyword-value>
-	</keyword-def>
-	<keyword-def name="accesskey">
-		<keyword-value>accesskey</keyword-value>
-	</keyword-def>
-	<keyword-def name="fn">
-		<keyword-value>fn</keyword-value>
-	</keyword-def>
-	<keyword-def name="fcn">
-		<keyword-value>fcn</keyword-value>
-	</keyword-def>
-	<keyword-def name="caps">
-		<keyword-value>caps</keyword-value>
-	</keyword-def>
-	<keyword-def name="cmd">
-		<keyword-value>cmd</keyword-value>
-	</keyword-def>
-	<keyword-def name="rcmd">
-		<keyword-value>rcmd</keyword-value>
-	</keyword-def>
-	<keyword-def name="lcmd">
-		<keyword-value>lcmd</keyword-value>
-	</keyword-def>
-	<keyword-def name="opt">
-		<keyword-value>opt</keyword-value>
-	</keyword-def>
-	<keyword-def name="ropt">
-		<keyword-value>ropt</keyword-value>
-	</keyword-def>
-	<keyword-def name="lopt">
-		<keyword-value>lopt</keyword-value>
-	</keyword-def>
-	<keyword-def name="ctrl">
-		<keyword-value>ctrl</keyword-value>
-	</keyword-def>
-	<keyword-def name="rctrl">
-		<keyword-value>rctrl</keyword-value>
-	</keyword-def>
-	<keyword-def name="lctrl">
-		<keyword-value>lctrl</keyword-value>
-	</keyword-def>
-	<keyword-def name="shift">
-		<keyword-value>shift</keyword-value>
-	</keyword-def>
-	<keyword-def name="rshift">
-		<keyword-value>rshift</keyword-value>
-	</keyword-def>
-	<keyword-def name="lshift">
-		<keyword-value>lshift</keyword-value>
-	</keyword-def>
-	<keyword-def name="alt">
-		<keyword-value>alt</keyword-value>
-	</keyword-def>
-	<keyword-def name="ralt">
-		<keyword-value>ralt</keyword-value>
-	</keyword-def>
-	<keyword-def name="lalt">
-		<keyword-value>lalt</keyword-value>
-	</keyword-def>
-	<keyword-def name="win">
-		<keyword-value>win</keyword-value>
-	</keyword-def>
-	<keyword-def name="rwin">
-		<keyword-value>rwin</keyword-value>
-	</keyword-def>
-	<keyword-def name="lwin">
-		<keyword-value>lwin</keyword-value>
-	</keyword-def>
-	<keyword-def name="meta">
-		<keyword-value>meta</keyword-value>
-	</keyword-def>
-	<keyword-def name="rmeta">
-		<keyword-value>rmeta</keyword-value>
-	</keyword-def>
-	<keyword-def name="lmeta">
-		<keyword-value>lmeta</keyword-value>
-	</keyword-def>
-	<keyword-def name="f1">
-		<keyword-value>f1</keyword-value>
-	</keyword-def>
-	<keyword-def name="f2">
-		<keyword-value>f2</keyword-value>
-	</keyword-def>
-	<keyword-def name="f3">
-		<keyword-value>f3</keyword-value>
-	</keyword-def>
-	<keyword-def name="f4">
-		<keyword-value>f4</keyword-value>
-	</keyword-def>
-	<keyword-def name="f5">
-		<keyword-value>f5</keyword-value>
-	</keyword-def>
-	<keyword-def name="f6">
-		<keyword-value>f6</keyword-value>
-	</keyword-def>
-	<keyword-def name="f7">
-		<keyword-value>f7</keyword-value>
-	</keyword-def>
-	<keyword-def name="f8">
-		<keyword-value>f8</keyword-value>
-	</keyword-def>
-	<keyword-def name="f9">
-		<keyword-value>f9</keyword-value>
-	</keyword-def>
-	<keyword-def name="f10">
-		<keyword-value>f10</keyword-value>
-	</keyword-def>
-	<keyword-def name="f11">
-		<keyword-value>f11</keyword-value>
-	</keyword-def>
-	<keyword-def name="f12">
-		<keyword-value>f12</keyword-value>
-	</keyword-def>
-	<keyword-def name="f13">
-		<keyword-value>f13</keyword-value>
-	</keyword-def>
-	<keyword-def name="f14">
-		<keyword-value>f14</keyword-value>
-	</keyword-def>
-	<keyword-def name="f15">
-		<keyword-value>f15</keyword-value>
-	</keyword-def>
-	<keyword-def name="tab">
-		<keyword-value>tab</keyword-value>
-	</keyword-def>
-	<keyword-def name="esc">
-		<keyword-value>esc</keyword-value>
-	</keyword-def>
-	<keyword-def name="enter">
-		<keyword-value>enter</keyword-value>
-	</keyword-def>
-	<keyword-def name="return">
-		<keyword-value>return</keyword-value>
-	</keyword-def>
-	<keyword-def name="namemenu">
-		<keyword-value>namemenu</keyword-value>
-	</keyword-def>
-	<keyword-def name="rcl">
-		<keyword-value>rcl</keyword-value>
-	</keyword-def>
-	<keyword-def name="snd">
-		<keyword-value>snd</keyword-value>
-	</keyword-def>
-	<keyword-def name="arrowkey">
-		<keyword-value>arrowkey</keyword-value>
-	</keyword-def>
-	<keyword-def name="pagekey">
-		<keyword-value>pagekey</keyword-value>
-	</keyword-def>
-	<keyword-def name="up">
-		<keyword-value>up</keyword-value>
-	</keyword-def>
-	<keyword-def name="down">
-		<keyword-value>down</keyword-value>
-	</keyword-def>
-	<keyword-def name="home">
-		<keyword-value>home</keyword-value>
-	</keyword-def>
-	<keyword-def name="end">
-		<keyword-value>end</keyword-value>
-	</keyword-def>
-	<keyword-def name="pgup">
-		<keyword-value>pgup</keyword-value>
-	</keyword-def>
-	<keyword-def name="pgdn">
-		<keyword-value>pgdn</keyword-value>
-	</keyword-def>
-	<keyword-def name="bs">
-		<keyword-value>bs</keyword-value>
-	</keyword-def>
-	<keyword-def name="del">
-		<keyword-value>del</keyword-value>
-	</keyword-def>
-	<keyword-def name="ins">
-		<keyword-value>ins</keyword-value>
-	</keyword-def>
-	<keyword-def name="undo">
-		<keyword-value>undo</keyword-value>
-	</keyword-def>
-	<keyword-def name="cut">
-		<keyword-value>cut</keyword-value>
-	</keyword-def>
-	<keyword-def name="copy">
-		<keyword-value>copy</keyword-value>
-	</keyword-def>
-	<keyword-def name="paste">
-		<keyword-value>paste</keyword-value>
-	</keyword-def>
-	<keyword-def name="clr">
-		<keyword-value>clr</keyword-value>
-	</keyword-def>
-	<keyword-def name="sto">
-		<keyword-value>sto</keyword-value>
-	</keyword-def>
-	<keyword-def name="prtsc">
-		<keyword-value>prtsc</keyword-value>
-	</keyword-def>
-	<keyword-def name="sysrq">
-		<keyword-value>sysrq</keyword-value>
-	</keyword-def>
-	<keyword-def name="scrlock">
-		<keyword-value>scrlock</keyword-value>
-	</keyword-def>
-	<keyword-def name="brk">
-		<keyword-value>brk</keyword-value>
-	</keyword-def>
-	<keyword-def name="numlock">
-		<keyword-value>numlock</keyword-value>
-	</keyword-def>
-	<keyword-def name="pwr">
-		<keyword-value>pwr</keyword-value>
-	</keyword-def>
-	<keyword-def name="volumeup">
-		<keyword-value>volumeup</keyword-value>
-	</keyword-def>
-	<keyword-def name="volumedown">
-		<keyword-value>volumedown</keyword-value>
-	</keyword-def>
-	<keyword-def name="memo">
-		<keyword-value>memo</keyword-value>
-	</keyword-def>
-	<keyword-def name="todo">
-		<keyword-value>todo</keyword-value>
-	</keyword-def>
-	<keyword-def name="calendar">
-		<keyword-value>calendar</keyword-value>
-	</keyword-def>
-	<keyword-def name="mail">
-		<keyword-value>mail</keyword-value>
-	</keyword-def>
-	<keyword-def name="address">
-		<keyword-value>address</keyword-value>
-	</keyword-def>
-	<keyword-def name="phone-send">
-		<keyword-value>phone-send</keyword-value>
-	</keyword-def>
-	<keyword-def name="phone-end">
-		<keyword-value>phone-end</keyword-value>
-	</keyword-def>
-	<keyword-def name="phone-accept">
-		<keyword-value>phone-accept</keyword-value>
-	</keyword-def>
-	<keyword-def name="vnd.">
-		<keyword-value>vnd.</keyword-value>
-	</keyword-def>
-	<keyword-def name="true">
-		<keyword-value>true</keyword-value>
-	</keyword-def>
-	<keyword-def name="false">
-		<keyword-value>false</keyword-value>
-	</keyword-def>
+        <keyword-def name="slide">
+                <keyword-value>slide</keyword-value>
+        </keyword-def>
+        <keyword-def name="alternate">
+                <keyword-value>alternate</keyword-value>
+        </keyword-def>
+        <keyword-def name="infinite">
+                <keyword-value>infinite</keyword-value>
+        </keyword-def>
+        <keyword-def name="-">
+                <keyword-value>-</keyword-value>
+        </keyword-def>
+        <keyword-def name="space">
+                <keyword-value>space</keyword-value>
+        </keyword-def>
+        <keyword-def name="accesskey">
+                <keyword-value>accesskey</keyword-value>
+        </keyword-def>
+        <keyword-def name="fn">
+                <keyword-value>fn</keyword-value>
+        </keyword-def>
+        <keyword-def name="fcn">
+                <keyword-value>fcn</keyword-value>
+        </keyword-def>
+        <keyword-def name="caps">
+                <keyword-value>caps</keyword-value>
+        </keyword-def>
+        <keyword-def name="cmd">
+                <keyword-value>cmd</keyword-value>
+        </keyword-def>
+        <keyword-def name="rcmd">
+                <keyword-value>rcmd</keyword-value>
+        </keyword-def>
+        <keyword-def name="lcmd">
+                <keyword-value>lcmd</keyword-value>
+        </keyword-def>
+        <keyword-def name="opt">
+                <keyword-value>opt</keyword-value>
+        </keyword-def>
+        <keyword-def name="ropt">
+                <keyword-value>ropt</keyword-value>
+        </keyword-def>
+        <keyword-def name="lopt">
+                <keyword-value>lopt</keyword-value>
+        </keyword-def>
+        <keyword-def name="ctrl">
+                <keyword-value>ctrl</keyword-value>
+        </keyword-def>
+        <keyword-def name="rctrl">
+                <keyword-value>rctrl</keyword-value>
+        </keyword-def>
+        <keyword-def name="lctrl">
+                <keyword-value>lctrl</keyword-value>
+        </keyword-def>
+        <keyword-def name="shift">
+                <keyword-value>shift</keyword-value>
+        </keyword-def>
+        <keyword-def name="rshift">
+                <keyword-value>rshift</keyword-value>
+        </keyword-def>
+        <keyword-def name="lshift">
+                <keyword-value>lshift</keyword-value>
+        </keyword-def>
+        <keyword-def name="alt">
+                <keyword-value>alt</keyword-value>
+        </keyword-def>
+        <keyword-def name="ralt">
+                <keyword-value>ralt</keyword-value>
+        </keyword-def>
+        <keyword-def name="lalt">
+                <keyword-value>lalt</keyword-value>
+        </keyword-def>
+        <keyword-def name="win">
+                <keyword-value>win</keyword-value>
+        </keyword-def>
+        <keyword-def name="rwin">
+                <keyword-value>rwin</keyword-value>
+        </keyword-def>
+        <keyword-def name="lwin">
+                <keyword-value>lwin</keyword-value>
+        </keyword-def>
+        <keyword-def name="meta">
+                <keyword-value>meta</keyword-value>
+        </keyword-def>
+        <keyword-def name="rmeta">
+                <keyword-value>rmeta</keyword-value>
+        </keyword-def>
+        <keyword-def name="lmeta">
+                <keyword-value>lmeta</keyword-value>
+        </keyword-def>
+        <keyword-def name="f1">
+                <keyword-value>f1</keyword-value>
+        </keyword-def>
+        <keyword-def name="f2">
+                <keyword-value>f2</keyword-value>
+        </keyword-def>
+        <keyword-def name="f3">
+                <keyword-value>f3</keyword-value>
+        </keyword-def>
+        <keyword-def name="f4">
+                <keyword-value>f4</keyword-value>
+        </keyword-def>
+        <keyword-def name="f5">
+                <keyword-value>f5</keyword-value>
+        </keyword-def>
+        <keyword-def name="f6">
+                <keyword-value>f6</keyword-value>
+        </keyword-def>
+        <keyword-def name="f7">
+                <keyword-value>f7</keyword-value>
+        </keyword-def>
+        <keyword-def name="f8">
+                <keyword-value>f8</keyword-value>
+        </keyword-def>
+        <keyword-def name="f9">
+                <keyword-value>f9</keyword-value>
+        </keyword-def>
+        <keyword-def name="f10">
+                <keyword-value>f10</keyword-value>
+        </keyword-def>
+        <keyword-def name="f11">
+                <keyword-value>f11</keyword-value>
+        </keyword-def>
+        <keyword-def name="f12">
+                <keyword-value>f12</keyword-value>
+        </keyword-def>
+        <keyword-def name="f13">
+                <keyword-value>f13</keyword-value>
+        </keyword-def>
+        <keyword-def name="f14">
+                <keyword-value>f14</keyword-value>
+        </keyword-def>
+        <keyword-def name="f15">
+                <keyword-value>f15</keyword-value>
+        </keyword-def>
+        <keyword-def name="tab">
+                <keyword-value>tab</keyword-value>
+        </keyword-def>
+        <keyword-def name="esc">
+                <keyword-value>esc</keyword-value>
+        </keyword-def>
+        <keyword-def name="enter">
+                <keyword-value>enter</keyword-value>
+        </keyword-def>
+        <keyword-def name="return">
+                <keyword-value>return</keyword-value>
+        </keyword-def>
+        <keyword-def name="namemenu">
+                <keyword-value>namemenu</keyword-value>
+        </keyword-def>
+        <keyword-def name="rcl">
+                <keyword-value>rcl</keyword-value>
+        </keyword-def>
+        <keyword-def name="snd">
+                <keyword-value>snd</keyword-value>
+        </keyword-def>
+        <keyword-def name="arrowkey">
+                <keyword-value>arrowkey</keyword-value>
+        </keyword-def>
+        <keyword-def name="pagekey">
+                <keyword-value>pagekey</keyword-value>
+        </keyword-def>
+        <keyword-def name="up">
+                <keyword-value>up</keyword-value>
+        </keyword-def>
+        <keyword-def name="down">
+                <keyword-value>down</keyword-value>
+        </keyword-def>
+        <keyword-def name="home">
+                <keyword-value>home</keyword-value>
+        </keyword-def>
+        <keyword-def name="end">
+                <keyword-value>end</keyword-value>
+        </keyword-def>
+        <keyword-def name="pgup">
+                <keyword-value>pgup</keyword-value>
+        </keyword-def>
+        <keyword-def name="pgdn">
+                <keyword-value>pgdn</keyword-value>
+        </keyword-def>
+        <keyword-def name="bs">
+                <keyword-value>bs</keyword-value>
+        </keyword-def>
+        <keyword-def name="del">
+                <keyword-value>del</keyword-value>
+        </keyword-def>
+        <keyword-def name="ins">
+                <keyword-value>ins</keyword-value>
+        </keyword-def>
+        <keyword-def name="undo">
+                <keyword-value>undo</keyword-value>
+        </keyword-def>
+        <keyword-def name="cut">
+                <keyword-value>cut</keyword-value>
+        </keyword-def>
+        <keyword-def name="copy">
+                <keyword-value>copy</keyword-value>
+        </keyword-def>
+        <keyword-def name="paste">
+                <keyword-value>paste</keyword-value>
+        </keyword-def>
+        <keyword-def name="clr">
+                <keyword-value>clr</keyword-value>
+        </keyword-def>
+        <keyword-def name="sto">
+                <keyword-value>sto</keyword-value>
+        </keyword-def>
+        <keyword-def name="prtsc">
+                <keyword-value>prtsc</keyword-value>
+        </keyword-def>
+        <keyword-def name="sysrq">
+                <keyword-value>sysrq</keyword-value>
+        </keyword-def>
+        <keyword-def name="scrlock">
+                <keyword-value>scrlock</keyword-value>
+        </keyword-def>
+        <keyword-def name="brk">
+                <keyword-value>brk</keyword-value>
+        </keyword-def>
+        <keyword-def name="numlock">
+                <keyword-value>numlock</keyword-value>
+        </keyword-def>
+        <keyword-def name="pwr">
+                <keyword-value>pwr</keyword-value>
+        </keyword-def>
+        <keyword-def name="volumeup">
+                <keyword-value>volumeup</keyword-value>
+        </keyword-def>
+        <keyword-def name="volumedown">
+                <keyword-value>volumedown</keyword-value>
+        </keyword-def>
+        <keyword-def name="memo">
+                <keyword-value>memo</keyword-value>
+        </keyword-def>
+        <keyword-def name="todo">
+                <keyword-value>todo</keyword-value>
+        </keyword-def>
+        <keyword-def name="calendar">
+                <keyword-value>calendar</keyword-value>
+        </keyword-def>
+        <keyword-def name="mail">
+                <keyword-value>mail</keyword-value>
+        </keyword-def>
+        <keyword-def name="address">
+                <keyword-value>address</keyword-value>
+        </keyword-def>
+        <keyword-def name="phone-send">
+                <keyword-value>phone-send</keyword-value>
+        </keyword-def>
+        <keyword-def name="phone-end">
+                <keyword-value>phone-end</keyword-value>
+        </keyword-def>
+        <keyword-def name="phone-accept">
+                <keyword-value>phone-accept</keyword-value>
+        </keyword-def>
+        <keyword-def name="vnd.">
+                <keyword-value>vnd.</keyword-value>
+        </keyword-def>
+        <keyword-def name="true">
+                <keyword-value>true</keyword-value>
+        </keyword-def>
+        <keyword-def name="false">
+                <keyword-value>false</keyword-value>
+        </keyword-def>
+        <keyword-def name="pause">
+                <keyword-value>pause</keyword-value>
+        </keyword-def>
+
 </css-profile>
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.css.core/src/org/eclipse/wst/css/core/internal/contenttype/AbstractContentDescriber.java b/bundles/org.eclipse.wst.css.core/src/org/eclipse/wst/css/core/internal/contenttype/AbstractContentDescriber.java
deleted file mode 100644
index 7ff6b6c..0000000
--- a/bundles/org.eclipse.wst.css.core/src/org/eclipse/wst/css/core/internal/contenttype/AbstractContentDescriber.java
+++ /dev/null
@@ -1,208 +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.css.core.internal.contenttype;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Reader;
-
-import org.eclipse.core.runtime.QualifiedName;
-import org.eclipse.core.runtime.content.IContentDescriber;
-import org.eclipse.core.runtime.content.IContentDescription;
-import org.eclipse.core.runtime.content.ITextContentDescriber;
-import org.eclipse.wst.sse.core.internal.encoding.EncodingMemento;
-import org.eclipse.wst.sse.core.internal.encoding.IContentDescriptionExtended;
-import org.eclipse.wst.sse.core.internal.encoding.IResourceCharsetDetector;
-
-public abstract class AbstractContentDescriber implements ITextContentDescriber {
-
-	private final static QualifiedName[] SUPPORTED_OPTIONS = {IContentDescription.CHARSET, IContentDescription.BYTE_ORDER_MARK, IContentDescriptionExtended.DETECTED_CHARSET, IContentDescriptionExtended.UNSUPPORTED_CHARSET, IContentDescriptionExtended.APPROPRIATE_DEFAULT};
-
-	private void calculateSupportedOptions(InputStream contents, IContentDescription description) throws IOException {
-		if (isRelevent(description)) {
-			IResourceCharsetDetector detector = getDetector();
-			detector.set(contents);
-			handleCalculations(description, detector);
-		}
-	}
-
-	/**
-	 * @param contents
-	 * @param description
-	 * @throws IOException
-	 */
-	private void calculateSupportedOptions(Reader contents, IContentDescription description) throws IOException {
-		if (isRelevent(description)) {
-			IResourceCharsetDetector detector = getDetector();
-			detector.set(contents);
-			handleCalculations(description, detector);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.content.IContentDescriber#describe(java.io.InputStream,
-	 *      org.eclipse.core.runtime.content.IContentDescription)
-	 */
-	public int describe(InputStream contents, IContentDescription description) throws IOException {
-		int result = IContentDescriber.VALID;
-
-		calculateSupportedOptions(contents, description);
-
-		// assume if we're called at all that we are valid (few types could be
-		// disproved, maybe XML -- or, maybe if exception occurs above?)
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.content.ITextContentDescriber#describe(java.io.Reader,
-	 *      org.eclipse.core.runtime.content.IContentDescription)
-	 */
-	public int describe(Reader contents, IContentDescription description) throws IOException {
-		int result = IContentDescriber.VALID;
-
-		calculateSupportedOptions(contents, description);
-
-		// assume if we're called at all that we are valid (few types could be
-		// disproved, maybe XML -- or, maybe if exception occurs above?)
-		return result;
-	}
-
-	protected abstract IResourceCharsetDetector getDetector();
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.content.IContentDescriber#getSupportedOptions()
-	 */
-	public QualifiedName[] getSupportedOptions() {
-
-		return SUPPORTED_OPTIONS;
-	}
-
-	/**
-	 * @param description
-	 * @param detector
-	 * @throws IOException
-	 */
-	protected void handleCalculations(IContentDescription description, IResourceCharsetDetector detector) throws IOException {
-		// note: if we're asked for one, we set them all. I need to be sure if
-		// called
-		// mulitiple times (one for each, say) that we don't waste time
-		// processing same
-		// content again.
-		EncodingMemento encodingMemento = detector.getEncodingMemento();
-		// TODO: I need to verify to see if this BOM work is always done
-		// by text type.
-		Object detectedByteOrderMark = encodingMemento.getUnicodeBOM();
-		if (detectedByteOrderMark != null) {
-			Object existingByteOrderMark = description.getProperty(IContentDescription.BYTE_ORDER_MARK);
-			// not sure why would ever be different, so if is different, may
-			// need to "push" up into base.
-			if (!detectedByteOrderMark.equals(existingByteOrderMark))
-				description.setProperty(IContentDescription.BYTE_ORDER_MARK, detectedByteOrderMark);
-		}
-
-
-		if (!encodingMemento.isValid()) {
-			// note: after setting here, its the mere presence of
-			// IContentDescriptionExtended.UNSUPPORTED_CHARSET
-			// in the resource's description that can be used to determine if
-			// invalid
-			// in those cases, the "detected" property contains an
-			// "appropriate default" to use.
-			description.setProperty(IContentDescriptionExtended.UNSUPPORTED_CHARSET, encodingMemento.getInvalidEncoding());
-			description.setProperty(IContentDescriptionExtended.APPROPRIATE_DEFAULT, encodingMemento.getAppropriateDefault());
-		}
-
-		Object detectedCharset = encodingMemento.getDetectedCharsetName();
-		Object javaCharset = encodingMemento.getJavaCharsetName();
-
-		// we always include detected, if its different than java
-		handleDetectedSpecialCase(description, detectedCharset, javaCharset);
-
-		if (javaCharset != null) {
-			Object existingCharset = description.getProperty(IContentDescription.CHARSET);
-			if (javaCharset.equals(existingCharset)) {
-				handleDetectedSpecialCase(description, detectedCharset, javaCharset);
-			} else {
-				// we may need to add what we found, but only need to add
-				// if different from default.the
-				Object defaultCharset = getDetector().getSpecDefaultEncoding();
-				if (defaultCharset != null) {
-					if (!defaultCharset.equals(javaCharset)) {
-						description.setProperty(IContentDescription.CHARSET, javaCharset);
-					}
-				} else {
-					// assuming if there is no spec default, we always need to
-					// add, I'm assuming
-					description.setProperty(IContentDescription.CHARSET, javaCharset);
-				}
-			}
-		}
-
-		// avoid adding anything if not absolutly needed, since always
-		// "cached" per session
-		//description.setProperty(IContentDescriptionExtended.ENCODING_MEMENTO,
-		// encodingMemento);
-	}
-
-	private void handleDetectedSpecialCase(IContentDescription description, Object detectedCharset, Object javaCharset) {
-		// since equal, we don't need to add, but if our detected version is
-		// different than
-		// javaCharset, then we should add it. This will happen, for example,
-		// if there's
-		// differences in case, or differences due to override properties
-		if (detectedCharset != null) {
-			//			if (!detectedCharset.equals(javaCharset)) {
-			//				description.setProperty(IContentDescriptionExtended.DETECTED_CHARSET,
-			// detectedCharset);
-			//			}
-
-			// Once we detected a charset, we should set the property even
-			// though it's the same as javaCharset
-			// because there are clients that rely on this property to
-			// determine if the charset is actually detected in file or not.
-			description.setProperty(IContentDescriptionExtended.DETECTED_CHARSET, detectedCharset);
-		}
-	}
-
-	/**
-	 * @param description
-	 * @return
-	 */
-	private boolean isRelevent(IContentDescription description) {
-		boolean result = false;
-		if (description == null)
-			result = false;
-		else if (description.isRequested(IContentDescription.BYTE_ORDER_MARK))
-			result = true;
-		else if (description.isRequested(IContentDescription.CHARSET))
-			result = true;
-		else if (description.isRequested(IContentDescriptionExtended.APPROPRIATE_DEFAULT))
-			result = true;
-		else if (description.isRequested(IContentDescriptionExtended.DETECTED_CHARSET))
-			result = true;
-		else if (description.isRequested(IContentDescriptionExtended.UNSUPPORTED_CHARSET))
-			result = true;
-		//		else if
-		// (description.isRequested(IContentDescriptionExtended.ENCODING_MEMENTO))
-		//			result = true;
-		return result;
-	}
-
-
-}
diff --git a/bundles/org.eclipse.wst.css.core/src/org/eclipse/wst/css/core/internal/contenttype/AbstractResourceEncodingDetector.java b/bundles/org.eclipse.wst.css.core/src/org/eclipse/wst/css/core/internal/contenttype/AbstractResourceEncodingDetector.java
deleted file mode 100644
index f671640..0000000
--- a/bundles/org.eclipse.wst.css.core/src/org/eclipse/wst/css/core/internal/contenttype/AbstractResourceEncodingDetector.java
+++ /dev/null
@@ -1,258 +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.css.core.internal.contenttype;
-
-import java.io.BufferedInputStream;
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Reader;
-import java.nio.charset.Charset;
-import java.nio.charset.IllegalCharsetNameException;
-import java.nio.charset.UnsupportedCharsetException;
-
-import org.eclipse.core.resources.IStorage;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.wst.sse.core.internal.encoding.CodedIO;
-import org.eclipse.wst.sse.core.internal.encoding.EncodingMemento;
-import org.eclipse.wst.sse.core.internal.encoding.IResourceCharsetDetector;
-import org.eclipse.wst.sse.core.internal.encoding.util.ByteReader;
-
-
-public abstract class AbstractResourceEncodingDetector implements IResourceCharsetDetector {
-
-	protected EncodingMemento fEncodingMemento;
-
-	protected boolean fHeaderParsed;
-
-	protected Reader fReader;
-
-	/**
-	 *  
-	 */
-	public AbstractResourceEncodingDetector() {
-		super();
-	}
-
-	/**
-	 * Note: once this instance is created, trace info still needs to be
-	 * appended by caller, depending on the context its created.
-	 */
-	private void createEncodingMemento(String detectedCharsetName) {
-		fEncodingMemento = new EncodingMemento();
-		fEncodingMemento.setJavaCharsetName(getAppropriateJavaCharset(detectedCharsetName));
-		fEncodingMemento.setDetectedCharsetName(detectedCharsetName);
-		// TODO: if detectedCharset and spec default is
-		// null, need to use "work
-		// bench based" defaults.
-		fEncodingMemento.setAppropriateDefault(getSpecDefaultEncoding());
-	}
-
-	/**
-	 * convience method all subclasses can use (but not override)
-	 * 
-	 * @param detectedCharsetName
-	 * @param reason
-	 */
-	final protected void createEncodingMemento(String detectedCharsetName, String reason) {
-		createEncodingMemento(detectedCharsetName);
-	}
-
-	/**
-	 * convience method all subclasses can use (but not override)
-	 */
-	final protected void ensureInputSet() {
-		if (fReader == null) {
-			throw new IllegalStateException("input must be set before use"); //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * This method can return null, if invalid charset name (in which case
-	 * "appropriateDefault" should be used, if a name is really need for some
-	 * "save anyway" cases).
-	 * 
-	 * @param detectedCharsetName
-	 * @return
-	 */
-	private String getAppropriateJavaCharset(String detectedCharsetName) {
-		String result = null;
-		// 1. Check explicit mapping overrides from
-		// property file -- its here we pick up "rules" for cases
-		// that are not even in Java
-		result = CodedIO.checkMappingOverrides(detectedCharsetName);
-		// 2. Use the "canonical" name from JRE mappings
-		// Note: see Charset JavaDoc, the name you get one
-		// with can be alias,
-		// the name you get back is "standard" name.
-		Charset javaCharset = null;
-		try {
-			javaCharset = Charset.forName(detectedCharsetName);
-		} catch (UnsupportedCharsetException e) {
-			// only set invalid, if result is same as detected -- they won't
-			// be equal if
-			// overridden
-			if (result != null && result.equals(detectedCharsetName)) {
-				fEncodingMemento.setInvalidEncoding(detectedCharsetName);
-			}
-		} catch (IllegalCharsetNameException e) {
-			// only set invalid, if result is same as detected -- they won't
-			// be equal if
-			// overridden
-			if (result != null && result.equals(detectedCharsetName)) {
-				fEncodingMemento.setInvalidEncoding(detectedCharsetName);
-			}
-		}
-		// give priority to java cononical name, if present
-		if (javaCharset != null) {
-			result = javaCharset.name();
-			// but still allow overrides
-			result = CodedIO.checkMappingOverrides(result);
-		}
-		return result;
-	}
-
-	public String getEncoding() throws IOException {
-		return getEncodingMemento().getDetectedCharsetName();
-	}
-
-	// to ensure consist overall rules used, we'll mark as
-	// final,
-	// and require subclasses to provide certain pieces of
-	// the
-	// implementation
-	public EncodingMemento getEncodingMemento() throws IOException {
-		ensureInputSet();
-		if (!fHeaderParsed) {
-			parseInput();
-			// we keep track of if header's already been
-			// parse, so can make
-			// multiple 'get' calls, without causing
-			// reparsing.
-			fHeaderParsed = true;
-			// Note: there is a "hidden assumption" here
-			// that an empty
-			// string in content should be treated same as
-			// not present.
-		}
-		if (fEncodingMemento == null) {
-			handleSpecDefault();
-		}
-		if (fEncodingMemento == null) {
-			// safty net
-			fEncodingMemento = new NullMemento();
-		}
-		return fEncodingMemento;
-	}
-
-	/**
-	 * This is to return a default encoding -- as specified by an industry
-	 * content type spec -- when not present in the stream, for example, XML
-	 * specifies UTF-8, JSP specifies ISO-8859-1. This method should return
-	 * null if there is no such "spec default".
-	 */
-	abstract public String getSpecDefaultEncoding();
-
-	public EncodingMemento getSpecDefaultEncodingMemento() {
-		resetAll();
-		EncodingMemento result = null;
-		String enc = getSpecDefaultEncoding();
-		if (enc != null) {
-			createEncodingMemento(enc, EncodingMemento.DEFAULTS_ASSUMED_FOR_EMPTY_INPUT);
-			fEncodingMemento.setAppropriateDefault(enc);
-			result = fEncodingMemento;
-		}
-		return result;
-	}
-
-	private void handleSpecDefault() {
-		String encodingName;
-		encodingName = getSpecDefaultEncoding();
-		if (encodingName != null) {
-			//createEncodingMemento(encodingName,
-			// EncodingMemento.USED_CONTENT_TYPE_DEFAULT);
-			fEncodingMemento = new EncodingMemento();
-			fEncodingMemento.setJavaCharsetName(encodingName);
-			fEncodingMemento.setAppropriateDefault(encodingName);
-		}
-	}
-
-	/**
-	 * Every subclass must provide a way to parse the input. This method has
-	 * several critical responsibilities:
-	 * <li>set the fEncodingMemento field appropriately, according to the
-	 * results of the parse of fReader.</li>
-	 * <li>set fHarderParsed to true, to avoid wasted re-parsing.</li>
-	 */
-	abstract protected void parseInput() throws IOException;
-
-	/**
-	 *  
-	 */
-	private void resetAll() {
-		fReader = null;
-		fHeaderParsed = false;
-		fEncodingMemento = null;
-	}
-
-	/**
-	 *  
-	 */
-	public void set(InputStream inputStream) {
-		resetAll();
-		fReader = new ByteReader(inputStream);
-		try {
-			fReader.mark(CodedIO.MAX_MARK_SIZE);
-		} catch (IOException e) {
-			// impossible, since we know ByteReader
-			// supports marking
-			throw new Error(e);
-		}
-	}
-
-	/**
-	 *  
-	 */
-	public void set(IStorage iStorage) throws CoreException {
-		resetAll();
-		InputStream inputStream = iStorage.getContents();
-		InputStream resettableStream = new BufferedInputStream(inputStream, CodedIO.MAX_BUF_SIZE);
-		resettableStream.mark(CodedIO.MAX_MARK_SIZE);
-		set(resettableStream);
-		// TODO we'll need to "remember" IFile, or
-		// get its (or its project's) settings, in case
-		// those are needed to handle cases when the
-		// encoding is not in the file stream.
-	}
-
-	/**
-	 * Note: this is not part of interface to help avoid confusion ... it
-	 * expected this Reader is a well formed character reader ... that is, its
-	 * all ready been determined to not be a unicode marked input stream. And,
-	 * its assumed to be in the correct position, at position zero, ready to
-	 * read first character.
-	 */
-	public void set(Reader reader) {
-		resetAll();
-		fReader = reader;
-		if (!fReader.markSupported()) {
-			fReader = new BufferedReader(fReader);
-		}
-		try {
-			fReader.mark(CodedIO.MAX_MARK_SIZE);
-		} catch (IOException e) {
-			// impossble, since we just checked if markable
-			throw new Error(e);
-		}
-	}
-}
diff --git a/bundles/org.eclipse.wst.css.core/src/org/eclipse/wst/css/core/internal/contenttype/CSSHeadTokenizer.java b/bundles/org.eclipse.wst.css.core/src/org/eclipse/wst/css/core/internal/contenttype/CSSHeadTokenizer.java
index 7dfb41f..02da8cf 100644
--- a/bundles/org.eclipse.wst.css.core/src/org/eclipse/wst/css/core/internal/contenttype/CSSHeadTokenizer.java
+++ b/bundles/org.eclipse.wst.css.core/src/org/eclipse/wst/css/core/internal/contenttype/CSSHeadTokenizer.java
@@ -121,7 +121,7 @@
 
 
 	private boolean hasMore = true;
-	private final static int MAX_TO_SCAN = 1000;
+	private final static int MAX_TO_SCAN = 8000;
 	StringBuffer string = new StringBuffer();
 	// state stack for easier state handling
 	private IntStack fStateStack = new IntStack();
diff --git a/bundles/org.eclipse.wst.css.core/src/org/eclipse/wst/css/core/internal/contenttype/CSSResourceEncodingDetector.java b/bundles/org.eclipse.wst.css.core/src/org/eclipse/wst/css/core/internal/contenttype/CSSResourceEncodingDetector.java
index b8ba5f2..1827a89 100644
--- a/bundles/org.eclipse.wst.css.core/src/org/eclipse/wst/css/core/internal/contenttype/CSSResourceEncodingDetector.java
+++ b/bundles/org.eclipse.wst.css.core/src/org/eclipse/wst/css/core/internal/contenttype/CSSResourceEncodingDetector.java
@@ -10,17 +10,45 @@
  *******************************************************************************/
 package org.eclipse.wst.css.core.internal.contenttype;
 
+import java.io.BufferedInputStream;
+import java.io.BufferedReader;
 import java.io.IOException;
+import java.io.InputStream;
+import java.io.Reader;
+import java.nio.charset.Charset;
+import java.nio.charset.IllegalCharsetNameException;
+import java.nio.charset.UnsupportedCharsetException;
 
+import org.eclipse.core.resources.IStorage;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.wst.sse.core.internal.encoding.CodedIO;
 import org.eclipse.wst.sse.core.internal.encoding.EncodingMemento;
 import org.eclipse.wst.sse.core.internal.encoding.IResourceCharsetDetector;
+import org.eclipse.wst.sse.core.internal.encoding.NonContentBasedEncodingRules;
+import org.eclipse.wst.sse.core.internal.encoding.util.ByteReader;
 import org.eclipse.wst.xml.core.internal.contenttype.EncodingParserConstants;
 
 
 
-public class CSSResourceEncodingDetector extends AbstractResourceEncodingDetector implements IResourceCharsetDetector {
+public class CSSResourceEncodingDetector implements IResourceCharsetDetector {
+	class NullMemento extends EncodingMemento {
+		/**
+		 * 
+		 */
+		public NullMemento() {
+			super();
+			String defaultCharset = NonContentBasedEncodingRules.useDefaultNameRules(null);
+			setJavaCharsetName(defaultCharset);
+			setAppropriateDefault(defaultCharset);
+			setDetectedCharsetName(null);
+		}
+	}
+
 
 	private CSSHeadTokenizer fTokenizer;
+	private EncodingMemento fEncodingMemento;
+	private boolean fHeaderParsed;
+	private Reader fReader;
 
 	/**
 	 * There is no spec defined encoding for CSS, so Null is returned.
@@ -62,13 +90,14 @@
 	}
 
 	private boolean isLegalString(String valueTokenType) {
-		if (valueTokenType == null)
-			return false;
-		else
-			return valueTokenType.equals(EncodingParserConstants.StringValue) || valueTokenType.equals(EncodingParserConstants.UnDelimitedStringValue) || valueTokenType.equals(EncodingParserConstants.InvalidTerminatedStringValue) || valueTokenType.equals(EncodingParserConstants.InvalidTermintatedUnDelimitedStringValue);
+		boolean result = false;
+		if (valueTokenType != null) {
+			result = valueTokenType.equals(EncodingParserConstants.StringValue) || valueTokenType.equals(EncodingParserConstants.UnDelimitedStringValue) || valueTokenType.equals(EncodingParserConstants.InvalidTerminatedStringValue) || valueTokenType.equals(EncodingParserConstants.InvalidTermintatedUnDelimitedStringValue);
+		}
+		return result;
 	}
 
-	protected void parseInput() throws IOException {
+	private void parseInput() throws IOException {
 		checkInContents();
 		if (fEncodingMemento == null) {
 			checkHeuristics();
@@ -143,4 +172,198 @@
 
 	}
 
+	/**
+	 * Note: once this instance is created, trace info still needs to be
+	 * appended by caller, depending on the context its created.
+	 */
+	private void createEncodingMemento(String detectedCharsetName) {
+		fEncodingMemento = new EncodingMemento();
+		fEncodingMemento.setJavaCharsetName(getAppropriateJavaCharset(detectedCharsetName));
+		fEncodingMemento.setDetectedCharsetName(detectedCharsetName);
+		// TODO: if detectedCharset and spec default is
+		// null, need to use "work
+		// bench based" defaults.
+		fEncodingMemento.setAppropriateDefault(getSpecDefaultEncoding());
+	}
+
+	/**
+	 * convience method all subclasses can use (but not override)
+	 * 
+	 * @param detectedCharsetName
+	 * @param reason
+	 */
+	private void createEncodingMemento(String detectedCharsetName, String reason) {
+		createEncodingMemento(detectedCharsetName);
+	}
+
+	/**
+	 * convience method all subclasses can use (but not override)
+	 */
+	private final void ensureInputSet() {
+		if (fReader == null) {
+			throw new IllegalStateException("input must be set before use"); //$NON-NLS-1$
+		}
+	}
+
+	/**
+	 * This method can return null, if invalid charset name (in which case
+	 * "appropriateDefault" should be used, if a name is really need for some
+	 * "save anyway" cases).
+	 * 
+	 * @param detectedCharsetName
+	 * @return
+	 */
+	private String getAppropriateJavaCharset(String detectedCharsetName) {
+		String result = null;
+		// 1. Check explicit mapping overrides from
+		// property file -- its here we pick up "rules" for cases
+		// that are not even in Java
+		result = CodedIO.checkMappingOverrides(detectedCharsetName);
+		// 2. Use the "canonical" name from JRE mappings
+		// Note: see Charset JavaDoc, the name you get one
+		// with can be alias,
+		// the name you get back is "standard" name.
+		Charset javaCharset = null;
+		try {
+			javaCharset = Charset.forName(detectedCharsetName);
+		}
+		catch (UnsupportedCharsetException e) {
+			// only set invalid, if result is same as detected -- they won't
+			// be equal if
+			// overridden
+			if (result != null && result.equals(detectedCharsetName)) {
+				fEncodingMemento.setInvalidEncoding(detectedCharsetName);
+			}
+		}
+		catch (IllegalCharsetNameException e) {
+			// only set invalid, if result is same as detected -- they won't
+			// be equal if
+			// overridden
+			if (result != null && result.equals(detectedCharsetName)) {
+				fEncodingMemento.setInvalidEncoding(detectedCharsetName);
+			}
+		}
+		// give priority to java cononical name, if present
+		if (javaCharset != null) {
+			result = javaCharset.name();
+			// but still allow overrides
+			result = CodedIO.checkMappingOverrides(result);
+		}
+		return result;
+	}
+
+	public String getEncoding() throws IOException {
+		return getEncodingMemento().getDetectedCharsetName();
+	}
+
+	public EncodingMemento getEncodingMemento() throws IOException {
+		ensureInputSet();
+		if (!fHeaderParsed) {
+			parseInput();
+			// we keep track of if header's already been
+			// parse, so can make
+			// multiple 'get' calls, without causing
+			// reparsing.
+			fHeaderParsed = true;
+			// Note: there is a "hidden assumption" here
+			// that an empty
+			// string in content should be treated same as
+			// not present.
+		}
+		if (fEncodingMemento == null) {
+			handleSpecDefault();
+		}
+		if (fEncodingMemento == null) {
+			// safty net
+			fEncodingMemento = new NullMemento();
+		}
+		return fEncodingMemento;
+	}
+
+	public EncodingMemento getSpecDefaultEncodingMemento() {
+		resetAll();
+		EncodingMemento result = null;
+		String enc = getSpecDefaultEncoding();
+		if (enc != null) {
+			createEncodingMemento(enc, EncodingMemento.DEFAULTS_ASSUMED_FOR_EMPTY_INPUT);
+			fEncodingMemento.setAppropriateDefault(enc);
+			result = fEncodingMemento;
+		}
+		return result;
+	}
+
+	private void handleSpecDefault() {
+		String encodingName;
+		encodingName = getSpecDefaultEncoding();
+		if (encodingName != null) {
+			// createEncodingMemento(encodingName,
+			// EncodingMemento.USED_CONTENT_TYPE_DEFAULT);
+			fEncodingMemento = new EncodingMemento();
+			fEncodingMemento.setJavaCharsetName(encodingName);
+			fEncodingMemento.setAppropriateDefault(encodingName);
+		}
+	}
+
+	/**
+	 * 
+	 */
+	private void resetAll() {
+		fReader = null;
+		fHeaderParsed = false;
+		fEncodingMemento = null;
+	}
+
+	/**
+	 * 
+	 */
+	public void set(InputStream inputStream) {
+		resetAll();
+		fReader = new ByteReader(inputStream);
+		try {
+			fReader.mark(CodedIO.MAX_MARK_SIZE);
+		}
+		catch (IOException e) {
+			// impossible, since we know ByteReader
+			// supports marking
+			throw new Error(e);
+		}
+	}
+
+	/**
+	 * 
+	 */
+	public void set(IStorage iStorage) throws CoreException {
+		resetAll();
+		InputStream inputStream = iStorage.getContents();
+		InputStream resettableStream = new BufferedInputStream(inputStream, CodedIO.MAX_BUF_SIZE);
+		resettableStream.mark(CodedIO.MAX_MARK_SIZE);
+		set(resettableStream);
+		// TODO we'll need to "remember" IFile, or
+		// get its (or its project's) settings, in case
+		// those are needed to handle cases when the
+		// encoding is not in the file stream.
+	}
+
+	/**
+	 * Note: this is not part of interface to help avoid confusion ... it
+	 * expected this Reader is a well formed character reader ... that is, its
+	 * all ready been determined to not be a unicode marked input stream. And,
+	 * its assumed to be in the correct position, at position zero, ready to
+	 * read first character.
+	 */
+	public void set(Reader reader) {
+		resetAll();
+		fReader = reader;
+		if (!fReader.markSupported()) {
+			fReader = new BufferedReader(fReader);
+		}
+		try {
+			fReader.mark(CodedIO.MAX_MARK_SIZE);
+		}
+		catch (IOException e) {
+			// impossble, since we just checked if markable
+			throw new Error(e);
+		}
+	}
+
 }
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.css.core/src/org/eclipse/wst/css/core/internal/contenttype/ContentDescriberForCSS.java b/bundles/org.eclipse.wst.css.core/src/org/eclipse/wst/css/core/internal/contenttype/ContentDescriberForCSS.java
index ab00f91..5eeca5c 100644
--- a/bundles/org.eclipse.wst.css.core/src/org/eclipse/wst/css/core/internal/contenttype/ContentDescriberForCSS.java
+++ b/bundles/org.eclipse.wst.css.core/src/org/eclipse/wst/css/core/internal/contenttype/ContentDescriberForCSS.java
@@ -10,14 +10,170 @@
  *******************************************************************************/
 package org.eclipse.wst.css.core.internal.contenttype;
 
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Reader;
+
+import org.eclipse.core.runtime.QualifiedName;
+import org.eclipse.core.runtime.content.IContentDescriber;
+import org.eclipse.core.runtime.content.IContentDescription;
 import org.eclipse.core.runtime.content.ITextContentDescriber;
+import org.eclipse.wst.sse.core.internal.encoding.EncodingMemento;
+import org.eclipse.wst.sse.core.internal.encoding.IContentDescriptionExtended;
 import org.eclipse.wst.sse.core.internal.encoding.IResourceCharsetDetector;
 
 
-public class ContentDescriberForCSS extends AbstractContentDescriber implements ITextContentDescriber {
+public final class ContentDescriberForCSS implements ITextContentDescriber {
+	final private static QualifiedName[] SUPPORTED_OPTIONS = {IContentDescription.CHARSET, IContentDescription.BYTE_ORDER_MARK, IContentDescriptionExtended.DETECTED_CHARSET, IContentDescriptionExtended.UNSUPPORTED_CHARSET, IContentDescriptionExtended.APPROPRIATE_DEFAULT};
 
-	protected IResourceCharsetDetector getDetector() {
+	public int describe(InputStream contents, IContentDescription description) throws IOException {
+		int result = IContentDescriber.INDETERMINATE;
+
+		calculateSupportedOptions(contents, description);
+
+		return result;
+	}
+
+	public int describe(Reader contents, IContentDescription description) throws IOException {
+		int result = IContentDescriber.INDETERMINATE;
+
+		calculateSupportedOptions(contents, description);
+
+		return result;
+	}
+
+	public QualifiedName[] getSupportedOptions() {
+
+		return SUPPORTED_OPTIONS;
+	}
+
+	private void calculateSupportedOptions(InputStream contents, IContentDescription description) throws IOException {
+		if (isRelevent(description)) {
+			IResourceCharsetDetector detector = getDetector();
+			detector.set(contents);
+			handleCalculations(description, detector);
+		}
+	}
+
+	/**
+	 * @param contents
+	 * @param description
+	 * @throws IOException
+	 */
+	private void calculateSupportedOptions(Reader contents, IContentDescription description) throws IOException {
+		if (isRelevent(description)) {
+			IResourceCharsetDetector detector = getDetector();
+			detector.set(contents);
+			handleCalculations(description, detector);
+		}
+	}
+
+	private IResourceCharsetDetector getDetector() {
 		return new CSSResourceEncodingDetector();
 	}
 
+	/**
+	 * @param description
+	 * @param detector
+	 * @throws IOException
+	 */
+	private void handleCalculations(IContentDescription description, IResourceCharsetDetector detector) throws IOException {
+		// note: if we're asked for one, we set them all. I need to be sure if
+		// called
+		// mulitiple times (one for each, say) that we don't waste time
+		// processing same
+		// content again.
+		EncodingMemento encodingMemento = detector.getEncodingMemento();
+		// TODO: I need to verify to see if this BOM work is always done
+		// by text type.
+		Object detectedByteOrderMark = encodingMemento.getUnicodeBOM();
+		if (detectedByteOrderMark != null) {
+			Object existingByteOrderMark = description.getProperty(IContentDescription.BYTE_ORDER_MARK);
+			// not sure why would ever be different, so if is different, may
+			// need to "push" up into base.
+			if (!detectedByteOrderMark.equals(existingByteOrderMark))
+				description.setProperty(IContentDescription.BYTE_ORDER_MARK, detectedByteOrderMark);
+		}
+
+
+		if (!encodingMemento.isValid()) {
+			// note: after setting here, its the mere presence of
+			// IContentDescriptionExtended.UNSUPPORTED_CHARSET
+			// in the resource's description that can be used to determine if
+			// invalid
+			// in those cases, the "detected" property contains an
+			// "appropriate default" to use.
+			description.setProperty(IContentDescriptionExtended.UNSUPPORTED_CHARSET, encodingMemento.getInvalidEncoding());
+			description.setProperty(IContentDescriptionExtended.APPROPRIATE_DEFAULT, encodingMemento.getAppropriateDefault());
+		}
+
+		Object detectedCharset = encodingMemento.getDetectedCharsetName();
+		Object javaCharset = encodingMemento.getJavaCharsetName();
+
+		// we always include detected, if its different than java
+		handleDetectedSpecialCase(description, detectedCharset, javaCharset);
+
+		if (javaCharset != null) {
+			Object existingCharset = description.getProperty(IContentDescription.CHARSET);
+			if (javaCharset.equals(existingCharset)) {
+				handleDetectedSpecialCase(description, detectedCharset, javaCharset);
+			}
+			else {
+				// we may need to add what we found, but only need to add
+				// if different from default.the
+				Object defaultCharset = getDetector().getSpecDefaultEncoding();
+				if (defaultCharset != null) {
+					if (!defaultCharset.equals(javaCharset)) {
+						description.setProperty(IContentDescription.CHARSET, javaCharset);
+					}
+				}
+				else {
+					// assuming if there is no spec default, we always need to
+					// add, I'm assuming
+					description.setProperty(IContentDescription.CHARSET, javaCharset);
+				}
+			}
+		}
+
+	}
+
+	private void handleDetectedSpecialCase(IContentDescription description, Object detectedCharset, Object javaCharset) {
+		// since equal, we don't need to add, but if our detected version is
+		// different than javaCharset, then we should add it. This will
+		// happen, for example, if there's differences in case, or differences
+		// due to override properties
+		if (detectedCharset != null) {
+
+			// Once we detected a charset, we should set the property even
+			// though it's the same as javaCharset
+			// because there are clients that rely on this property to
+			// determine if the charset is actually detected in file or not.
+			description.setProperty(IContentDescriptionExtended.DETECTED_CHARSET, detectedCharset);
+		}
+	}
+
+	/**
+	 * @param description
+	 * @return
+	 */
+	private boolean isRelevent(IContentDescription description) {
+		boolean result = false;
+		if (description == null)
+			result = false;
+		else if (description.isRequested(IContentDescription.BYTE_ORDER_MARK))
+			result = true;
+		else if (description.isRequested(IContentDescription.CHARSET))
+			result = true;
+		else if (description.isRequested(IContentDescriptionExtended.APPROPRIATE_DEFAULT))
+			result = true;
+		else if (description.isRequested(IContentDescriptionExtended.DETECTED_CHARSET))
+			result = true;
+		else if (description.isRequested(IContentDescriptionExtended.UNSUPPORTED_CHARSET))
+			result = true;
+		// else if
+		// (description.isRequested(IContentDescriptionExtended.ENCODING_MEMENTO))
+		// result = true;
+		return result;
+	}
+
 }
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.css.core/src/org/eclipse/wst/css/core/internal/contenttype/NullMemento.java b/bundles/org.eclipse.wst.css.core/src/org/eclipse/wst/css/core/internal/contenttype/NullMemento.java
deleted file mode 100644
index 10b9688..0000000
--- a/bundles/org.eclipse.wst.css.core/src/org/eclipse/wst/css/core/internal/contenttype/NullMemento.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     
- *******************************************************************************/
-package org.eclipse.wst.css.core.internal.contenttype;
-
-import org.eclipse.wst.sse.core.internal.encoding.EncodingMemento;
-import org.eclipse.wst.sse.core.internal.encoding.NonContentBasedEncodingRules;
-
-
-
-/**
- * This class can be used in place of an EncodingMemento (its super class),
- * when there is not in fact ANY encoding information. For example, when a
- * structuredDocument is created directly from a String
- */
-public class NullMemento extends EncodingMemento {
-	/**
-	 *  
-	 */
-	public NullMemento() {
-		super();
-		String defaultCharset = NonContentBasedEncodingRules.useDefaultNameRules(null);
-		setJavaCharsetName(defaultCharset);
-		setAppropriateDefault(defaultCharset);
-		setDetectedCharsetName(null);
-	}
-
-}
diff --git a/bundles/org.eclipse.wst.css.core/src/org/eclipse/wst/css/core/internal/metamodelimpl/ProfileHandler.java b/bundles/org.eclipse.wst.css.core/src/org/eclipse/wst/css/core/internal/metamodelimpl/ProfileHandler.java
index 1ee30b5..c2b90bd 100644
--- a/bundles/org.eclipse.wst.css.core/src/org/eclipse/wst/css/core/internal/metamodelimpl/ProfileHandler.java
+++ b/bundles/org.eclipse.wst.css.core/src/org/eclipse/wst/css/core/internal/metamodelimpl/ProfileHandler.java
@@ -13,6 +13,7 @@
 import java.io.IOException;
 import java.net.MalformedURLException;
 import java.net.URL;
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
@@ -247,12 +248,14 @@
 
 		void doCorrect(CSSMMNodeImpl node) {
 			Iterator i = node.getChildNodes();
+			ArrayList errorNodes = new ArrayList();
 			while (i.hasNext()) {
 				CSSMMNodeImpl child = (CSSMMNodeImpl) i.next();
 				doCorrect(child);
 				short error = child.getError();
 				if (error != MetaModelErrors.NO_ERROR) {
-					node.removeChild(child);
+					// node.removeChild(child);
+					errorNodes.add(child);
 
 					String str = "[CSSProfile Error] " + node.getName(); //$NON-NLS-1$
 					str += "(" + node.getType() + ") contains error node: "; //$NON-NLS-1$ //$NON-NLS-2$
@@ -264,6 +267,13 @@
 					}
 				}
 			}
+			int errorSize = errorNodes.size();
+			if (errorSize > 0) {
+				for (int j = 0; j < errorSize; j++) {
+					CSSMMNodeImpl errorNode = (CSSMMNodeImpl) errorNodes.get(j);
+					node.removeChild(errorNode);
+				}
+			}
 		}
 	}
 
@@ -271,7 +281,7 @@
 	private CSSMetaModelImpl fMetaModel = null;
 	private NodePool fNodePool = null;
 	private Stack fNodeStack = new Stack();
-	private boolean fLogging = false;
+	boolean fLogging = false;
 	private ResourceBundle fResourceBundle = null;
 
 	private final static String ATTR_NAME_DEFINITION = "name"; //$NON-NLS-1$
diff --git a/bundles/org.eclipse.wst.dtd.core/src/org/eclipse/wst/dtd/core/internal/content/AbstractContentDescriber.java b/bundles/org.eclipse.wst.dtd.core/src/org/eclipse/wst/dtd/core/internal/content/AbstractContentDescriber.java
deleted file mode 100644
index b10a51e..0000000
--- a/bundles/org.eclipse.wst.dtd.core/src/org/eclipse/wst/dtd/core/internal/content/AbstractContentDescriber.java
+++ /dev/null
@@ -1,210 +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.core.internal.content;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Reader;
-
-import org.eclipse.core.runtime.QualifiedName;
-import org.eclipse.core.runtime.content.IContentDescriber;
-import org.eclipse.core.runtime.content.IContentDescription;
-import org.eclipse.core.runtime.content.ITextContentDescriber;
-import org.eclipse.wst.sse.core.internal.encoding.EncodingMemento;
-import org.eclipse.wst.sse.core.internal.encoding.IContentDescriptionExtended;
-import org.eclipse.wst.sse.core.internal.encoding.IResourceCharsetDetector;
-
-public abstract class AbstractContentDescriber implements ITextContentDescriber {
-
-	private final static QualifiedName[] SUPPORTED_OPTIONS = {IContentDescription.CHARSET, IContentDescription.BYTE_ORDER_MARK, IContentDescriptionExtended.DETECTED_CHARSET, IContentDescriptionExtended.UNSUPPORTED_CHARSET, IContentDescriptionExtended.APPROPRIATE_DEFAULT};
-
-	private void calculateSupportedOptions(InputStream contents, IContentDescription description) throws IOException {
-		if (isRelevent(description)) {
-			IResourceCharsetDetector detector = getDetector();
-			detector.set(contents);
-			handleCalculations(description, detector);
-		}
-	}
-
-	/**
-	 * @param contents
-	 * @param description
-	 * @throws IOException
-	 */
-	private void calculateSupportedOptions(Reader contents, IContentDescription description) throws IOException {
-		if (isRelevent(description)) {
-			IResourceCharsetDetector detector = getDetector();
-			detector.set(contents);
-			handleCalculations(description, detector);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.content.IContentDescriber#describe(java.io.InputStream,
-	 *      org.eclipse.core.runtime.content.IContentDescription)
-	 */
-	public int describe(InputStream contents, IContentDescription description) throws IOException {
-		int result = IContentDescriber.VALID;
-
-		calculateSupportedOptions(contents, description);
-
-		// assume if we're called at all that we are valid (few types could be
-		// disproved, maybe XML -- or, maybe if exception occurs above?)
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.content.ITextContentDescriber#describe(java.io.Reader,
-	 *      org.eclipse.core.runtime.content.IContentDescription)
-	 */
-	public int describe(Reader contents, IContentDescription description) throws IOException {
-		int result = IContentDescriber.VALID;
-
-		calculateSupportedOptions(contents, description);
-
-		// assume if we're called at all that we are valid (few types could be
-		// disproved, maybe XML -- or, maybe if exception occurs above?)
-		return result;
-	}
-
-	protected abstract IResourceCharsetDetector getDetector();
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.content.IContentDescriber#getSupportedOptions()
-	 */
-	public QualifiedName[] getSupportedOptions() {
-
-		return SUPPORTED_OPTIONS;
-	}
-
-	/**
-	 * @param description
-	 * @param detector
-	 * @throws IOException
-	 */
-	protected void handleCalculations(IContentDescription description, IResourceCharsetDetector detector) throws IOException {
-		// note: if we're asked for one, we set them all. I need to be sure if
-		// called
-		// mulitiple times (one for each, say) that we don't waste time
-		// processing same
-		// content again.
-		EncodingMemento encodingMemento = detector.getEncodingMemento();
-		// TODO: I need to verify to see if this BOM work is always done
-		// by text type.
-		Object detectedByteOrderMark = encodingMemento.getUnicodeBOM();
-		if (detectedByteOrderMark != null) {
-			Object existingByteOrderMark = description.getProperty(IContentDescription.BYTE_ORDER_MARK);
-			// not sure why would ever be different, so if is different, may
-			// need to "push" up into base.
-			if (!detectedByteOrderMark.equals(existingByteOrderMark))
-				description.setProperty(IContentDescription.BYTE_ORDER_MARK, detectedByteOrderMark);
-		}
-
-
-		if (!encodingMemento.isValid()) {
-			// note: after setting here, its the mere presence of
-			// IContentDescriptionExtended.UNSUPPORTED_CHARSET
-			// in the resource's description that can be used to determine if
-			// invalid
-			// in those cases, the "detected" property contains an
-			// "appropriate default" to use.
-			description.setProperty(IContentDescriptionExtended.UNSUPPORTED_CHARSET, encodingMemento.getInvalidEncoding());
-			description.setProperty(IContentDescriptionExtended.APPROPRIATE_DEFAULT, encodingMemento.getAppropriateDefault());
-		}
-
-		Object detectedCharset = encodingMemento.getDetectedCharsetName();
-		Object javaCharset = encodingMemento.getJavaCharsetName();
-
-		// we always include detected, if its different than java
-		handleDetectedSpecialCase(description, detectedCharset, javaCharset);
-
-		if (javaCharset != null) {
-			Object existingCharset = description.getProperty(IContentDescription.CHARSET);
-			if (javaCharset.equals(existingCharset)) {
-				handleDetectedSpecialCase(description, detectedCharset, javaCharset);
-			}
-			else {
-				// we may need to add what we found, but only need to add
-				// if different from default.the
-				Object defaultCharset = getDetector().getSpecDefaultEncoding();
-				if (defaultCharset != null) {
-					if (!defaultCharset.equals(javaCharset)) {
-						description.setProperty(IContentDescription.CHARSET, javaCharset);
-					}
-				}
-				else {
-					// assuming if there is no spec default, we always need to
-					// add, I'm assuming
-					description.setProperty(IContentDescription.CHARSET, javaCharset);
-				}
-			}
-		}
-
-		// avoid adding anything if not absolutly needed, since always
-		// "cached" per session
-		// description.setProperty(IContentDescriptionExtended.ENCODING_MEMENTO,
-		// encodingMemento);
-	}
-
-	private void handleDetectedSpecialCase(IContentDescription description, Object detectedCharset, Object javaCharset) {
-		// since equal, we don't need to add, but if our detected version is
-		// different than
-		// javaCharset, then we should add it. This will happen, for example,
-		// if there's
-		// differences in case, or differences due to override properties
-		if (detectedCharset != null) {
-			// if (!detectedCharset.equals(javaCharset)) {
-			// description.setProperty(IContentDescriptionExtended.DETECTED_CHARSET,
-			// detectedCharset);
-			// }
-
-			// Once we detected a charset, we should set the property even
-			// though it's the same as javaCharset
-			// because there are clients that rely on this property to
-			// determine if the charset is actually detected in file or not.
-			description.setProperty(IContentDescriptionExtended.DETECTED_CHARSET, detectedCharset);
-		}
-	}
-
-	/**
-	 * @param description
-	 * @return
-	 */
-	private boolean isRelevent(IContentDescription description) {
-		boolean result = false;
-		if (description == null)
-			result = false;
-		else if (description.isRequested(IContentDescription.BYTE_ORDER_MARK))
-			result = true;
-		else if (description.isRequested(IContentDescription.CHARSET))
-			result = true;
-		else if (description.isRequested(IContentDescriptionExtended.APPROPRIATE_DEFAULT))
-			result = true;
-		else if (description.isRequested(IContentDescriptionExtended.DETECTED_CHARSET))
-			result = true;
-		else if (description.isRequested(IContentDescriptionExtended.UNSUPPORTED_CHARSET))
-			result = true;
-		// else if
-		// (description.isRequested(IContentDescriptionExtended.ENCODING_MEMENTO))
-		// result = true;
-		return result;
-	}
-
-
-}
diff --git a/bundles/org.eclipse.wst.dtd.core/src/org/eclipse/wst/dtd/core/internal/content/ContentDescriberForDTD.java b/bundles/org.eclipse.wst.dtd.core/src/org/eclipse/wst/dtd/core/internal/content/ContentDescriberForDTD.java
index 75c1eca..0c359b9 100644
--- a/bundles/org.eclipse.wst.dtd.core/src/org/eclipse/wst/dtd/core/internal/content/ContentDescriberForDTD.java
+++ b/bundles/org.eclipse.wst.dtd.core/src/org/eclipse/wst/dtd/core/internal/content/ContentDescriberForDTD.java
@@ -12,17 +12,179 @@
  *******************************************************************************/
 package org.eclipse.wst.dtd.core.internal.content;
 
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Reader;
+
+import org.eclipse.core.runtime.QualifiedName;
+import org.eclipse.core.runtime.content.IContentDescriber;
+import org.eclipse.core.runtime.content.IContentDescription;
 import org.eclipse.core.runtime.content.ITextContentDescriber;
+import org.eclipse.wst.sse.core.internal.encoding.EncodingMemento;
+import org.eclipse.wst.sse.core.internal.encoding.IContentDescriptionExtended;
 import org.eclipse.wst.sse.core.internal.encoding.IResourceCharsetDetector;
 import org.eclipse.wst.xml.core.internal.contenttype.XMLResourceEncodingDetector;
 
 
 
-public class ContentDescriberForDTD extends AbstractContentDescriber implements ITextContentDescriber {
+public final class ContentDescriberForDTD implements ITextContentDescriber {
+	final private static QualifiedName[] SUPPORTED_OPTIONS = {IContentDescription.CHARSET, IContentDescription.BYTE_ORDER_MARK, IContentDescriptionExtended.DETECTED_CHARSET, IContentDescriptionExtended.UNSUPPORTED_CHARSET, IContentDescriptionExtended.APPROPRIATE_DEFAULT};
+	private IResourceCharsetDetector resourceCharsetDetector;
+
+	public int describe(InputStream contents, IContentDescription description) throws IOException {
+		int result = IContentDescriber.INDETERMINATE;
+
+		calculateSupportedOptions(contents, description);
+
+		return result;
+	}
+
+	public int describe(Reader contents, IContentDescription description) throws IOException {
+		int result = IContentDescriber.INDETERMINATE;
+
+		calculateSupportedOptions(contents, description);
+
+		return result;
+	}
+
+	public QualifiedName[] getSupportedOptions() {
+
+		return SUPPORTED_OPTIONS;
+	}
+
+	private void calculateSupportedOptions(InputStream contents, IContentDescription description) throws IOException {
+		if (isRelevent(description)) {
+			IResourceCharsetDetector detector = getDetector();
+			detector.set(contents);
+			handleCalculations(description, detector);
+		}
+	}
+
+	/**
+	 * @param contents
+	 * @param description
+	 * @throws IOException
+	 */
+	private void calculateSupportedOptions(Reader contents, IContentDescription description) throws IOException {
+		if (isRelevent(description)) {
+			IResourceCharsetDetector detector = getDetector();
+			detector.set(contents);
+			handleCalculations(description, detector);
+		}
+	}
 
 	// same rules as for XML
-	protected IResourceCharsetDetector getDetector() {
-		return new XMLResourceEncodingDetector();
+	private IResourceCharsetDetector getDetector() {
+		if (resourceCharsetDetector == null) {
+			resourceCharsetDetector = new XMLResourceEncodingDetector();
+		}
+		return resourceCharsetDetector;
+	}
+
+	/**
+	 * @param description
+	 * @param detector
+	 * @throws IOException
+	 */
+	private void handleCalculations(IContentDescription description, IResourceCharsetDetector detector) throws IOException {
+		// note: if we're asked for one, we set them all. I need to be sure if
+		// called
+		// mulitiple times (one for each, say) that we don't waste time
+		// processing same
+		// content again.
+		EncodingMemento encodingMemento = detector.getEncodingMemento();
+		// TODO: I need to verify to see if this BOM work is always done
+		// by text type.
+		Object detectedByteOrderMark = encodingMemento.getUnicodeBOM();
+		if (detectedByteOrderMark != null) {
+			Object existingByteOrderMark = description.getProperty(IContentDescription.BYTE_ORDER_MARK);
+			// not sure why would ever be different, so if is different, may
+			// need to "push" up into base.
+			if (!detectedByteOrderMark.equals(existingByteOrderMark))
+				description.setProperty(IContentDescription.BYTE_ORDER_MARK, detectedByteOrderMark);
+		}
+
+
+		if (!encodingMemento.isValid()) {
+			// note: after setting here, its the mere presence of
+			// IContentDescriptionExtended.UNSUPPORTED_CHARSET
+			// in the resource's description that can be used to determine if
+			// invalid
+			// in those cases, the "detected" property contains an
+			// "appropriate default" to use.
+			description.setProperty(IContentDescriptionExtended.UNSUPPORTED_CHARSET, encodingMemento.getInvalidEncoding());
+			description.setProperty(IContentDescriptionExtended.APPROPRIATE_DEFAULT, encodingMemento.getAppropriateDefault());
+		}
+
+		Object detectedCharset = encodingMemento.getDetectedCharsetName();
+		Object javaCharset = encodingMemento.getJavaCharsetName();
+
+		// we always include detected, if its different than java
+		handleDetectedSpecialCase(description, detectedCharset, javaCharset);
+
+		if (javaCharset != null) {
+			Object existingCharset = description.getProperty(IContentDescription.CHARSET);
+			if (javaCharset.equals(existingCharset)) {
+				handleDetectedSpecialCase(description, detectedCharset, javaCharset);
+			}
+			else {
+				// we may need to add what we found, but only need to add
+				// if different from default.the
+				Object defaultCharset = getDetector().getSpecDefaultEncoding();
+				if (defaultCharset != null) {
+					if (!defaultCharset.equals(javaCharset)) {
+						description.setProperty(IContentDescription.CHARSET, javaCharset);
+					}
+				}
+				else {
+					// assuming if there is no spec default, we always need to
+					// add, I'm assuming
+					description.setProperty(IContentDescription.CHARSET, javaCharset);
+				}
+			}
+		}
+
+	}
+
+	private void handleDetectedSpecialCase(IContentDescription description, Object detectedCharset, Object javaCharset) {
+		// since equal, we don't need to add, but if our detected version is
+		// different than
+		// javaCharset, then we should add it. This will happen, for example,
+		// if there's
+		// differences in case, or differences due to override properties
+		if (detectedCharset != null) {
+			// if (!detectedCharset.equals(javaCharset)) {
+			// description.setProperty(IContentDescriptionExtended.DETECTED_CHARSET,
+			// detectedCharset);
+			// }
+
+			// Once we detected a charset, we should set the property even
+			// though it's the same as javaCharset
+			// because there are clients that rely on this property to
+			// determine if the charset is actually detected in file or not.
+			description.setProperty(IContentDescriptionExtended.DETECTED_CHARSET, detectedCharset);
+		}
+	}
+
+	/**
+	 * @param description
+	 * @return
+	 */
+	private boolean isRelevent(IContentDescription description) {
+		boolean result = false;
+		if (description == null)
+			result = false;
+		else if (description.isRequested(IContentDescription.BYTE_ORDER_MARK))
+			result = true;
+		else if (description.isRequested(IContentDescription.CHARSET))
+			result = true;
+		else if (description.isRequested(IContentDescriptionExtended.APPROPRIATE_DEFAULT))
+			result = true;
+		else if (description.isRequested(IContentDescriptionExtended.DETECTED_CHARSET))
+			result = true;
+		else if (description.isRequested(IContentDescriptionExtended.UNSUPPORTED_CHARSET))
+			result = true;
+		return result;
 	}
 
 }
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contenttype/AbstractContentDescriber.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contenttype/AbstractContentDescriber.java
deleted file mode 100644
index fa42486..0000000
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contenttype/AbstractContentDescriber.java
+++ /dev/null
@@ -1,208 +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.html.core.internal.contenttype;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Reader;
-
-import org.eclipse.core.runtime.QualifiedName;
-import org.eclipse.core.runtime.content.IContentDescriber;
-import org.eclipse.core.runtime.content.IContentDescription;
-import org.eclipse.core.runtime.content.ITextContentDescriber;
-import org.eclipse.wst.sse.core.internal.encoding.EncodingMemento;
-import org.eclipse.wst.sse.core.internal.encoding.IContentDescriptionExtended;
-import org.eclipse.wst.sse.core.internal.encoding.IResourceCharsetDetector;
-
-public abstract class AbstractContentDescriber implements ITextContentDescriber {
-
-	private final static QualifiedName[] SUPPORTED_OPTIONS = {IContentDescription.CHARSET, IContentDescription.BYTE_ORDER_MARK, IContentDescriptionExtended.DETECTED_CHARSET, IContentDescriptionExtended.UNSUPPORTED_CHARSET, IContentDescriptionExtended.APPROPRIATE_DEFAULT};
-
-	private void calculateSupportedOptions(InputStream contents, IContentDescription description) throws IOException {
-		if (isRelevent(description)) {
-			IResourceCharsetDetector detector = getDetector();
-			detector.set(contents);
-			handleCalculations(description, detector);
-		}
-	}
-
-	/**
-	 * @param contents
-	 * @param description
-	 * @throws IOException
-	 */
-	private void calculateSupportedOptions(Reader contents, IContentDescription description) throws IOException {
-		if (isRelevent(description)) {
-			IResourceCharsetDetector detector = getDetector();
-			detector.set(contents);
-			handleCalculations(description, detector);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.content.IContentDescriber#describe(java.io.InputStream,
-	 *      org.eclipse.core.runtime.content.IContentDescription)
-	 */
-	public int describe(InputStream contents, IContentDescription description) throws IOException {
-		int result = IContentDescriber.VALID;
-
-		calculateSupportedOptions(contents, description);
-
-		// assume if we're called at all that we are valid (few types could be
-		// disproved, maybe XML -- or, maybe if exception occurs above?)
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.content.ITextContentDescriber#describe(java.io.Reader,
-	 *      org.eclipse.core.runtime.content.IContentDescription)
-	 */
-	public int describe(Reader contents, IContentDescription description) throws IOException {
-		int result = IContentDescriber.VALID;
-
-		calculateSupportedOptions(contents, description);
-
-		// assume if we're called at all that we are valid (few types could be
-		// disproved, maybe XML -- or, maybe if exception occurs above?)
-		return result;
-	}
-
-	protected abstract IResourceCharsetDetector getDetector();
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.content.IContentDescriber#getSupportedOptions()
-	 */
-	public QualifiedName[] getSupportedOptions() {
-
-		return SUPPORTED_OPTIONS;
-	}
-
-	/**
-	 * @param description
-	 * @param detector
-	 * @throws IOException
-	 */
-	protected void handleCalculations(IContentDescription description, IResourceCharsetDetector detector) throws IOException {
-		// note: if we're asked for one, we set them all. I need to be sure if
-		// called
-		// mulitiple times (one for each, say) that we don't waste time
-		// processing same
-		// content again.
-		EncodingMemento encodingMemento = detector.getEncodingMemento();
-		// TODO: I need to verify to see if this BOM work is always done
-		// by text type.
-		Object detectedByteOrderMark = encodingMemento.getUnicodeBOM();
-		if (detectedByteOrderMark != null) {
-			Object existingByteOrderMark = description.getProperty(IContentDescription.BYTE_ORDER_MARK);
-			// not sure why would ever be different, so if is different, may
-			// need to "push" up into base.
-			if (!detectedByteOrderMark.equals(existingByteOrderMark))
-				description.setProperty(IContentDescription.BYTE_ORDER_MARK, detectedByteOrderMark);
-		}
-
-
-		if (!encodingMemento.isValid()) {
-			// note: after setting here, its the mere presence of
-			// IContentDescriptionExtended.UNSUPPORTED_CHARSET
-			// in the resource's description that can be used to determine if
-			// invalid
-			// in those cases, the "detected" property contains an
-			// "appropriate default" to use.
-			description.setProperty(IContentDescriptionExtended.UNSUPPORTED_CHARSET, encodingMemento.getInvalidEncoding());
-			description.setProperty(IContentDescriptionExtended.APPROPRIATE_DEFAULT, encodingMemento.getAppropriateDefault());
-		}
-
-		Object detectedCharset = encodingMemento.getDetectedCharsetName();
-		Object javaCharset = encodingMemento.getJavaCharsetName();
-
-		// we always include detected, if its different than java
-		handleDetectedSpecialCase(description, detectedCharset, javaCharset);
-
-		if (javaCharset != null) {
-			Object existingCharset = description.getProperty(IContentDescription.CHARSET);
-			if (javaCharset.equals(existingCharset)) {
-				handleDetectedSpecialCase(description, detectedCharset, javaCharset);
-			} else {
-				// we may need to add what we found, but only need to add
-				// if different from default.the
-				Object defaultCharset = getDetector().getSpecDefaultEncoding();
-				if (defaultCharset != null) {
-					if (!defaultCharset.equals(javaCharset)) {
-						description.setProperty(IContentDescription.CHARSET, javaCharset);
-					}
-				} else {
-					// assuming if there is no spec default, we always need to
-					// add, I'm assuming
-					description.setProperty(IContentDescription.CHARSET, javaCharset);
-				}
-			}
-		}
-
-		// avoid adding anything if not absolutly needed, since always
-		// "cached" per session
-		//description.setProperty(IContentDescriptionExtended.ENCODING_MEMENTO,
-		// encodingMemento);
-	}
-
-	private void handleDetectedSpecialCase(IContentDescription description, Object detectedCharset, Object javaCharset) {
-		// since equal, we don't need to add, but if our detected version is
-		// different than
-		// javaCharset, then we should add it. This will happen, for example,
-		// if there's
-		// differences in case, or differences due to override properties
-		if (detectedCharset != null) {
-			//			if (!detectedCharset.equals(javaCharset)) {
-			//				description.setProperty(IContentDescriptionExtended.DETECTED_CHARSET,
-			// detectedCharset);
-			//			}
-
-			// Once we detected a charset, we should set the property even
-			// though it's the same as javaCharset
-			// because there are clients that rely on this property to
-			// determine if the charset is actually detected in file or not.
-			description.setProperty(IContentDescriptionExtended.DETECTED_CHARSET, detectedCharset);
-		}
-	}
-
-	/**
-	 * @param description
-	 * @return
-	 */
-	private boolean isRelevent(IContentDescription description) {
-		boolean result = false;
-		if (description == null)
-			result = false;
-		else if (description.isRequested(IContentDescription.BYTE_ORDER_MARK))
-			result = true;
-		else if (description.isRequested(IContentDescription.CHARSET))
-			result = true;
-		else if (description.isRequested(IContentDescriptionExtended.APPROPRIATE_DEFAULT))
-			result = true;
-		else if (description.isRequested(IContentDescriptionExtended.DETECTED_CHARSET))
-			result = true;
-		else if (description.isRequested(IContentDescriptionExtended.UNSUPPORTED_CHARSET))
-			result = true;
-		//		else if
-		// (description.isRequested(IContentDescriptionExtended.ENCODING_MEMENTO))
-		//			result = true;
-		return result;
-	}
-
-
-}
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contenttype/ContentDescriberForHTML.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contenttype/ContentDescriberForHTML.java
index b2d8352..b1c5906 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contenttype/ContentDescriberForHTML.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contenttype/ContentDescriberForHTML.java
@@ -10,15 +10,188 @@
  *******************************************************************************/
 package org.eclipse.wst.html.core.internal.contenttype;
 
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Reader;
+
+import org.eclipse.core.runtime.QualifiedName;
+import org.eclipse.core.runtime.content.IContentDescriber;
+import org.eclipse.core.runtime.content.IContentDescription;
 import org.eclipse.core.runtime.content.ITextContentDescriber;
+import org.eclipse.wst.sse.core.internal.encoding.EncodingMemento;
+import org.eclipse.wst.sse.core.internal.encoding.IContentDescriptionExtended;
 import org.eclipse.wst.sse.core.internal.encoding.IResourceCharsetDetector;
 
 
-public class ContentDescriberForHTML extends AbstractContentDescriber implements ITextContentDescriber {
+public final class ContentDescriberForHTML implements ITextContentDescriber {
+
+	final private static QualifiedName[] SUPPORTED_OPTIONS = {IContentDescription.CHARSET, IContentDescription.BYTE_ORDER_MARK, IContentDescriptionExtended.DETECTED_CHARSET, IContentDescriptionExtended.UNSUPPORTED_CHARSET, IContentDescriptionExtended.APPROPRIATE_DEFAULT};
+	private IResourceCharsetDetector resourceCharsetDetector;
+
+	public int describe(InputStream contents, IContentDescription description) throws IOException {
+		int result = IContentDescriber.VALID;
+
+		calculateSupportedOptions(contents, description);
+
+		// assume if we're called at all that we are valid (few types could be
+		// disproved, maybe XML -- or, maybe if exception occurs above?)
+		return result;
+	}
+
+	public int describe(Reader contents, IContentDescription description) throws IOException {
+		int result = IContentDescriber.VALID;
+
+		calculateSupportedOptions(contents, description);
+
+		// assume if we're called at all that we are valid (few types could be
+		// disproved, maybe XML -- or, maybe if exception occurs above?)
+		return result;
+	}
+
+	public QualifiedName[] getSupportedOptions() {
+
+		return SUPPORTED_OPTIONS;
+	}
+
+	private void calculateSupportedOptions(InputStream contents, IContentDescription description) throws IOException {
+		if (isRelevent(description)) {
+			IResourceCharsetDetector detector = getDetector();
+			detector.set(contents);
+			handleCalculations(description, detector);
+		}
+	}
+
+	/**
+	 * @param contents
+	 * @param description
+	 * @throws IOException
+	 */
+	private void calculateSupportedOptions(Reader contents, IContentDescription description) throws IOException {
+		if (isRelevent(description)) {
+			IResourceCharsetDetector detector = getDetector();
+			detector.set(contents);
+			handleCalculations(description, detector);
+		}
+	}
+
+	private IResourceCharsetDetector getDetector() {
+		if (resourceCharsetDetector == null) {
+			resourceCharsetDetector = new HTMLResourceEncodingDetector();
+		}
+		return resourceCharsetDetector;
+	}
+
+	/**
+	 * @param description
+	 * @param detector
+	 * @throws IOException
+	 */
+	private void handleCalculations(IContentDescription description, IResourceCharsetDetector detector) throws IOException {
+		// note: if we're asked for one, we set them all. I need to be sure if
+		// called
+		// mulitiple times (one for each, say) that we don't waste time
+		// processing same
+		// content again.
+		EncodingMemento encodingMemento = detector.getEncodingMemento();
+		// TODO: I need to verify to see if this BOM work is always done
+		// by text type.
+		Object detectedByteOrderMark = encodingMemento.getUnicodeBOM();
+		if (detectedByteOrderMark != null) {
+			Object existingByteOrderMark = description.getProperty(IContentDescription.BYTE_ORDER_MARK);
+			// not sure why would ever be different, so if is different, may
+			// need to "push" up into base.
+			if (!detectedByteOrderMark.equals(existingByteOrderMark))
+				description.setProperty(IContentDescription.BYTE_ORDER_MARK, detectedByteOrderMark);
+		}
 
 
-	protected IResourceCharsetDetector getDetector() {
-		return new HTMLResourceEncodingDetector();
+		if (!encodingMemento.isValid()) {
+			// note: after setting here, its the mere presence of
+			// IContentDescriptionExtended.UNSUPPORTED_CHARSET
+			// in the resource's description that can be used to determine if
+			// invalid
+			// in those cases, the "detected" property contains an
+			// "appropriate default" to use.
+			description.setProperty(IContentDescriptionExtended.UNSUPPORTED_CHARSET, encodingMemento.getInvalidEncoding());
+			description.setProperty(IContentDescriptionExtended.APPROPRIATE_DEFAULT, encodingMemento.getAppropriateDefault());
+		}
+
+		Object detectedCharset = encodingMemento.getDetectedCharsetName();
+		Object javaCharset = encodingMemento.getJavaCharsetName();
+
+		// we always include detected, if its different than java
+		handleDetectedSpecialCase(description, detectedCharset, javaCharset);
+
+		if (javaCharset != null) {
+			Object existingCharset = description.getProperty(IContentDescription.CHARSET);
+			if (javaCharset.equals(existingCharset)) {
+				handleDetectedSpecialCase(description, detectedCharset, javaCharset);
+			}
+			else {
+				// we may need to add what we found, but only need to add
+				// if different from default.the
+				Object defaultCharset = getDetector().getSpecDefaultEncoding();
+				if (defaultCharset != null) {
+					if (!defaultCharset.equals(javaCharset)) {
+						description.setProperty(IContentDescription.CHARSET, javaCharset);
+					}
+				}
+				else {
+					// assuming if there is no spec default, we always need to
+					// add, I'm assuming
+					description.setProperty(IContentDescription.CHARSET, javaCharset);
+				}
+			}
+		}
+
+		// avoid adding anything if not absolutly needed, since always
+		// "cached" per session
+		// description.setProperty(IContentDescriptionExtended.ENCODING_MEMENTO,
+		// encodingMemento);
+	}
+
+	private void handleDetectedSpecialCase(IContentDescription description, Object detectedCharset, Object javaCharset) {
+		// since equal, we don't need to add, but if our detected version is
+		// different than
+		// javaCharset, then we should add it. This will happen, for example,
+		// if there's
+		// differences in case, or differences due to override properties
+		if (detectedCharset != null) {
+			// if (!detectedCharset.equals(javaCharset)) {
+			// description.setProperty(IContentDescriptionExtended.DETECTED_CHARSET,
+			// detectedCharset);
+			// }
+
+			// Once we detected a charset, we should set the property even
+			// though it's the same as javaCharset
+			// because there are clients that rely on this property to
+			// determine if the charset is actually detected in file or not.
+			description.setProperty(IContentDescriptionExtended.DETECTED_CHARSET, detectedCharset);
+		}
+	}
+
+	/**
+	 * @param description
+	 * @return
+	 */
+	private boolean isRelevent(IContentDescription description) {
+		boolean result = false;
+		if (description == null)
+			result = false;
+		else if (description.isRequested(IContentDescription.BYTE_ORDER_MARK))
+			result = true;
+		else if (description.isRequested(IContentDescription.CHARSET))
+			result = true;
+		else if (description.isRequested(IContentDescriptionExtended.APPROPRIATE_DEFAULT))
+			result = true;
+		else if (description.isRequested(IContentDescriptionExtended.DETECTED_CHARSET))
+			result = true;
+		else if (description.isRequested(IContentDescriptionExtended.UNSUPPORTED_CHARSET))
+			result = true;
+		// else if
+		// (description.isRequested(IContentDescriptionExtended.ENCODING_MEMENTO))
+		// result = true;
+		return result;
 	}
 
 }
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contenttype/HTMLHeadTokenizer.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contenttype/HTMLHeadTokenizer.java
index a577685..dc68f67 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contenttype/HTMLHeadTokenizer.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/contenttype/HTMLHeadTokenizer.java
@@ -118,7 +118,7 @@
 
 
 	private boolean hasMore = true;
-	private final static int MAX_TO_SCAN = 1000;
+	private final static int MAX_TO_SCAN = 8000;
 	StringBuffer string = new StringBuffer();
 	// state stack for easier state handling
 	private IntStack fStateStack = new IntStack();
diff --git a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/CSSHeadTokenizer/CSSHeadTokenizer.jFlex b/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/CSSHeadTokenizer/CSSHeadTokenizer.jFlex
index 00c56b7b..96fe58a 100644
--- a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/CSSHeadTokenizer/CSSHeadTokenizer.jFlex
+++ b/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/CSSHeadTokenizer/CSSHeadTokenizer.jFlex
@@ -26,7 +26,7 @@
 
 
 	private boolean hasMore = true;
-	private final static int MAX_TO_SCAN = 1000;
+	private final static int MAX_TO_SCAN = 8000;
 	StringBuffer string = new StringBuffer();
 	// state stack for easier state handling
 	private IntStack fStateStack = new IntStack();
diff --git a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/HTMLHeadTokenizer/HTMLHeadTokenizer.jFlex b/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/HTMLHeadTokenizer/HTMLHeadTokenizer.jFlex
index eb10921..2bc923d 100644
--- a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/HTMLHeadTokenizer/HTMLHeadTokenizer.jFlex
+++ b/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/HTMLHeadTokenizer/HTMLHeadTokenizer.jFlex
@@ -26,7 +26,7 @@
 
 
 	private boolean hasMore = true;
-	private final static int MAX_TO_SCAN = 1000;
+	private final static int MAX_TO_SCAN = 8000;
 	StringBuffer string = new StringBuffer();
 	// state stack for easier state handling
 	private IntStack fStateStack = new IntStack();
diff --git a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/HTMLHeadTokenizer/HTMLHeadTokenizer.java b/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/HTMLHeadTokenizer/HTMLHeadTokenizer.java
index 4a78369..a1ec0f5 100644
--- a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/HTMLHeadTokenizer/HTMLHeadTokenizer.java
+++ b/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/HTMLHeadTokenizer/HTMLHeadTokenizer.java
@@ -145,7 +145,7 @@
 
 
 	private boolean hasMore = true;
-	private final static int MAX_TO_SCAN = 1000;
+	private final static int MAX_TO_SCAN = 8000;
 	StringBuffer string = new StringBuffer();
 	// state stack for easier state handling
 	private IntStack fStateStack = new IntStack();
diff --git a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/JSPHeadTokenizer/JSPHeadTokenizer.jFlex b/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/JSPHeadTokenizer/JSPHeadTokenizer.jFlex
index cd66ce2..83e726c 100644
--- a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/JSPHeadTokenizer/JSPHeadTokenizer.jFlex
+++ b/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/JSPHeadTokenizer/JSPHeadTokenizer.jFlex
@@ -29,7 +29,7 @@
 
 
 	private boolean hasMore = true;
-	private final static int MAX_TO_SCAN = 1000;
+	private final static int MAX_TO_SCAN = 8000;
 	StringBuffer string = new StringBuffer();
 	// state stack for easier state handling
 	private IntStack fStateStack = new IntStack();
diff --git a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/JSPHeadTokenizer/JSPHeadTokenizer.java b/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/JSPHeadTokenizer/JSPHeadTokenizer.java
index 27d3b07..5e27b01 100644
--- a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/JSPHeadTokenizer/JSPHeadTokenizer.java
+++ b/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/JSPHeadTokenizer/JSPHeadTokenizer.java
@@ -149,7 +149,7 @@
 
 
 	private boolean hasMore = true;
-	private final static int MAX_TO_SCAN = 1000;
+	private final static int MAX_TO_SCAN = 8000;
 	StringBuffer string = new StringBuffer();
 	// state stack for easier state handling
 	private IntStack fStateStack = new IntStack();
diff --git a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/XMLHeadTokenizer/XMLHeadTokenizer.jFlex b/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/XMLHeadTokenizer/XMLHeadTokenizer.jFlex
index a1944fb..a529f60 100644
--- a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/XMLHeadTokenizer/XMLHeadTokenizer.jFlex
+++ b/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/XMLHeadTokenizer/XMLHeadTokenizer.jFlex
@@ -27,7 +27,7 @@
 
 
 	private boolean hasMore = true;
-	private final static int MAX_TO_SCAN = 1000;
+	private final static int MAX_TO_SCAN = 8000;
 	StringBuffer string = new StringBuffer();
 	// state stack for easier state handling
 	private IntStack fStateStack = new IntStack();
diff --git a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/XMLHeadTokenizer/XMLHeadTokenizer.java b/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/XMLHeadTokenizer/XMLHeadTokenizer.java
index 196594c..af0375c 100644
--- a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/XMLHeadTokenizer/XMLHeadTokenizer.java
+++ b/bundles/org.eclipse.wst.sse.core/DevTimeSupport/HeadParsers/XMLHeadTokenizer/XMLHeadTokenizer.java
@@ -143,7 +143,7 @@
 
 
 	private boolean hasMore = true;
-	private final static int MAX_TO_SCAN = 1000;
+	private final static int MAX_TO_SCAN = 8000;
 	StringBuffer string = new StringBuffer();
 	// state stack for easier state handling
 	private IntStack fStateStack = new IntStack();
diff --git a/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/CodedIO.java b/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/CodedIO.java
index 02285ef..dc96e64 100644
--- a/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/CodedIO.java
+++ b/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/CodedIO.java
@@ -32,7 +32,7 @@
 
 	private final boolean DEBUG = false;
 	
-	public static final int MAX_BUF_SIZE = 1024 * 2;
+	public static final int MAX_BUF_SIZE = 1024 * 8;
 
 	public static final int MAX_MARK_SIZE = MAX_BUF_SIZE;
 
diff --git a/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/CodedReaderCreator.java b/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/CodedReaderCreator.java
index 86ad915..906d95e 100644
--- a/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/CodedReaderCreator.java
+++ b/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/CodedReaderCreator.java
@@ -105,7 +105,8 @@
 		// have been set, and no need to get again.
 		if (fEncodingMemento != null) {
 			result = fEncodingMemento;
-		} else {
+		}
+		else {
 			if (fClientSuppliedStream) {
 				try {
 					limitedStream.reset();
@@ -115,11 +116,13 @@
 						fEncodingMemento = createMemento(contentDescription);
 					}
 					result = fEncodingMemento;
-				} finally {
+				}
+				finally {
 					limitedStream.reset();
 				}
-			} else {
-				//throw new IllegalStateException("unexpected state:
+			}
+			else {
+				// throw new IllegalStateException("unexpected state:
 				// encodingMemento was null but no input stream supplied by
 				// client"); //$NON-NLS-1$
 				result = null;
@@ -157,7 +160,8 @@
 			// cost of sometimes returning null
 			if (fIFile.exists())
 				contentDescription = fIFile.getContentDescription();
-		} catch (CoreException e) {
+		}
+		catch (CoreException e) {
 			// Assume if core exception occurs, we can still try more
 			// expensive
 			// discovery options.
@@ -168,13 +172,15 @@
 			try {
 				contents = fIFile.getContents();
 				contentDescription = Platform.getContentTypeManager().getDescriptionFor(contents, fIFile.getName(), IContentDescription.ALL);
-			} catch (CoreException e1) {
+			}
+			catch (CoreException e1) {
 				// Assume if core exception occurs, we can't really do much
 				// with
 				// determining encoding, etc.
 				Logger.logException(e1);
 				throw e1;
-			} catch (IOException e2) {
+			}
+			catch (IOException e2) {
 				// We likely couldn't get the contents of the file, something
 				// is really wrong
 				Logger.logException(e2);
@@ -183,7 +189,8 @@
 			if (contents != null) {
 				try {
 					contents.close();
-				} catch (IOException e2) {
+				}
+				catch (IOException e2) {
 					Logger.logException(e2);
 				}
 			}
@@ -222,7 +229,8 @@
 					result = checkForEncodingInContents(resettableLimitedStream);
 				}
 
-			} else {
+			}
+			else {
 				// stream null, may name's not.
 				if (fFilename != null) {
 					// filename not null
@@ -233,7 +241,8 @@
 					}
 				}
 			}
-		} finally {
+		}
+		finally {
 			if (resettableLimitedStream != null) {
 				handleStreamClose(resettableLimitedStream);
 			}
@@ -268,7 +277,8 @@
 		// see ... TODO look up bug number
 		if (encodingMemento.isUnicodeStream()) {
 			streamToReturn.skip(2);
-		} else if (encodingMemento.isUTF83ByteBOMUsed()) {
+		}
+		else if (encodingMemento.isUTF83ByteBOMUsed()) {
 			streamToReturn.skip(3);
 		}
 		String charsetName = encodingMemento.getJavaCharsetName();
@@ -287,14 +297,16 @@
 		if (fEncodingRule == EncodingRule.IGNORE_CONVERSION_ERROR) {
 			charsetDecoder.onMalformedInput(CodingErrorAction.REPLACE);
 			charsetDecoder.onUnmappableCharacter(CodingErrorAction.REPLACE);
-		} else {
+		}
+		else {
 			charsetDecoder.onMalformedInput(CodingErrorAction.REPORT);
 			charsetDecoder.onUnmappableCharacter(CodingErrorAction.REPORT);
 		}
 		// more efficient to be buffered, and I know of no
 		// reason not to return
 		// that directly.
-		result = new BufferedReader(new InputStreamReader(streamToReturn, charsetDecoder));
+		result = new BufferedReader(new InputStreamReader(streamToReturn, charsetDecoder), CodedIO.MAX_BUF_SIZE);
+		result.mark(CodedIO.MAX_BUF_SIZE);
 		return result;
 	}
 
@@ -303,7 +315,8 @@
 		if (fEncodingMemento == null) {
 			if (fClientSuppliedStream) {
 				fEncodingMemento = findMementoFromStreamCase();
-			} else if (fIFile != null) {
+			}
+			else if (fIFile != null) {
 				fEncodingMemento = findMementoFromFileCase();
 			}
 		}
@@ -376,27 +389,33 @@
 		if (fIFile != null) {
 			InputStream inputStream = null;
 			try {
-				inputStream = fIFile.getContents();
-			} catch (CoreException e) {
+				// note we always get contents, even if out of synch
+				inputStream = fIFile.getContents(true);
+			}
+			catch (CoreException e) {
 				// SHOULD actually check for existence of
 				// fIStorage, but
 				// for now will just assume core exception
 				// means it
 				// doesn't exist on file system, yet.
+				// and we'll log, just in case its a noteable error
+				Logger.logException(e);
 				inputStream = new NullInputStream();
 			}
 			resettableStream = new BufferedInputStream(inputStream, CodedIO.MAX_BUF_SIZE);
-		} else {
+		}
+		else {
 			if (fInputStream != null) {
 				if (fInputStream.markSupported()) {
 					resettableStream = fInputStream;
-					//				try {
+					// try {
 					resettableStream.reset();
-					//					}
-					//					catch (IOException e) {
-					//						// assumed just hasn't been marked yet, so ignore
-					//					}
-				} else {
+					// }
+					// catch (IOException e) {
+					// // assumed just hasn't been marked yet, so ignore
+					// }
+				}
+				else {
 					resettableStream = new BufferedInputStream(fInputStream, CodedIO.MAX_BUF_SIZE);
 				}
 			}
@@ -415,25 +434,25 @@
 
 		EncodingMemento result = null;
 		String specDefault = null;
-		//		try {
-		//			specDefault = getEncodingDetector().getSpecDefaultEncoding();
-		//		}
-		//		catch (CoreException e) {
-		//			// If this exception occurs, assumes there is
-		//			// no specDefault
-		//		}
-		//		catch (IOException e) {
-		//			// If this exception occurs, assumes there is
-		//			// no specDefault
-		//		}
-		//		finally {
-		//			try {
-		//				handleStreamClose(fEncodingDetectorStream);
-		//			}
-		//			catch (IOException e1) {
-		//				// severe error, not much to do here
-		//			}
-		//		}
+		// try {
+		// specDefault = getEncodingDetector().getSpecDefaultEncoding();
+		// }
+		// catch (CoreException e) {
+		// // If this exception occurs, assumes there is
+		// // no specDefault
+		// }
+		// catch (IOException e) {
+		// // If this exception occurs, assumes there is
+		// // no specDefault
+		// }
+		// finally {
+		// try {
+		// handleStreamClose(fEncodingDetectorStream);
+		// }
+		// catch (IOException e1) {
+		// // severe error, not much to do here
+		// }
+		// }
 		// this logic should be moved to 'detection' if not already
 		String charset = NonContentBasedEncodingRules.useDefaultNameRules(specDefault);
 		Assert.isNotNull(charset, "post condition failed"); //$NON-NLS-1$
@@ -450,7 +469,8 @@
 		if (resettableInputStream != null) {
 			if (fClientSuppliedStream) {
 				resettableInputStream.reset();
-			} else {
+			}
+			else {
 
 				resettableInputStream.close();
 			}
@@ -461,7 +481,7 @@
 	// encoding for now. May improve the UI later by setting an informational
 	// message and/or disable the content properties encoding field.
 	// TODO: remake private else remove
-	 void migrateContentPropertiesEncoding(String encoding) throws CoreException {
+	void migrateContentPropertiesEncoding(String encoding) throws CoreException {
 		final IFile file = fIFile;
 		final String charset = encoding;
 		// TODO: externalize string later
@@ -470,7 +490,8 @@
 				if (file != null) {
 					try {
 						file.setCharset(charset, null);
-					} catch (CoreException e) {
+					}
+					catch (CoreException e) {
 						Logger.logException(e);
 					}
 				}
diff --git a/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/util/BufferedLimitedReader.java b/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/util/BufferedLimitedReader.java
new file mode 100644
index 0000000..f026bda
--- /dev/null
+++ b/bundles/org.eclipse.wst.sse.core/src-encoding/org/eclipse/wst/sse/core/internal/encoding/util/BufferedLimitedReader.java
@@ -0,0 +1,58 @@
+package org.eclipse.wst.sse.core.internal.encoding.util;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.Reader;
+
+/**
+ * This is a pretty limited implementation, sort of specific 
+ * to the way its used by tokenizers (JFlex). To really 
+ * be general purpose, would need more work. 
+ *
+ */
+
+
+public class BufferedLimitedReader extends BufferedReader {
+	private int limitedCount;
+	private int nRead;
+
+	public BufferedLimitedReader(Reader reader, int size) {
+		super(reader, size);
+		if (reader.markSupported()) {
+			try {
+				mark(size);
+			}
+			catch (IOException e) {
+				// impossible
+				e.printStackTrace();
+			}
+		}
+		limitedCount = size;
+	}
+
+	public int read() throws IOException {
+		int result = 0;
+		nRead++;
+		if (nRead > limitedCount) {
+			result = -1;
+		}
+		else {
+			result = super.read();
+		}
+		return result;
+
+	}
+
+	public int read(char cbuf[], int off, int len) throws IOException {
+		int result = 0;
+		if (nRead + len > limitedCount) {
+			result = -1;
+		}
+		else {
+			result = super.read(cbuf, off, len);
+			nRead = nRead + result;
+		}
+		return result;
+	}
+	
+}
diff --git a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/contenttype/ContentDescriberForXML.java b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/contenttype/ContentDescriberForXML.java
index 2659767..fdba1fb 100644
--- a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/contenttype/ContentDescriberForXML.java
+++ b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/contenttype/ContentDescriberForXML.java
@@ -25,10 +25,10 @@
 import org.eclipse.wst.sse.core.internal.encoding.IResourceCharsetDetector;
 
 
-public class ContentDescriberForXML implements ITextContentDescriber {
+public final class ContentDescriberForXML implements ITextContentDescriber {
 	private final static QualifiedName[] SUPPORTED_OPTIONS = {IContentDescription.CHARSET, IContentDescription.BYTE_ORDER_MARK, IContentDescriptionExtended.DETECTED_CHARSET, IContentDescriptionExtended.UNSUPPORTED_CHARSET, IContentDescriptionExtended.APPROPRIATE_DEFAULT};
 
-	protected IResourceCharsetDetector getDetector() {
+	private IResourceCharsetDetector getDetector() {
 		return new XMLResourceEncodingDetector();
 	}
 
@@ -140,7 +140,7 @@
 	 * @param detector
 	 * @throws IOException
 	 */
-	protected void handleCalculations(IContentDescription description, IResourceCharsetDetector detector) throws IOException {
+	private void handleCalculations(IContentDescription description, IResourceCharsetDetector detector) throws IOException {
 		// note: if we're asked for one, we set them all. I need to be sure if
 		// called
 		// mulitiple times (one for each, say) that we don't waste time
diff --git a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/contenttype/XMLDeclDetector.java b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/contenttype/XMLDeclDetector.java
index 5843f61..20ab286 100644
--- a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/contenttype/XMLDeclDetector.java
+++ b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/contenttype/XMLDeclDetector.java
@@ -22,8 +22,8 @@
 import org.eclipse.core.runtime.CoreException;
 
 public class XMLDeclDetector {
-	private static final int MAX_BUF_SIZE = 1024 * 2;
-	private static final int MAX_MARK_SIZE = 1024 * 2;
+	private static final int MAX_BUF_SIZE = 1024 * 8;
+	private static final int MAX_MARK_SIZE = 1024 * 8;
 	protected boolean fHeaderParsed;
 	private boolean fIsXML;
 	protected Reader fReader;
diff --git a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/contenttype/XMLHeadTokenizer.java b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/contenttype/XMLHeadTokenizer.java
index b42e3d8..2514222 100644
--- a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/contenttype/XMLHeadTokenizer.java
+++ b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/contenttype/XMLHeadTokenizer.java
@@ -127,7 +127,7 @@
 
 
 	private boolean hasMore = true;
-	private final static int MAX_TO_SCAN = 1000;
+	private final static int MAX_TO_SCAN = 8000;
 	StringBuffer string = new StringBuffer();
 	// state stack for easier state handling
 	private IntStack fStateStack = new IntStack();