Added test coverage for Hover and Hyperlink.
diff --git a/jsf/tests/org.eclipse.jst.jsf.contentassist.tests/src/org/eclipse/jst/jsf/contentassist/tests/BaseTestClass.java b/jsf/tests/org.eclipse.jst.jsf.contentassist.tests/src/org/eclipse/jst/jsf/contentassist/tests/BaseTestClass.java
index a5d06b6..edba123 100644
--- a/jsf/tests/org.eclipse.jst.jsf.contentassist.tests/src/org/eclipse/jst/jsf/contentassist/tests/BaseTestClass.java
+++ b/jsf/tests/org.eclipse.jst.jsf.contentassist.tests/src/org/eclipse/jst/jsf/contentassist/tests/BaseTestClass.java
@@ -7,109 +7,18 @@
 
 import org.eclipse.core.resources.IFile;
 import org.eclipse.jface.text.contentassist.ICompletionProposal;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IDOMContextResolver;
 import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
 import org.eclipse.jst.jsf.context.resolver.structureddocument.internal.ITextRegionContextResolver;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
 import org.eclipse.jst.jsf.core.internal.contentassist.el.ContentAssistParser;
 import org.eclipse.jst.jsf.core.internal.contentassist.el.ContentAssistStrategy;
-import org.eclipse.jst.jsf.designtime.resolver.ISymbolContextResolver;
-import org.eclipse.jst.jsf.designtime.resolver.StructuredDocumentSymbolResolverFactory;
-import org.eclipse.jst.jsp.core.internal.domdocument.DOMModelForJSP;
+import org.eclipse.jst.jsf.core.tests.util.JSFCoreUtilHelper;
+import org.eclipse.jst.jsf.core.tests.util.JSFCoreUtilHelper.ContextWrapper;
 import org.eclipse.jst.jsp.core.internal.regions.DOMJSPRegionContexts;
-import org.eclipse.wst.sse.core.StructuredModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Node;
 
 public class BaseTestClass extends TestCase {
 
-	protected static class ContextWrapper {
-		private final IStructuredDocumentContext _context;
-		private final IStructuredModel _model;
 
-		ContextWrapper(final IStructuredDocumentContext context,
-				final IStructuredModel model) {
-			super();
-			_context = context;
-			_model = model;
-		}
 
-		IStructuredDocumentContext getContext() {
-			return _context;
-		}
-
-		IStructuredModel getModel() {
-			return _model;
-		}
-
-		void dispose() {
-			_model.releaseFromRead();
-		}
-	}
-
-	/**
-	 * @param jspFile
-	 * @param offset
-	 * @return the context wrapper. Caller must ensure dispose is called so
-	 *         model is released when finished.
-	 * @throws Exception
-	 */
-	protected final ContextWrapper getDocumentContext(final IFile jspFile,
-			final int offset) throws Exception {
-		final IModelManager modelManager = StructuredModelManager
-				.getModelManager();
-
-		IStructuredModel model = null;
-
-		model = modelManager.getModelForRead(jspFile);
-		assertTrue(model instanceof DOMModelForJSP);
-		final IStructuredDocumentContext context = IStructuredDocumentContextFactory.INSTANCE
-				.getContext(model.getStructuredDocument(), offset);
-		return new ContextWrapper(context, model);
-	}
-
-	protected final void assertELSanity(final IFile jspFile, final int offset,
-			final String attrName, final String elExpr) throws Exception {
-		ContextWrapper wrapper = null;
-		try {
-			wrapper = getDocumentContext(jspFile, offset);
-			final IStructuredDocumentContext context = wrapper.getContext();
-			final IDOMContextResolver resolver = IStructuredDocumentContextResolverFactory.INSTANCE
-					.getDOMContextResolver(context);
-			final Node node = resolver.getNode();
-			// bJSFTestUtil.getIndexedRegion((IStructuredDocument)
-			// context.getStructuredDocument(), 589);
-			assertTrue(node instanceof Attr);
-			assertEquals(attrName, ((Attr) node).getNodeName());
-			assertEquals(elExpr, ((Attr) node).getNodeValue());
-		} finally {
-			if (wrapper != null) {
-				wrapper.dispose();
-			}
-		}
-	}
-
-	protected final void assertELVariableSanity(final IFile jspFile,
-			final String varName) throws Exception {
-		ContextWrapper contextWrapper = null;
-
-		try {
-			contextWrapper = getDocumentContext(jspFile, -1);
-			final ISymbolContextResolver symbolResolver = StructuredDocumentSymbolResolverFactory
-					.getInstance().getSymbolContextResolver(
-							contextWrapper.getContext());
-			final ISymbol bundleVar = symbolResolver.getVariable(varName);
-			assertNotNull(bundleVar);
-		} finally {
-			if (contextWrapper != null) {
-				contextWrapper.dispose();
-			}
-		}
-	}
 
 	/**
 	 * Uses the docOffset to find the EL text used to generate the proposals on.
@@ -124,7 +33,7 @@
 		ContextWrapper wrapper = null;
 
 		try {
-			wrapper = getDocumentContext(jspFile, docOffset);
+			wrapper = JSFCoreUtilHelper.getDocumentContext(jspFile, docOffset);
 
 			final ITextRegionContextResolver resolver = IStructuredDocumentContextResolverFactory.INSTANCE
 					.getTextRegionResolver(wrapper.getContext());
@@ -159,7 +68,7 @@
 		ContextWrapper wrapper = null;
 
 		try {
-			wrapper = getDocumentContext(jspFile, docOffset);
+			wrapper = JSFCoreUtilHelper.getDocumentContext(jspFile, docOffset);
 
 
 			final ContentAssistStrategy strategy = ContentAssistParser
@@ -179,9 +88,9 @@
 		ContextWrapper wrapper = null;
 
 		try {
-			wrapper = getDocumentContext(jspFile, offset);
+			wrapper = JSFCoreUtilHelper.getDocumentContext(jspFile, offset);
 
-			applyMe.apply(getDocumentContext(jspFile, offset).getContext()
+			applyMe.apply(JSFCoreUtilHelper.getDocumentContext(jspFile, offset).getContext()
 					.getStructuredDocument());
 
 			final ITextRegionContextResolver resolver = IStructuredDocumentContextResolverFactory.INSTANCE
diff --git a/jsf/tests/org.eclipse.jst.jsf.contentassist.tests/src/org/eclipse/jst/jsf/contentassist/tests/TestContentAssistParser.java b/jsf/tests/org.eclipse.jst.jsf.contentassist.tests/src/org/eclipse/jst/jsf/contentassist/tests/TestContentAssistParser.java
index 03cd4f1..b6e1562 100644
--- a/jsf/tests/org.eclipse.jst.jsf.contentassist.tests/src/org/eclipse/jst/jsf/contentassist/tests/TestContentAssistParser.java
+++ b/jsf/tests/org.eclipse.jst.jsf.contentassist.tests/src/org/eclipse/jst/jsf/contentassist/tests/TestContentAssistParser.java
@@ -9,6 +9,7 @@
 import org.eclipse.jst.jsf.core.IJSFCoreConstants;
 import org.eclipse.jst.jsf.core.internal.contentassist.el.ContentAssistParser;
 import org.eclipse.jst.jsf.core.internal.contentassist.el.SymbolInfo;
+import org.eclipse.jst.jsf.core.tests.util.JSFCoreUtilHelper;
 import org.eclipse.jst.jsf.core.tests.util.JSFFacetedTestEnvironment;
 import org.eclipse.jst.jsf.test.util.JDTTestEnvironment;
 import org.eclipse.jst.jsf.test.util.JSFTestUtil;
@@ -58,14 +59,14 @@
 
 	public void testSanity() throws Exception
 	{
-		assertELSanity(_jspFile, 518, "value", "#{}");
-		assertELSanity(_jspFile, 547, "value", "#{   }");
-		assertELSanity(_jspFile, 579, "value", "#{myBean}");
-		assertELSanity(_jspFile, 614, "value", "#{myBean.property}");
-		assertELSanity(_jspFile, 658, "value", "#{paramValues.foo}");
-		assertELSanity(_jspFile, 706, "action", "#{myBean.actionMethod}");
+		JSFCoreUtilHelper.assertELSanity(_jspFile, 518, "value", "#{}");
+		JSFCoreUtilHelper.assertELSanity(_jspFile, 547, "value", "#{   }");
+		JSFCoreUtilHelper.assertELSanity(_jspFile, 579, "value", "#{myBean}");
+		JSFCoreUtilHelper.assertELSanity(_jspFile, 614, "value", "#{myBean.property}");
+		JSFCoreUtilHelper.assertELSanity(_jspFile, 658, "value", "#{paramValues.foo}");
+		JSFCoreUtilHelper.assertELSanity(_jspFile, 706, "action", "#{myBean.actionMethod}");
 
-		assertELVariableSanity(_jspFile, "myBean");
+		JSFCoreUtilHelper.assertELVariableSanity(_jspFile, "myBean");
 	}
 
 
@@ -75,13 +76,13 @@
 
 	public void testGetSymbolInfo() throws Exception
 	{
-		assertNull(ContentAssistParser.getSymbolInfo(getDocumentContext(_jspFile, 518).getContext(), 1, null));
-		assertNull(ContentAssistParser.getSymbolInfo(getDocumentContext(_jspFile, 518).getContext(), 1, ""));
-		assertNull(ContentAssistParser.getSymbolInfo(getDocumentContext(_jspFile, 547).getContext(), 1, "   "));
+		assertNull(ContentAssistParser.getSymbolInfo(JSFCoreUtilHelper.getDocumentContext(_jspFile, 518).getContext(), 1, null));
+		assertNull(ContentAssistParser.getSymbolInfo(JSFCoreUtilHelper.getDocumentContext(_jspFile, 518).getContext(), 1, ""));
+		assertNull(ContentAssistParser.getSymbolInfo(JSFCoreUtilHelper.getDocumentContext(_jspFile, 547).getContext(), 1, "   "));
 
 		// variable test
 		SymbolInfo symbolInfo =
-			ContentAssistParser.getSymbolInfo(getDocumentContext(_jspFile, 579).getContext(), 1, "myBean");
+			ContentAssistParser.getSymbolInfo(JSFCoreUtilHelper.getDocumentContext(_jspFile, 579).getContext(), 1, "myBean");
 		assertNotNull(symbolInfo);
 		assertEquals("myBean", symbolInfo.getSymbol().getName());
 		assertTrue(symbolInfo.getSymbol() instanceof IBeanInstanceSymbol);
@@ -90,7 +91,7 @@
 
 		// property test
 		symbolInfo =
-			ContentAssistParser.getSymbolInfo(getDocumentContext(_jspFile, 614).getContext(), 8, "myBean.property");
+			ContentAssistParser.getSymbolInfo(JSFCoreUtilHelper.getDocumentContext(_jspFile, 614).getContext(), 8, "myBean.property");
 		assertNotNull(symbolInfo);
 		assertEquals("property", symbolInfo.getSymbol().getName());
 		assertTrue(symbolInfo.getSymbol() instanceof IBeanPropertySymbol);
@@ -98,7 +99,7 @@
 
 		// method test
 		symbolInfo =
-			ContentAssistParser.getSymbolInfo(getDocumentContext(_jspFile, 706).getContext(), 8, "myBean.actionMethod");
+			ContentAssistParser.getSymbolInfo(JSFCoreUtilHelper.getDocumentContext(_jspFile, 706).getContext(), 8, "myBean.actionMethod");
 		assertNotNull(symbolInfo);
 		assertEquals("actionMethod", symbolInfo.getSymbol().getName());
 		assertTrue(symbolInfo.getSymbol() instanceof IBeanMethodSymbol);
diff --git a/jsf/tests/org.eclipse.jst.jsf.contentassist.tests/src/org/eclipse/jst/jsf/contentassist/tests/TestFunctionCompletionStrategy.java b/jsf/tests/org.eclipse.jst.jsf.contentassist.tests/src/org/eclipse/jst/jsf/contentassist/tests/TestFunctionCompletionStrategy.java
index 3f7b7b2..fc9677a 100644
--- a/jsf/tests/org.eclipse.jst.jsf.contentassist.tests/src/org/eclipse/jst/jsf/contentassist/tests/TestFunctionCompletionStrategy.java
+++ b/jsf/tests/org.eclipse.jst.jsf.contentassist.tests/src/org/eclipse/jst/jsf/contentassist/tests/TestFunctionCompletionStrategy.java
@@ -19,6 +19,7 @@
 import org.eclipse.jdt.core.JavaCore;
 import org.eclipse.jface.text.contentassist.ICompletionProposal;
 import org.eclipse.jst.jsf.core.IJSFCoreConstants;
+import org.eclipse.jst.jsf.core.tests.util.JSFCoreUtilHelper;
 import org.eclipse.jst.jsf.core.tests.util.JSFFacetedTestEnvironment;
 import org.eclipse.jst.jsf.test.util.JDTTestEnvironment;
 import org.eclipse.jst.jsf.test.util.JSFTestUtil;
@@ -76,11 +77,11 @@
      */
     public void testSanity() throws Exception
     {
-		assertELSanity(_jspFile, 614, "value", "#{myBean.property}");
-		assertELSanity(_jspFile, 658, "value", "#{paramValues.foo}");
-		assertELSanity(_jspFile, 706, "action", "#{myBean.actionMethod}");
+    	JSFCoreUtilHelper.assertELSanity(_jspFile, 614, "value", "#{myBean.property}");
+    	JSFCoreUtilHelper.assertELSanity(_jspFile, 658, "value", "#{paramValues.foo}");
+    	JSFCoreUtilHelper.assertELSanity(_jspFile, 706, "action", "#{myBean.actionMethod}");
 
-		assertELVariableSanity(_jspFile, "myBean");
+    	JSFCoreUtilHelper.assertELVariableSanity(_jspFile, "myBean");
     }
 
     public void testFunctionCompletionStrategy() throws Exception
diff --git a/jsf/tests/org.eclipse.jst.jsf.contentassist.tests/src/org/eclipse/jst/jsf/contentassist/tests/TestIdCompletionStrategy.java b/jsf/tests/org.eclipse.jst.jsf.contentassist.tests/src/org/eclipse/jst/jsf/contentassist/tests/TestIdCompletionStrategy.java
index b73ee12..282290c 100644
--- a/jsf/tests/org.eclipse.jst.jsf.contentassist.tests/src/org/eclipse/jst/jsf/contentassist/tests/TestIdCompletionStrategy.java
+++ b/jsf/tests/org.eclipse.jst.jsf.contentassist.tests/src/org/eclipse/jst/jsf/contentassist/tests/TestIdCompletionStrategy.java
@@ -8,6 +8,7 @@
 import org.eclipse.jdt.core.IType;
 import org.eclipse.jdt.core.JavaCore;
 import org.eclipse.jst.jsf.core.IJSFCoreConstants;
+import org.eclipse.jst.jsf.core.tests.util.JSFCoreUtilHelper;
 import org.eclipse.jst.jsf.core.tests.util.JSFFacetedTestEnvironment;
 import org.eclipse.jst.jsf.test.util.JDTTestEnvironment;
 import org.eclipse.jst.jsf.test.util.JSFTestUtil;
@@ -77,11 +78,11 @@
 
 	public void testSanity() throws Exception
 	{
-		assertELSanity(_jspFile, 518, "value", "#{}");
-		assertELSanity(_jspFile, 547, "value", "#{   }");
-		assertELSanity(_jspFile, 579, "value", "#{myBean}");
-		assertELSanity(_jspFile, 614, "value", "#{myBean.property}");
-		assertELSanity(_jspFile, 658, "value", "#{paramValues.foo}");
+		JSFCoreUtilHelper.assertELSanity(_jspFile, 518, "value", "#{}");
+		JSFCoreUtilHelper.assertELSanity(_jspFile, 547, "value", "#{   }");
+		JSFCoreUtilHelper.assertELSanity(_jspFile, 579, "value", "#{myBean}");
+		JSFCoreUtilHelper.assertELSanity(_jspFile, 614, "value", "#{myBean.property}");
+		JSFCoreUtilHelper.assertELSanity(_jspFile, 658, "value", "#{paramValues.foo}");
 
 		assertEquals(12, DISPLAY_NAMES.size());
 	}
diff --git a/jsf/tests/org.eclipse.jst.jsf.contentassist.tests/src/org/eclipse/jst/jsf/contentassist/tests/Test_bug_149224.java b/jsf/tests/org.eclipse.jst.jsf.contentassist.tests/src/org/eclipse/jst/jsf/contentassist/tests/Test_bug_149224.java
index 4216c18..07f65cc 100644
--- a/jsf/tests/org.eclipse.jst.jsf.contentassist.tests/src/org/eclipse/jst/jsf/contentassist/tests/Test_bug_149224.java
+++ b/jsf/tests/org.eclipse.jst.jsf.contentassist.tests/src/org/eclipse/jst/jsf/contentassist/tests/Test_bug_149224.java
@@ -16,7 +16,9 @@
 import org.eclipse.core.resources.IFile;
 import org.eclipse.jface.text.contentassist.ICompletionProposal;
 import org.eclipse.jst.jsf.core.IJSFCoreConstants;
+import org.eclipse.jst.jsf.core.tests.util.JSFCoreUtilHelper;
 import org.eclipse.jst.jsf.core.tests.util.JSFFacetedTestEnvironment;
+import org.eclipse.jst.jsf.core.tests.util.JSFCoreUtilHelper.ContextWrapper;
 import org.eclipse.jst.jsf.test.util.JDTTestEnvironment;
 import org.eclipse.jst.jsf.test.util.JSFTestUtil;
 import org.eclipse.jst.jsf.test.util.TestFileResource;
@@ -79,9 +81,9 @@
 
         try
         {
-        	assertELSanity(_jspFile, 589, "value", "#{bundle1.}");
-        	assertELSanity(_jspFile, 630, "value", "#{bundle1.x}");
-            assertELVariableSanity(_jspFile, "bundle1");
+        	JSFCoreUtilHelper.assertELSanity(_jspFile, 589, "value", "#{bundle1.}");
+        	JSFCoreUtilHelper.assertELSanity(_jspFile, 630, "value", "#{bundle1.x}");
+        	JSFCoreUtilHelper.assertELVariableSanity(_jspFile, "bundle1");
         }
         finally
         {
diff --git a/jsf/tests/org.eclipse.jst.jsf.contentassist.tests/src/org/eclipse/jst/jsf/contentassist/tests/Test_bug_149743.java b/jsf/tests/org.eclipse.jst.jsf.contentassist.tests/src/org/eclipse/jst/jsf/contentassist/tests/Test_bug_149743.java
index 40e145c..3d5c5d8 100644
--- a/jsf/tests/org.eclipse.jst.jsf.contentassist.tests/src/org/eclipse/jst/jsf/contentassist/tests/Test_bug_149743.java
+++ b/jsf/tests/org.eclipse.jst.jsf.contentassist.tests/src/org/eclipse/jst/jsf/contentassist/tests/Test_bug_149743.java
@@ -18,6 +18,7 @@
 import org.eclipse.core.resources.IFile;
 import org.eclipse.jface.text.contentassist.ICompletionProposal;
 import org.eclipse.jst.jsf.core.IJSFCoreConstants;
+import org.eclipse.jst.jsf.core.tests.util.JSFCoreUtilHelper;
 import org.eclipse.jst.jsf.core.tests.util.JSFFacetedTestEnvironment;
 import org.eclipse.jst.jsf.test.util.JDTTestEnvironment;
 import org.eclipse.jst.jsf.test.util.JSFTestUtil;
@@ -71,8 +72,8 @@
      */
     public void testSanity() throws Exception
     {
-        assertELSanity(_jspFile, 529, "value" ,"#{myBean.property}");
-        assertELVariableSanity(_jspFile, "myBean");
+    	JSFCoreUtilHelper.assertELSanity(_jspFile, 529, "value" ,"#{myBean.property}");
+    	JSFCoreUtilHelper.assertELVariableSanity(_jspFile, "myBean");
     }
 
     /**
diff --git a/jsf/tests/org.eclipse.jst.jsf.core.tests/META-INF/MANIFEST.MF b/jsf/tests/org.eclipse.jst.jsf.core.tests/META-INF/MANIFEST.MF
index 05d2dcd..afabeb8 100644
--- a/jsf/tests/org.eclipse.jst.jsf.core.tests/META-INF/MANIFEST.MF
+++ b/jsf/tests/org.eclipse.jst.jsf.core.tests/META-INF/MANIFEST.MF
@@ -25,7 +25,9 @@
  org.eclipse.wst.sse.core;bundle-version="[1.1.0,1.2.0)",
  org.eclipse.jst.jsf.facesconfig;bundle-version="[1.0.0,1.1.0)",
  org.eclipse.jface.text,
- org.eclipse.core.net
+ org.eclipse.core.net,
+ org.eclipse.jst.jsp.core,
+ org.eclipse.wst.html.core
 Eclipse-LazyStart: true
 Export-Package: org.eclipse.jst.jsf.core.tests;x-friends:="org.eclipse.jst.jsf.ui.tests,org.eclipse.jst.jsf.context.symbol.tests,org.eclipse.jst.jsf.designtime.tests",
  org.eclipse.jst.jsf.core.tests.appconfig.provider;x-internal:=true,
diff --git a/jsf/tests/org.eclipse.jst.jsf.core.tests/src/org/eclipse/jst/jsf/core/tests/util/JSFCoreUtilHelper.java b/jsf/tests/org.eclipse.jst.jsf.core.tests/src/org/eclipse/jst/jsf/core/tests/util/JSFCoreUtilHelper.java
index 924444f..08938d4 100644
--- a/jsf/tests/org.eclipse.jst.jsf.core.tests/src/org/eclipse/jst/jsf/core/tests/util/JSFCoreUtilHelper.java
+++ b/jsf/tests/org.eclipse.jst.jsf.core.tests/src/org/eclipse/jst/jsf/core/tests/util/JSFCoreUtilHelper.java
@@ -7,7 +7,7 @@
  *
  * Contributors:
  *    Oracle - initial API and implementation
- *******************************************************************************/ 
+ *******************************************************************************/
 package org.eclipse.jst.jsf.core.tests.util;
 
 import java.io.File;
@@ -15,11 +15,19 @@
 import java.io.FilenameFilter;
 import java.io.IOException;
 
+import junit.framework.Assert;
+
+import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.resources.ResourcesPlugin;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.NullProgressMonitor;
 import org.eclipse.jst.j2ee.internal.web.archive.operations.WebFacetProjectCreationDataModelProvider;
+import org.eclipse.jst.jsf.context.resolver.structureddocument.IDOMContextResolver;
+import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
+import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
+import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory;
+import org.eclipse.jst.jsf.context.symbol.ISymbol;
 import org.eclipse.jst.jsf.core.JSFVersion;
 import org.eclipse.jst.jsf.core.internal.jsflibraryconfig.JSFLibraryRegistryUtil;
 import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile;
@@ -27,18 +35,26 @@
 import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistry;
 import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryFactory;
 import org.eclipse.jst.jsf.core.tests.TestsPlugin;
+import org.eclipse.jst.jsf.designtime.resolver.ISymbolContextResolver;
+import org.eclipse.jst.jsf.designtime.resolver.StructuredDocumentSymbolResolverFactory;
+import org.eclipse.jst.jsp.core.internal.domdocument.DOMModelForJSP;
 import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties;
 import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
 import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.sse.core.internal.provisional.IModelManager;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.w3c.dom.Attr;
+import org.w3c.dom.Node;
 
-public final class JSFCoreUtilHelper 
+public final class JSFCoreUtilHelper
 {
     private static final String JSFRUNTIMEJARSDIR = "jsfRuntimeJarsDirectoryV";
     private static String JSF11Path = "";
     private static String JSF12Path = "";
 
 	/**
-	 * Constructs jsfLib using this plugin's install path and "testfiles" subdirectory 
+	 * Constructs jsfLib using this plugin's install path and "testfiles" subdirectory
 	 * @param id
 	 * @param name
 	 * @param archivefiles
@@ -46,16 +62,16 @@
 	 * @return
 	 */
 	public static JSFLibrary constructJSFLib(
-			String id, 
-			String name,			
-			String[] archivefiles, 
-			boolean bImpl) {
-	
-		String pathTestFiles = TestsPlugin.getInstallLocation().getPath() + "testfiles/";
-		
+			final String id,
+			final String name,
+			final String[] archivefiles,
+			final boolean bImpl) {
+
+		final String pathTestFiles = TestsPlugin.getInstallLocation().getPath() + "testfiles/";
+
 		return constructJSFLib(id, name, pathTestFiles, archivefiles, bImpl);
 	}
-	
+
 	/**
 	 * @param id
 	 * @param name
@@ -65,42 +81,42 @@
 	 * @return JSF Library
 	 */
 	public static JSFLibrary constructJSFLib(
-			String id, 
-			String name,
-			String basePathToArchiveFiles,
-			String[] archivefiles, 
-			boolean bImpl) {
-		
-		ArchiveFile archiveFile = null;	
-		String testData;		
-		JSFLibrary jsfLib = JSFLibraryRegistryFactory.eINSTANCE.createJSFLibrary();
+			final String id,
+			final String name,
+			final String basePathToArchiveFiles,
+			final String[] archivefiles,
+			final boolean bImpl) {
+
+		ArchiveFile archiveFile = null;
+		String testData;
+		final JSFLibrary jsfLib = JSFLibraryRegistryFactory.eINSTANCE.createJSFLibrary();
 //		jsfLib.setID(id);
-		jsfLib.setName(name);	
+		jsfLib.setName(name);
 		jsfLib.setImplementation(bImpl);
-		
-		for (int i = 0; i < archivefiles.length; i++) {
-			testData = basePathToArchiveFiles + archivefiles[i];						
+
+		for (final String archivefile2 : archivefiles) {
+			testData = basePathToArchiveFiles + archivefile2;
 			archiveFile = JSFLibraryRegistryFactory.eINSTANCE.createArchiveFile();
 			archiveFile.setRelativeToWorkspace(false);
-			archiveFile.setSourceLocation(testData);			
-			archiveFile.setJSFLibrary(jsfLib);			
+			archiveFile.setSourceLocation(testData);
+			archiveFile.setJSFLibrary(jsfLib);
 		}
-		
+
 		return jsfLib;
 	}
 
 	/**
 	 * Create a Dynamic Web application with given name using default operation.
 	 * If project with given name already exists, then it returns that project.
-	 *   
+	 *
 	 * @param aProjectName Project name.
 	 * @return IProject instance.
 	 * @throws Exception on error.
 	 */
-	public static IProject createWebProject(String aProjectName) throws Exception {
-		IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(aProjectName);
+	public static IProject createWebProject(final String aProjectName) throws Exception {
+		final IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(aProjectName);
 		if (!project.exists()) {
-			IDataModel dataModel = DataModelFactory.createDataModel(new WebFacetProjectCreationDataModelProvider());
+			final IDataModel dataModel = DataModelFactory.createDataModel(new WebFacetProjectCreationDataModelProvider());
 			dataModel.setProperty(IFacetProjectCreationDataModelProperties.FACET_PROJECT_NAME, aProjectName);
 			dataModel.getDefaultOperation().execute(new NullProgressMonitor(), null);
 		}
@@ -112,7 +128,7 @@
 	 */
 	public static void createJSFLibraryRegistry(){
 		if (JSFLibraryRegistryUtil.getInstance().getJSFLibraryRegistry().getAllJSFLibraries().size() < 2){
-			//create Impl 
+			//create Impl
 			JSFLibrary lib = constructJSFLib("AN-IMPL-LIB", "/testfiles/JSFLib/", true, false);
 			JSFLibraryRegistryUtil.getInstance().getJSFLibraryRegistry().addJSFLibrary(lib);
 			//create non-Impl.   Uses same jars but declares it to be non implementation
@@ -122,7 +138,7 @@
 			lib = constructJSFLib("AN-IMPL-LIB-PP", "/testfiles/JSFLib/", true, true);
 			JSFLibraryRegistryUtil.getInstance().getJSFLibraryRegistry().addJSFLibrary(lib);
 			//create plugin-non impl
-			
+
 		}
 	}
 
@@ -131,7 +147,7 @@
 	 * Note that the returned instance is not associated with a resource and so
 	 * cannot be loaded or saved unless a resource is created and the returned
 	 * instance is set in the resource contents.
-	 * 
+	 *
 	 * @return JSFLibraryRegistry instance.
 	 */
 	public static JSFLibraryRegistry getNewJSFLibraryRegistry() {
@@ -139,64 +155,65 @@
 	}
 
 	/**
-	 * Convenience method to get the JSFLibraryRegistry instance 
+	 * Convenience method to get the JSFLibraryRegistry instance
 	 * (which will cause the loadJSFLibraryRegistry() and
 	 * loadJSFLibraryExtensions() methods to be called and will
 	 * subsequently allow saveJSFLibraryRegistry() to be called,
 	 * if desired).
-	 * 
+	 *
 	 * @return JSFLibraryRegistry instance from JSFCorePlugin.
 	 */
 	public static JSFLibraryRegistry getJSFLibraryRegistryFromJSFLibraryHelper() {
-		return JSFLibraryRegistryUtil.getInstance().getJSFLibraryRegistry(); 
+		return JSFLibraryRegistryUtil.getInstance().getJSFLibraryRegistry();
 	}
-	
+
 	/**
 	 * Creates a JSF Library from all the jars and zips found at the relative path from this plugin
-	 * 
+	 *
 	 * @param name
 	 * @param relPathToArchives
 	 * @param isImpl
-	 * @param isFakedPlugginLib 
+	 * @param isFakedPlugginLib
 	 * @return JSFLibrary
 	 */
 	public static JSFLibrary constructJSFLib(
-			String name,			
-			String relPathToArchives, 
-			boolean isImpl,
-			boolean isFakedPlugginLib) {		
-		
+			final String name,
+			final String relPathToArchives,
+			final boolean isImpl,
+			final boolean isFakedPlugginLib) {
+
 		JSFLibrary jsfLib = null;
 		if (isFakedPlugginLib){
 			jsfLib = JSFLibraryRegistryFactory.eINSTANCE.createPluginProvidedJSFLibrary();
 //			jsfLib.setID("fakePluginLib_"+name);
-		}
-		else
+		} else {
 			jsfLib = JSFLibraryRegistryFactory.eINSTANCE.createJSFLibrary();
-		
-		jsfLib.setName(name);	
+		}
+
+		jsfLib.setName(name);
 		jsfLib.setImplementation(isImpl);
-		
-		File pathTestFiles = new File(TestsPlugin.getInstallLocation().getPath() 
+
+		final File pathTestFiles = new File(TestsPlugin.getInstallLocation().getPath()
 								+ File.separator + relPathToArchives);
-		FilenameFilter jars = new FilenameFilter(){
+		final FilenameFilter jars = new FilenameFilter(){
 			public boolean accept(File dir, String name_) {
 				if (name_.length() >=5){
 					String lastChars = name_.toLowerCase().substring(name_.length() - 4);
-					if (lastChars.equals(".jar") || lastChars.equals(".zip"))
+					if (lastChars.equals(".jar") || lastChars.equals(".zip")) {
 						return true;
+					}
 				}
 				return false;
-			}			
+			}
 		};
-		
-		String[] fileNames = pathTestFiles.list(jars);
-		for(int i=0;i < fileNames.length ;i++){
-			String fileName = pathTestFiles.getAbsolutePath().concat(File.separator).concat(fileNames[i]);
-			ArchiveFile archiveFile = JSFLibraryRegistryFactory.eINSTANCE.createArchiveFile();
+
+		final String[] fileNames = pathTestFiles.list(jars);
+		for (final String fileName2 : fileNames) {
+			final String fileName = pathTestFiles.getAbsolutePath().concat(File.separator).concat(fileName2);
+			final ArchiveFile archiveFile = JSFLibraryRegistryFactory.eINSTANCE.createArchiveFile();
 			archiveFile.setRelativeToWorkspace(false);
-			archiveFile.setSourceLocation(fileName);			
-			archiveFile.setJSFLibrary(jsfLib);		
+			archiveFile.setSourceLocation(fileName);
+			archiveFile.setJSFLibrary(jsfLib);
 		}
 
 		return jsfLib;
@@ -204,11 +221,11 @@
 
     /**
      * @param jsfVersion
-     * @return Directory name for jsf runtime jars.  
+     * @return Directory name for jsf runtime jars.
      * <br>Will be null if not set in JSFRUNTIMEJARSDIRV<b>X.X</b> system property
      */
-    public static String getJSFRuntimeJarsDirectory(JSFVersion jsfVersion) {
-        String propertyName = JSFRUNTIMEJARSDIR+jsfVersion.toString();
+    public static String getJSFRuntimeJarsDirectory(final JSFVersion jsfVersion) {
+        final String propertyName = JSFRUNTIMEJARSDIR+jsfVersion.toString();
         String res = System.getProperty(propertyName);
         if (res == null) {
             //check env var also
@@ -233,24 +250,24 @@
     }
 
     /**
-     * Returns true if the environment property holding the name of the directory that points at the 
-     * runtime jars exist.  
+     * Returns true if the environment property holding the name of the directory that points at the
+     * runtime jars exist.
      * <p>
      * The expected property name is jsfRuntimeJarsDirectoryVXX where XX is the
      * JSFVersion.  <br>i.e "jsfRuntimeJarsDirectoryV1.1", or "jsfRuntimeJarsDirectoryV1.2"
      * <p>
      * It <b>does</b> check for the existence of the directory.<br>
      * It <b>does not</b> check for any jars within that directory.
-     * 
+     *
      * @param jsfVersion as String.  ie. "1.1", or "1.2"
      * @return true if the property is set
      */
-    public static boolean isJSFRuntimeJarsDirectoryPropertySet(JSFVersion jsfVersion) {
-        String dirName = getJSFRuntimeJarsDirectory(jsfVersion);
+    public static boolean isJSFRuntimeJarsDirectoryPropertySet(final JSFVersion jsfVersion) {
+        final String dirName = getJSFRuntimeJarsDirectory(jsfVersion);
         if (dirName != null && dirName.trim().length() != 0)
         {
-            File dir = new File(dirName);
-            
+            final File dir = new File(dirName);
+
             if (dir.exists() && dir.isDirectory())
             {
                 return true;
@@ -260,7 +277,7 @@
                 System.err.printf("Dir: %s either doesn't exists or is not a directory\n",dirName);
             }
         }
-        else 
+        else
         {
             System.err.println("dirName is null");
         }
@@ -268,32 +285,32 @@
         return false;
     }
 
-    public static boolean createRegistryAndAddReferences(JSFFacetedTestEnvironment jsfFacedEnv, String[] archiveFiles, JSFVersion jsfVersion) throws CoreException {
-        JSFLibraryRegistry jsfLibRegistry = 
+    public static boolean createRegistryAndAddReferences(final JSFFacetedTestEnvironment jsfFacedEnv, final String[] archiveFiles, final JSFVersion jsfVersion) throws CoreException {
+        final JSFLibraryRegistry jsfLibRegistry =
             JSFLibraryRegistryUtil.getInstance().getJSFLibraryRegistry();
 
        if (archiveFiles != null)
         {
             final String libIDandName = "_internalJSFRuntimeLibraryV" + jsfVersion + "_";
-            JSFLibrary jsfImpl = JSFCoreUtilHelper.
+            final JSFLibrary jsfImpl = JSFCoreUtilHelper.
                 constructJSFLib(libIDandName, libIDandName,"", archiveFiles, true);
             jsfLibRegistry.addJSFLibrary(jsfImpl);
             jsfFacedEnv.addJSFLibraryReference(jsfImpl, true);
             return true;
         }
-       
+
        return false;
     }
 
-    public static String[] getJSFRuntimeJarNames(JSFVersion version) throws IOException
+    public static String[] getJSFRuntimeJarNames(final JSFVersion version) throws IOException
     {
         String[] jarNames = null;
-        String dirName = getJSFRuntimeJarsDirectory(version);
+        final String dirName = getJSFRuntimeJarsDirectory(version);
         System.out.printf("Using dirName: %s\n", dirName);
         if (dirName != null) {
-            File dir = new File(dirName);
+            final File dir = new File(dirName);
             if (dir.exists() && dir.isDirectory()) {
-                File[] jars = dir.listFiles();
+                final File[] jars = dir.listFiles();
                 if (jars != null && jars.length > 0) {
                     jarNames = new String[jars.length];
                     for (int i = 0; i < jars.length; i++) {
@@ -313,13 +330,13 @@
         return jarNames;
     }
 
-    public static boolean isJSFRuntimeJarsDirectoryValid(JSFVersion jsfVersion)
+    public static boolean isJSFRuntimeJarsDirectoryValid(final JSFVersion jsfVersion)
     {
         try
         {
             return getJSFRuntimeJarNames(jsfVersion) != null;
         }
-        catch (IOException e)
+        catch (final IOException e)
         {
             return false;
         }
@@ -333,7 +350,7 @@
      * @return true if successful
      * @throws Exception
      */
-    public static boolean addJSFRuntimeJarsToClasspath(JSFVersion jsfVersion, JSFFacetedTestEnvironment jsfFacetedTestEnv) throws Exception 
+    public static boolean addJSFRuntimeJarsToClasspath(final JSFVersion jsfVersion, final JSFFacetedTestEnvironment jsfFacetedTestEnv) throws Exception
     {
         final String[] jarNames = getJSFRuntimeJarNames(jsfVersion);
         return createRegistryAndAddReferences(jsfFacetedTestEnv, jarNames, jsfVersion);
@@ -345,8 +362,8 @@
      * @return a message informing a test suite runner that the environment variable
      * isn't correct for finding JSF library jar files
      */
-    public static String getTestRequiresJSFRuntimeMessage(Class<?> testClass, JSFVersion jsfVersion) {
-        StringBuffer sb = new StringBuffer();
+    public static String getTestRequiresJSFRuntimeMessage(final Class<?> testClass, final JSFVersion jsfVersion) {
+        final StringBuffer sb = new StringBuffer();
         sb.append("Unable to run test suite \"");
         sb.append(testClass.getName());
         sb.append("\"; JSF runtime (v");
@@ -361,18 +378,18 @@
 //	/**
 //	 * Creates a JSF Library from all the jars and zips found at the relative
 //	 * path from this plugin.
-//	 * 
+//	 *
 //	 * @param ID
 //	 * @param name
 //	 * @param relPathToArchives
 //	 * @param isImpl
-//	 * @param isFakedPlugginLib 
+//	 * @param isFakedPlugginLib
 //	 * @return JSFLibrary
 //	 */
 //	public static JSFLibrary constructJSFLib(
 //			String ID,
-//			String name,			
-//			String relPathToArchives, 
+//			String name,
+//			String relPathToArchives,
 //			boolean isImpl,
 //			boolean isFakedPlugginLib) {
 //
@@ -381,4 +398,88 @@
 //		return jsfLib;
 //	}
 
+	/**
+	 * @param jspFile
+	 * @param offset
+	 * @return the context wrapper. Caller must ensure dispose is called so
+	 *         model is released when finished.
+	 * @throws Exception
+	 */
+	public static void assertELSanity(final IFile jspFile, final int offset,
+			final String attrName, final String elExpr) throws Exception {
+		ContextWrapper wrapper = null;
+		try {
+			wrapper = JSFCoreUtilHelper.getDocumentContext(jspFile, offset);
+			final IStructuredDocumentContext context = wrapper.getContext();
+			final IDOMContextResolver resolver = IStructuredDocumentContextResolverFactory.INSTANCE
+					.getDOMContextResolver(context);
+			final Node node = resolver.getNode();
+			// bJSFTestUtil.getIndexedRegion((IStructuredDocument)
+			// context.getStructuredDocument(), 589);
+			Assert.assertTrue(node instanceof Attr);
+			Assert.assertEquals(attrName, ((Attr) node).getNodeName());
+			Assert.assertEquals(elExpr, ((Attr) node).getNodeValue());
+		} finally {
+			if (wrapper != null) {
+				wrapper.dispose();
+			}
+		}
+	}
+
+	public static void assertELVariableSanity(final IFile jspFile,
+			final String varName) throws Exception {
+		ContextWrapper contextWrapper = null;
+
+		try {
+			contextWrapper = JSFCoreUtilHelper.getDocumentContext(jspFile, -1);
+			final ISymbolContextResolver symbolResolver = StructuredDocumentSymbolResolverFactory
+					.getInstance().getSymbolContextResolver(
+							contextWrapper.getContext());
+			final ISymbol bundleVar = symbolResolver.getVariable(varName);
+			Assert.assertNotNull(bundleVar);
+		} finally {
+			if (contextWrapper != null) {
+				contextWrapper.dispose();
+			}
+		}
+	}
+
+
+	public static ContextWrapper getDocumentContext(final IFile jspFile,
+			final int offset) throws Exception {
+		final IModelManager modelManager = StructuredModelManager
+				.getModelManager();
+
+		IStructuredModel model = null;
+
+		model = modelManager.getModelForRead(jspFile);
+		Assert.assertTrue(model instanceof DOMModelForJSP);
+		final IStructuredDocumentContext context = IStructuredDocumentContextFactory.INSTANCE
+				.getContext(model.getStructuredDocument(), offset);
+		return new ContextWrapper(context, model);
+	}
+
+    public static class ContextWrapper {
+		private final IStructuredDocumentContext _context;
+		private final IStructuredModel _model;
+
+		public ContextWrapper(final IStructuredDocumentContext context,
+				final IStructuredModel model) {
+			super();
+			_context = context;
+			_model = model;
+		}
+
+		public IStructuredDocumentContext getContext() {
+			return _context;
+		}
+
+		public IStructuredModel getModel() {
+			return _model;
+		}
+
+		public void dispose() {
+			_model.releaseFromRead();
+		}
+	}
 }
\ No newline at end of file
diff --git a/jsf/tests/org.eclipse.jst.jsf.test.util/src/org/eclipse/jst/jsf/test/util/JSFTestUtil.java b/jsf/tests/org.eclipse.jst.jsf.test.util/src/org/eclipse/jst/jsf/test/util/JSFTestUtil.java
index 8b2496d..9bd63a3 100644
--- a/jsf/tests/org.eclipse.jst.jsf.test.util/src/org/eclipse/jst/jsf/test/util/JSFTestUtil.java
+++ b/jsf/tests/org.eclipse.jst.jsf.test.util/src/org/eclipse/jst/jsf/test/util/JSFTestUtil.java
@@ -4,7 +4,7 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  *     Oracle Corporation - initial API and implementation
  *******************************************************************************/
@@ -41,31 +41,31 @@
 
 /**
  * Test utility methods
- * 
+ *
  * @author cbateman
  *
  */
-public class JSFTestUtil
+public final class JSFTestUtil
 {
     /**
      * Used to turn off build validation to speed up testing
-     * 
+     *
      * @param isEnabled
-     * @throws InvocationTargetException 
+     * @throws InvocationTargetException
      * @throws InvocationTargetException
      */
-    public static void setValidationEnabled(boolean isEnabled) throws InvocationTargetException
+    public static void setValidationEnabled(final boolean isEnabled) throws InvocationTargetException
     {
         final GlobalConfiguration config = new GlobalConfiguration(ConfigurationManager.getManager().getGlobalConfiguration());
         config.setDisableAllValidation(!isEnabled);
         config.passivate();
         config.store();
     }
-    
+
     /**
-     * @param proxied 
-     * @param proxyHostName 
-     * @param proxyPort 
+     * @param proxied
+     * @param proxyHostName
+     * @param proxyPort
      */
     public static void setInternetProxyPreferences(final boolean proxied, final String proxyHostName, final String proxyPort)
     {
@@ -94,11 +94,11 @@
 //            proxy.setProxiesEnabled(false);
 //        }
     }
-    
+
     /**
      * Loads the source file in bundle called fileName into the jdtTestEnvironment
      * under srcFolderName/packageName.beanClassName
-     * 
+     *
      * @param bundle
      * @param fileName
      * @param beanClassName
@@ -107,47 +107,47 @@
      * @param jdtTestEnvironment
      * @throws Exception
      */
-    public static void loadSourceClass(final Bundle bundle, 
-                                       final String fileName, 
+    public static void loadSourceClass(final Bundle bundle,
+                                       final String fileName,
                                        final String beanClassName,
                                        final String srcFolderName,
                                        final String packageName,
                                        final JDTTestEnvironment jdtTestEnvironment) throws Exception
     {
-        TestFileResource codeRes = new TestFileResource();
+        final TestFileResource codeRes = new TestFileResource();
         codeRes.load(bundle, fileName);
-        String code = codeRes.toString();
+        final String code = codeRes.toString();
         jdtTestEnvironment.addSourceFile(srcFolderName, packageName, beanClassName, code);
     }
-    
-    public static URI getPlatformAbsPath(String relativePath) throws MalformedURLException, URISyntaxException
+
+    public static URI getPlatformAbsPath(final String relativePath) throws MalformedURLException, URISyntaxException
     {
-        URL url = new URL(Platform.getInstanceLocation().getURL(), relativePath);
+        final URL url = new URL(Platform.getInstanceLocation().getURL(), relativePath);
         return url.toURI();
     }
-    
-    public static IPath getAbsolutePath(Bundle bundle, String relativePath) throws IOException, URISyntaxException
+
+    public static IPath getAbsolutePath(final Bundle bundle, final String relativePath) throws IOException, URISyntaxException
     {
-        URL url = FileLocator.resolve(bundle.getEntry(relativePath));
+        final URL url = FileLocator.resolve(bundle.getEntry(relativePath));
         return new Path(new File(url.toURI()).getAbsolutePath());//url.toExternalForm();
     }
-    
-    public static void savePlatformRelative(TestFileResource testFile, String relativePath) throws IOException, URISyntaxException
+
+    public static void savePlatformRelative(final TestFileResource testFile, final String relativePath) throws IOException, URISyntaxException
     {
         saveToFileSystem(testFile, getPlatformAbsPath(relativePath));
     }
-    
-    public static void saveToFileSystem(TestFileResource testFile, URI absPath) throws IOException
+
+    public static void saveToFileSystem(final TestFileResource testFile, final URI absPath) throws IOException
     {
         saveToFileSystem(testFile.toBytes(), absPath);
     }
-    
-    public static void saveToFileSystem(byte[] buffer, URI absPath) throws IOException
+
+    public static void saveToFileSystem(final byte[] buffer, final URI absPath) throws IOException
     {
         final File file = new File(absPath);
-        
+
         FileOutputStream  outFile = null;
-        
+
         try
         {
             outFile=new FileOutputStream(file);
@@ -162,23 +162,23 @@
         }
 
     }
-    
+
     /**
      * @param testFile
      * @param absPath
      * @return true if the contents of testFile and the contents of what absPath point to
      * are the same based on a byte for byte comparison (Arrays.equal(byte[], byte[]).
-     * 
+     *
      * @throws IOException
      */
-    public static boolean areEqual(TestFileResource testFile, URI absPath) throws IOException
+    public static boolean areEqual(final TestFileResource testFile, final URI absPath) throws IOException
     {
         final File file = new File(absPath);
-            
+
         return Arrays.equals(loadFromFile(file).toByteArray(), testFile.toBytes());
     }
-    
-    public static ByteArrayOutputStream loadFromFile(File file) throws IOException
+
+    public static ByteArrayOutputStream loadFromFile(final File file) throws IOException
     {
         FileInputStream  inFile = null;
         ByteArrayOutputStream buffer = null;
@@ -186,9 +186,9 @@
         try
         {
             inFile=new FileInputStream(file);
-            
+
             buffer = new ByteArrayOutputStream();
-            byte[]  inBuffer = new byte[1024];
+            final byte[]  inBuffer = new byte[1024];
             int bytesRead;
             int curPos = 0;
             while ((bytesRead = inFile.read(inBuffer)) != -1)
@@ -196,7 +196,7 @@
                 buffer.write(inBuffer,0,bytesRead);
                 curPos+=bytesRead;
             }
-            
+
             return buffer;
         }
         finally
@@ -207,14 +207,14 @@
             }
         }
     }
-    
-    
+
+
     public static IndexedRegion getIndexedRegion(final IStructuredDocument document, final int documentOffset)
     {
         // C.B: most of this logic was copied from ContentAssistUtils.getNodeAt
         // I chose to copy rather than just call that because ContentAssistUtils is
         // internal
-        IStructuredModel model = getStructuredModel(document);
+        final IStructuredModel model = getStructuredModel(document);
         IndexedRegion             region = null;
         if (model != null)
         {
@@ -228,25 +228,25 @@
                     region = model.getIndexedRegion(lastOffset);
                     trace("Iterating on region: "+region.toString());
                 }
-                
+
                 trace("Finished with: "+region.toString()+", Class: "+region.getClass());
-                
+
                 // now we assume we have an element.  But our context may be
                 // on an attribute in that node, so we need to check
                 if (region instanceof IDOMElement)
                 {
                     trace("Region is an IDOMElement");
-                    IDOMElement domElement = (IDOMElement) region;
-                    
-                    NamedNodeMap attributes = domElement.getAttributes();
-                    
+                    final IDOMElement domElement = (IDOMElement) region;
+
+                    final NamedNodeMap attributes = domElement.getAttributes();
+
                     for (int i = 0; i < attributes.getLength(); i++)
                     {
-                        Node  attrNode = attributes.item(i);
-                        
+                        final Node  attrNode = attributes.item(i);
+
                         if (attrNode instanceof IDOMAttr)
                         {
-                            IDOMAttr attr = (IDOMAttr) attrNode;
+                            final IDOMAttr attr = (IDOMAttr) attrNode;
                             trace("Examining attribute: "+attr.toString());
 
                             if (documentOffset >= attr.getStartOffset()
@@ -271,26 +271,31 @@
         return region;
     }
 
-    private static void trace(String message)
+    private static void trace(final String message)
     {
     	System.out.println("getIndexedRegion: "+message);
     }
-    
+
     /**
      * @param document
      * @return a structured model or null if one cannot be opened for document.
      * Note: the caller is responsible for releasing the instance of structured
      * model that gets returned.
      */
-    private static IStructuredModel getStructuredModel(IStructuredDocument document)
+    private static IStructuredModel getStructuredModel(final IStructuredDocument document)
     {
-        IModelManager modelManager = StructuredModelManager.getModelManager();
-        
+        final IModelManager modelManager = StructuredModelManager.getModelManager();
+
         if (modelManager != null)
         {
-            return StructuredModelManager.getModelManager().getModelForRead(document); 
+            return StructuredModelManager.getModelManager().getModelForRead(document);
         }
-        
+
         return null;
     }
+
+    private JSFTestUtil()
+    {
+    	// no instantiation
+    }
 }
diff --git a/jsf/tests/org.eclipse.jst.jsf.ui.tests/META-INF/MANIFEST.MF b/jsf/tests/org.eclipse.jst.jsf.ui.tests/META-INF/MANIFEST.MF
index 640899f..7dc0cd1 100644
--- a/jsf/tests/org.eclipse.jst.jsf.ui.tests/META-INF/MANIFEST.MF
+++ b/jsf/tests/org.eclipse.jst.jsf.ui.tests/META-INF/MANIFEST.MF
@@ -13,7 +13,16 @@
  org.eclipse.jst.jsf.ui;bundle-version="[1.0.0,1.1.0)",
  org.junit;bundle-version="[3.8.1,4.0.0)",
  org.eclipse.emf.common;bundle-version="[2.2.0,3.0.0)",
- org.eclipse.emf.ecore;bundle-version="[2.2.0,3.0.0)"
+ org.eclipse.emf.ecore;bundle-version="[2.2.0,3.0.0)",
+ org.eclipse.ui.forms,
+ org.eclipse.jface.text,
+ org.eclipse.jst.jsf.common,
+ org.eclipse.jst.jsf.test.util,
+ org.eclipse.jst.jsf.contentassist.tests,
+ org.eclipse.jdt.core,
+ org.eclipse.core.resources,
+ org.eclipse.jdt.ui,
+ org.eclipse.ui.ide
 Eclipse-LazyStart: true
 Export-Package: org.eclipse.jst.jsf.ui.tests;x-internal:=true,
  org.eclipse.jst.jsf.ui.tests.classpath;x-internal:=true,
diff --git a/jsf/tests/org.eclipse.jst.jsf.ui.tests/src/org/eclipse/jst/jsf/ui/tests/JSFUIAllTests.java b/jsf/tests/org.eclipse.jst.jsf.ui.tests/src/org/eclipse/jst/jsf/ui/tests/JSFUIAllTests.java
index 46189e5..c0761a5 100644
--- a/jsf/tests/org.eclipse.jst.jsf.ui.tests/src/org/eclipse/jst/jsf/ui/tests/JSFUIAllTests.java
+++ b/jsf/tests/org.eclipse.jst.jsf.ui.tests/src/org/eclipse/jst/jsf/ui/tests/JSFUIAllTests.java
@@ -7,26 +7,29 @@
  *
  * Contributors:
  *    Oracle - initial API and implementation
- *    
+ *
  ********************************************************************************/
 package org.eclipse.jst.jsf.ui.tests;
 
-import org.eclipse.jst.jsf.ui.tests.classpath.JSFLibrariesPreferencePageTestCases;
-import org.eclipse.jst.jsf.ui.tests.classpath.JSFLibraryWizardTestCases;
-
 import junit.framework.Test;
 import junit.framework.TestSuite;
 
+import org.eclipse.jst.jsf.ui.tests.classpath.JSFLibrariesPreferencePageTestCases;
+import org.eclipse.jst.jsf.ui.tests.classpath.JSFLibraryWizardTestCases;
+import org.eclipse.jst.jsf.ui.tests.jspeditor.TestELHyperlinkDetector;
+import org.eclipse.jst.jsf.ui.tests.jspeditor.TestJSFELHover;
+
 public class JSFUIAllTests {
 
 	public static Test suite() {
-		TestSuite suite = new TestSuite("Test for org.eclipse.jst.jsf.ui.tests");
+		final TestSuite suite = new TestSuite("Test for org.eclipse.jst.jsf.ui.tests");
 		//$JUnit-BEGIN$
 		suite.addTestSuite(JSFLibrariesPreferencePageTestCases.class);
 		suite.addTestSuite(JSFLibraryWizardTestCases.class);
-				
+		suite.addTestSuite(TestELHyperlinkDetector.class);
+		suite.addTestSuite(TestJSFELHover.class);
 		//$JUnit-END$
 		return suite;
-	}	
-	
+	}
+
 }
diff --git a/jsf/tests/org.eclipse.jst.jsf.ui.tests/src/org/eclipse/jst/jsf/ui/tests/jspeditor/TestELHyperlinkDetector.java b/jsf/tests/org.eclipse.jst.jsf.ui.tests/src/org/eclipse/jst/jsf/ui/tests/jspeditor/TestELHyperlinkDetector.java
new file mode 100644
index 0000000..87412f6
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.jsf.ui.tests/src/org/eclipse/jst/jsf/ui/tests/jspeditor/TestELHyperlinkDetector.java
@@ -0,0 +1,150 @@
+package org.eclipse.jst.jsf.ui.tests.jspeditor;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.hyperlink.IHyperlink;
+import org.eclipse.jst.jsf.contentassist.tests.ContentAssistTestsPlugin;
+import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
+import org.eclipse.jst.jsf.core.IJSFCoreConstants;
+import org.eclipse.jst.jsf.core.tests.util.JSFCoreUtilHelper;
+import org.eclipse.jst.jsf.core.tests.util.JSFFacetedTestEnvironment;
+import org.eclipse.jst.jsf.core.tests.util.JSFCoreUtilHelper.ContextWrapper;
+import org.eclipse.jst.jsf.test.util.JDTTestEnvironment;
+import org.eclipse.jst.jsf.test.util.JSFTestUtil;
+import org.eclipse.jst.jsf.test.util.TestFileResource;
+import org.eclipse.jst.jsf.test.util.WebProjectTestEnvironment;
+import org.eclipse.jst.jsf.ui.internal.jspeditor.ELHyperlinkDetector;
+import org.eclipse.jst.jsf.ui.internal.jspeditor.ITestHyperlink;
+import org.eclipse.jst.jsf.ui.internal.jspeditor.JSPSourceUtil;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.part.FileEditorInput;
+
+public class TestELHyperlinkDetector extends TestCase {
+
+	private WebProjectTestEnvironment _testEnv;
+	private IFile _jspFile;
+	private IType _myBeanType;
+
+	@Override
+	protected void setUp() throws Exception {
+		super.setUp();
+
+		JSFTestUtil.setValidationEnabled(false);
+
+		_testEnv = new WebProjectTestEnvironment(getClass().getName() + "_"
+				+ getName());
+		_testEnv.createProject(false);
+		assertNotNull(_testEnv);
+		assertNotNull(_testEnv.getTestProject());
+		assertTrue(_testEnv.getTestProject().isAccessible());
+
+		final JSFFacetedTestEnvironment jsfFacedEnv = new JSFFacetedTestEnvironment(
+				_testEnv);
+		jsfFacedEnv.initialize(IJSFCoreConstants.FACET_VERSION_1_1);
+
+		_testEnv.loadResourceInWebRoot(ContentAssistTestsPlugin.getDefault()
+				.getBundle(), "/testdata/faces-config_basic.xml.data",
+				"/WEB-INF/faces-config.xml");
+		_jspFile = (IFile) _testEnv.loadResourceInWebRoot(
+				ContentAssistTestsPlugin.getDefault().getBundle(),
+				"/testdata/basicELExpressions.jsp.data",
+				"/basicELExpressions.jsp");
+		assertNotNull(_jspFile);
+		assertTrue(_jspFile.isAccessible());
+
+		final JDTTestEnvironment jdtTestEnv = new JDTTestEnvironment(_testEnv);
+		final TestFileResource resource = new TestFileResource();
+		resource.load(ContentAssistTestsPlugin.getDefault().getBundle(),
+				"/testdata/MyBean.java.data");
+		jdtTestEnv.addSourceFile("src", "beans", "MyBean", resource.toString());
+		_myBeanType = JavaCore.create(_testEnv.getTestProject()).findType(
+				"beans.MyBean");
+		assertNotNull(_myBeanType);
+		assertTrue(_myBeanType.exists());
+	}
+
+	public void testSanity() throws Exception {
+		JSFCoreUtilHelper.assertELSanity(_jspFile, 579, "value", "#{myBean}");
+		JSFCoreUtilHelper.assertELSanity(_jspFile, 614, "value",
+				"#{myBean.property}");
+		JSFCoreUtilHelper.assertELSanity(_jspFile, 706, "action",
+				"#{myBean.actionMethod}");
+
+		JSFCoreUtilHelper.assertELVariableSanity(_jspFile, "myBean");
+	}
+
+	public void testDetectHyperlinks()
+			throws Exception {
+		// hyperlink from MyBean
+		testJavaHyperlink(579, 0,"MyBean.java", IJavaElement.TYPE, "MyBean");
+		// hyperlink from MyBean
+		testJavaHyperlink(614, 0, "MyBean.java", IJavaElement.TYPE, "MyBean");
+		// hyperlink from MyBean
+		testJavaHyperlink(706, 0, "MyBean.java", IJavaElement.TYPE, "MyBean");
+
+		// hyperlink from property
+		testJavaHyperlink(614, 8, "MyBean.java", IJavaElement.METHOD, "getProperty");
+
+		// hyperlink from method
+		testJavaHyperlink(706, 8, "MyBean.java", IJavaElement.METHOD, "actionMethod");
+	}
+
+	private void testJavaHyperlink(final int regionStartOffset, final int relativeOffset
+			, final String classFileName, final int javaElementType, final String javaElementName) throws Exception
+	{
+		final IWorkbenchPage  curPage =
+            PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+		final TestableELHyperlinkDetector hyperlinkDetector = new TestableELHyperlinkDetector();
+		final ContextWrapper context = JSFCoreUtilHelper.getDocumentContext(_jspFile,
+				regionStartOffset);
+		Region elRegion = JSPSourceUtil.findELRegion(context.getContext());
+		elRegion = new Region(elRegion.getOffset()+relativeOffset, elRegion.getLength()-relativeOffset);
+		final IHyperlink[] links = hyperlinkDetector.detectHyperlinks(context
+				.getContext(), elRegion);
+		assertEquals(1, links.length);
+		final IHyperlink link = links[0];
+
+		assertTrue(link instanceof ITestHyperlink);
+		assertNotNull(link.getHyperlinkRegion());
+
+		// as a reminder if add optional values
+		assertNull(link.getTypeLabel());
+		assertNull(link.getHyperlinkText());
+
+		{
+			final ITestHyperlink testHyperlink = (ITestHyperlink) link;
+			final IJavaElement javaElement = testHyperlink.determineJavaElement();
+			assertNotNull(javaElement);
+			assertEquals(javaElementType, javaElement.getElementType());
+			assertEquals(javaElementName, javaElement.getElementName());
+		}
+
+		link.open();
+
+		final IEditorPart editorPart = curPage.getActiveEditor();
+		assertNotNull(editorPart);
+		final IEditorInput editorInput = editorPart.getEditorInput();
+		assertTrue(editorInput instanceof FileEditorInput);
+		final IFile file = ((FileEditorInput)editorInput).getFile();
+		assertEquals(classFileName, file.getName());
+		curPage.closeEditor(editorPart, false);
+	}
+
+	private static class TestableELHyperlinkDetector extends
+			ELHyperlinkDetector {
+		@Override
+		public IHyperlink[] detectHyperlinks(
+				final IStructuredDocumentContext context, final IRegion region) {
+			return super.detectHyperlinks(context, region);
+		}
+	}
+}
diff --git a/jsf/tests/org.eclipse.jst.jsf.ui.tests/src/org/eclipse/jst/jsf/ui/tests/jspeditor/TestJSFELHover.java b/jsf/tests/org.eclipse.jst.jsf.ui.tests/src/org/eclipse/jst/jsf/ui/tests/jspeditor/TestJSFELHover.java
new file mode 100644
index 0000000..570f2b5
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.jsf.ui.tests/src/org/eclipse/jst/jsf/ui/tests/jspeditor/TestJSFELHover.java
@@ -0,0 +1,115 @@
+package org.eclipse.jst.jsf.ui.tests.jspeditor;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jst.jsf.contentassist.tests.ContentAssistTestsPlugin;
+import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
+import org.eclipse.jst.jsf.core.IJSFCoreConstants;
+import org.eclipse.jst.jsf.core.tests.util.JSFCoreUtilHelper;
+import org.eclipse.jst.jsf.core.tests.util.JSFFacetedTestEnvironment;
+import org.eclipse.jst.jsf.core.tests.util.JSFCoreUtilHelper.ContextWrapper;
+import org.eclipse.jst.jsf.test.util.JDTTestEnvironment;
+import org.eclipse.jst.jsf.test.util.JSFTestUtil;
+import org.eclipse.jst.jsf.test.util.TestFileResource;
+import org.eclipse.jst.jsf.test.util.WebProjectTestEnvironment;
+import org.eclipse.jst.jsf.ui.internal.jspeditor.JSFELHover;
+
+public class TestJSFELHover extends TestCase {
+
+	private WebProjectTestEnvironment _testEnv;
+	private IFile _jspFile;
+	private IType _myBeanType;
+
+	@Override
+	protected void setUp() throws Exception {
+		super.setUp();
+
+		JSFTestUtil.setValidationEnabled(false);
+
+		_testEnv = new WebProjectTestEnvironment(getClass().getName() + "_"
+				+ getName());
+		_testEnv.createProject(false);
+		assertNotNull(_testEnv);
+		assertNotNull(_testEnv.getTestProject());
+		assertTrue(_testEnv.getTestProject().isAccessible());
+
+		final JSFFacetedTestEnvironment jsfFacedEnv = new JSFFacetedTestEnvironment(
+				_testEnv);
+		jsfFacedEnv.initialize(IJSFCoreConstants.FACET_VERSION_1_1);
+
+		_testEnv.loadResourceInWebRoot(ContentAssistTestsPlugin.getDefault()
+				.getBundle(), "/testdata/faces-config_basic.xml.data",
+				"/WEB-INF/faces-config.xml");
+		_jspFile = (IFile) _testEnv.loadResourceInWebRoot(
+				ContentAssistTestsPlugin.getDefault().getBundle(),
+				"/testdata/basicELExpressions.jsp.data",
+				"/basicELExpressions.jsp");
+		assertNotNull(_jspFile);
+		assertTrue(_jspFile.isAccessible());
+
+		final JDTTestEnvironment jdtTestEnv = new JDTTestEnvironment(_testEnv);
+		final TestFileResource resource = new TestFileResource();
+		resource.load(ContentAssistTestsPlugin.getDefault().getBundle(),
+				"/testdata/MyBean.java.data");
+		jdtTestEnv.addSourceFile("src", "beans", "MyBean", resource.toString());
+		_myBeanType = JavaCore.create(_testEnv.getTestProject()).findType(
+				"beans.MyBean");
+		assertNotNull(_myBeanType);
+		assertTrue(_myBeanType.exists());
+	}
+
+	public void testSanity() throws Exception {
+		JSFCoreUtilHelper.assertELSanity(_jspFile, 579, "value", "#{myBean}");
+		JSFCoreUtilHelper.assertELSanity(_jspFile, 614, "value",
+				"#{myBean.property}");
+		JSFCoreUtilHelper.assertELSanity(_jspFile, 706, "action",
+				"#{myBean.actionMethod}");
+
+		JSFCoreUtilHelper.assertELVariableSanity(_jspFile, "myBean");
+	}
+
+	public void testGetHoverInfo() throws Exception {
+		// hyperlink from MyBean
+		testJavaHoverHelp(579, "MyBean.java", "<p><b>Name:</b>myBean</p><p><b>Type: </b>beans.MyBean</p><p><b>Scope:</b>none</p>");
+		// hyperlink from MyBean
+		testJavaHoverHelp(614, "MyBean.java", "<p><b>Name:</b>myBean</p><p><b>Type: </b>beans.MyBean</p><p><b>Scope:</b>none</p>");
+		// hyperlink from MyBean
+		testJavaHoverHelp(706, "MyBean.java", "<p><b>Name:</b>myBean</p><p><b>Type: </b>beans.MyBean</p><p><b>Scope:</b>none</p>");
+
+		// hyperlink from property
+		testJavaHoverHelp(622, "MyBean.java", "");
+
+		// hyperlink from method
+		testJavaHoverHelp(714, "MyBean.java", "");
+	}
+
+	private void testJavaHoverHelp(final int regionStartOffset,
+			final String classFileName, final String expectedInfo)
+			throws Exception {
+		final TestableJSFELHover hoverHelp = new TestableJSFELHover();
+		final ContextWrapper context = JSFCoreUtilHelper.getDocumentContext(
+				_jspFile, regionStartOffset);
+		final IRegion region = hoverHelp.getHoverRegion(context.getContext(),
+				regionStartOffset);
+		assertNotNull(region);
+		assertEquals(expectedInfo, hoverHelp.getHoverInfo());
+	}
+
+	private static class TestableJSFELHover extends JSFELHover {
+
+		@Override
+		public String getHoverInfo() {
+			return super.getHoverInfo();
+		}
+
+		@Override
+		public IRegion getHoverRegion(final IStructuredDocumentContext context,
+				final int documentPosition) {
+			return super.getHoverRegion(context, documentPosition);
+		}
+	}
+}