diff --git a/jsf/tests/org.eclipse.jst.jsf.contentassist.tests/META-INF/MANIFEST.MF b/jsf/tests/org.eclipse.jst.jsf.contentassist.tests/META-INF/MANIFEST.MF
index 871a8a8..7a956c7 100644
--- a/jsf/tests/org.eclipse.jst.jsf.contentassist.tests/META-INF/MANIFEST.MF
+++ b/jsf/tests/org.eclipse.jst.jsf.contentassist.tests/META-INF/MANIFEST.MF
@@ -19,7 +19,8 @@
  org.eclipse.jface.text;bundle-version="[3.2.0,4.0.0)",
  org.eclipse.jst.jsf.core;bundle-version="[1.0.0,1.1.0)",
  org.eclipse.wst.html.core;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.jdt.core;bundle-version="[3.2.0,4.0.0)"
+ org.eclipse.jdt.core;bundle-version="[3.2.0,4.0.0)",
+ org.eclipse.emf.ecore
 Eclipse-LazyStart: true
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
 Export-Package: org.eclipse.jst.jsf.contentassist.tests;x-internal:=true
diff --git a/jsf/tests/org.eclipse.jst.jsf.contentassist.tests/src/org/eclipse/jst/jsf/contentassist/tests/AllTests.java b/jsf/tests/org.eclipse.jst.jsf.contentassist.tests/src/org/eclipse/jst/jsf/contentassist/tests/AllTests.java
index b664f7d..e78d4db 100644
--- a/jsf/tests/org.eclipse.jst.jsf.contentassist.tests/src/org/eclipse/jst/jsf/contentassist/tests/AllTests.java
+++ b/jsf/tests/org.eclipse.jst.jsf.contentassist.tests/src/org/eclipse/jst/jsf/contentassist/tests/AllTests.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
  *******************************************************************************/
@@ -15,7 +15,7 @@
 
 /**
  * All tests suite for content assist
- * 
+ *
  * @author cbateman
  *
  */
@@ -23,13 +23,16 @@
     /**
      * @return the test suite
      */
-    public static Test suite() 
+    public static Test suite()
     {
-        TestSuite suite = new TestSuite("Test for org.eclipse.jst.jsf.contentassist");
+        final TestSuite suite = new TestSuite("Test for org.eclipse.jst.jsf.contentassist");
         //$JUnit-BEGIN$
         suite.addTestSuite(CompletionPrefixTest.class);
         suite.addTestSuite(Test_bug_149224.class);
         suite.addTestSuite(Test_bug_149743.class);
+        suite.addTestSuite(TestIdCompletionStrategy.class);
+        suite.addTestSuite(TestFunctionCompletionStrategy.class);
+        suite.addTestSuite(TestContentAssistParser.class);
         //$JUnit-END$
         return suite;
     }
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
new file mode 100644
index 0000000..a5d06b6
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.jsf.contentassist.tests/src/org/eclipse/jst/jsf/contentassist/tests/BaseTestClass.java
@@ -0,0 +1,211 @@
+package org.eclipse.jst.jsf.contentassist.tests;
+
+import java.util.List;
+import java.util.Set;
+
+import junit.framework.TestCase;
+
+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.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.
+	 * @param jspFile
+	 * @param docOffset
+	 * @param exprOffset
+	 * @return the proposals
+	 * @throws Exception
+	 */
+	protected final List<ICompletionProposal> getProposals(final IFile jspFile,
+			final int docOffset, final int exprOffset) throws Exception {
+		ContextWrapper wrapper = null;
+
+		try {
+			wrapper = getDocumentContext(jspFile, docOffset);
+
+			final ITextRegionContextResolver resolver = IStructuredDocumentContextResolverFactory.INSTANCE
+					.getTextRegionResolver(wrapper.getContext());
+
+			assertEquals(DOMJSPRegionContexts.JSP_VBL_CONTENT, resolver.getRegionType());
+			final String elText = resolver.getRegionText().trim();
+			assertNotNull(elText);
+
+			final ContentAssistStrategy strategy = ContentAssistParser
+					.getPrefix(exprOffset, elText);
+			assertNotNull(strategy);
+			return strategy.getProposals(wrapper.getContext());
+		} finally {
+			if (wrapper != null) {
+				wrapper.dispose();
+			}
+		}
+	}
+
+	/**
+	 * This method doesn't use the docOffset to find the EL text.
+	 *
+	 * @param jspFile
+	 * @param exprOffset
+	 * @param elText
+	 * @return the proposals at 1-based exprOffset into elText
+	 * @throws Exception
+	 */
+	protected final List<ICompletionProposal> getProposals(final IFile jspFile,
+			final int docOffset, final String elText, final int exprOffset) throws Exception
+	{
+		ContextWrapper wrapper = null;
+
+		try {
+			wrapper = getDocumentContext(jspFile, docOffset);
+
+
+			final ContentAssistStrategy strategy = ContentAssistParser
+					.getPrefix(exprOffset, elText);
+			assertNotNull(strategy);
+			return strategy.getProposals(wrapper.getContext());
+		} finally {
+			if (wrapper != null) {
+				wrapper.dispose();
+			}
+		}
+
+	}
+
+    protected final void applyAndCheck(final IFile jspFile, final int offset, final ICompletionProposal applyMe, final String expectedResult)
+			throws Exception {
+		ContextWrapper wrapper = null;
+
+		try {
+			wrapper = getDocumentContext(jspFile, offset);
+
+			applyMe.apply(getDocumentContext(jspFile, offset).getContext()
+					.getStructuredDocument());
+
+			final ITextRegionContextResolver resolver = IStructuredDocumentContextResolverFactory.INSTANCE
+					.getTextRegionResolver(wrapper.getContext());
+
+			final String newELText = resolver.getRegionText();
+			assertEquals(expectedResult, newELText);
+		} finally {
+			if (wrapper != null) {
+				wrapper.dispose();
+			}
+		}
+	}
+
+	/**
+	 * @param expected
+	 * @param proposals
+	 */
+	protected void assertDisplayNamesMatch(final Set<String> expected, final List<ICompletionProposal>  proposals) {
+		assertEquals(expected.size(), proposals.size());
+
+		for (final ICompletionProposal proposal : proposals)
+		{
+			expected.contains(proposal.getDisplayString());
+		}
+	}
+}
diff --git a/jsf/tests/org.eclipse.jst.jsf.contentassist.tests/src/org/eclipse/jst/jsf/contentassist/tests/CompletionPrefixTest.java b/jsf/tests/org.eclipse.jst.jsf.contentassist.tests/src/org/eclipse/jst/jsf/contentassist/tests/CompletionPrefixTest.java
index c5a627d..f596e82 100644
--- a/jsf/tests/org.eclipse.jst.jsf.contentassist.tests/src/org/eclipse/jst/jsf/contentassist/tests/CompletionPrefixTest.java
+++ b/jsf/tests/org.eclipse.jst.jsf.contentassist.tests/src/org/eclipse/jst/jsf/contentassist/tests/CompletionPrefixTest.java
@@ -7,35 +7,35 @@
  *
  * Contributors:
  *    Cameron Bateman/Oracle - initial API and implementation
- *    
+ *
  ********************************************************************************/
 
 package org.eclipse.jst.jsf.contentassist.tests;
 
+import junit.framework.TestCase;
+
 import org.eclipse.jst.jsf.core.internal.contentassist.el.ContentAssistParser;
 import org.eclipse.jst.jsf.core.internal.contentassist.el.ContentAssistStrategy;
 
-import junit.framework.TestCase;
-
 /**
  * @author cbateman
  *
  */
-public class CompletionPrefixTest extends TestCase 
+public class CompletionPrefixTest extends TestCase
 {
     /* empty expresion */
     private final static String empty_ = " ";
-    
+
     /* simple value expressions */
     private final static String xxx = "xxx";
     private final static String xxxDot = "xxx.";
     private final static String xxxYYY = "xxx.yyy";
     private final static String xxxYYYZZZ = "xxx.yyy.zzz";
-    
+
     /* value expressions with comparisons */
     private final static String xxxLtYYY = "xxx < yyy";
     private final static String xxxDotYYYLtZZZ = "xxx.yyy < zzz";
-    
+
     /* expressions using the ['yyy'] map syntax */
     private final static String xxxMapYYY = "xxx['yyy']";
     private final static String xxxMapXXXExpr = "xxx[XXX]";
@@ -43,9 +43,9 @@
     private final static String xxxMapXXXDotYYYExpr = "xxx[XXX.YYY]";
     private final static String xxxMapXXXDotYYYDotExpr = "xxx[XXX.YYY.]";
     private final static String xxxMapXXXDotYYYDotZZZExpr = "xxx[XXX.YYY.ZZZ]";
-    
-    
-    
+
+
+
     /**
      * Test passing null to the parser
      */
@@ -57,9 +57,9 @@
             assertNull(prefix);
         }
     }
-    
+
     /**
-     * 
+     *
      */
     public void testPrefix_empty_()
     {
@@ -67,14 +67,14 @@
         /*      ^        */
         {
             final ContentAssistStrategy prefix = ContentAssistParser.getPrefix(1, empty_);
-            
+
             assertTrue(prefix.getType() == ContentAssistStrategy.PREFIX_TYPE_ID_COMPLETION
                     && "".equals(prefix.getValue()));
         }
     }
-    
+
     /**
-     * 
+     *
      */
     public void testPrefix_xxx()
     {
@@ -82,32 +82,32 @@
         /*      ^        */
         {
             final ContentAssistStrategy prefix = ContentAssistParser.getPrefix(1, xxx);
-            
+
             assertTrue(prefix.getType() == ContentAssistStrategy.PREFIX_TYPE_ID_COMPLETION
                     && "xxx".equals(prefix.getValue()));
         }
-        
+
         /* Test  x x x */
         /*        ^                    */
         {
             final ContentAssistStrategy prefix = ContentAssistParser.getPrefix(2, xxx);
-            
+
             assertTrue(prefix.getType() == ContentAssistStrategy.PREFIX_TYPE_ID_COMPLETION
                     && "xxx".equals(prefix.getValue()));
         }
-        
+
         /* Test  x x x */
         /*            ^                */
         {
             final ContentAssistStrategy prefix = ContentAssistParser.getPrefix(4, xxx);
-            
+
             assertTrue(prefix.getType() == ContentAssistStrategy.PREFIX_TYPE_ID_COMPLETION
                     && "xxx".equals(prefix.getValue()));
         }
     }
-    
+
     /**
-     * 
+     *
      */
     public void testPrefix_xxxDot()
     {
@@ -115,32 +115,32 @@
         /*      ^        */
         {
             final ContentAssistStrategy prefix = ContentAssistParser.getPrefix(1, xxxDot);
-            
+
             assertTrue(prefix.getType() == ContentAssistStrategy.PREFIX_TYPE_ID_COMPLETION
                     && "xxx".equals(prefix.getValue()));
         }
-        
+
         /* Test  x x x . */
         /*        ^                    */
         {
             final ContentAssistStrategy prefix = ContentAssistParser.getPrefix(2, xxxDot);
-            
+
             assertTrue(prefix.getType() == ContentAssistStrategy.PREFIX_TYPE_ID_COMPLETION
                     && "xxx".equals(prefix.getValue()));
         }
-        
+
         /* Test  x x x .  */
         /*            ^                */
         {
             final ContentAssistStrategy prefix = ContentAssistParser.getPrefix(4, xxxDot);
-            
+
             assertTrue(prefix.getType() == ContentAssistStrategy.PREFIX_TYPE_ID_COMPLETION
                     && "xxx".equals(prefix.getValue()));
         }
     }
-    
+
     /**
-     * 
+     *
      */
     public void testSuffix_xxxDot()
     {
@@ -148,14 +148,14 @@
         /*              ^*/
         {
             final ContentAssistStrategy prefix = ContentAssistParser.getPrefix(5, xxxDot);
-            
+
             assertTrue(prefix.getType() == ContentAssistStrategy.PREFIX_TYPE_DOT_COMPLETION
                     && "xxx".equals(prefix.getValue()));
         }
     }
-    
+
     /**
-     * 
+     *
      */
     public void testPrefix_xxxYYY()
     {
@@ -163,40 +163,40 @@
         /*      ^                      */
         {
             final ContentAssistStrategy prefix = ContentAssistParser.getPrefix(1, xxxYYY);
-            
+
             assertTrue(prefix.getType() == ContentAssistStrategy.PREFIX_TYPE_ID_COMPLETION
                     && "xxx".equals(prefix.getValue()));
         }
-        
+
         /* Test  x x x . y y y . z z z */
         /*        ^                    */
         {
             final ContentAssistStrategy prefix = ContentAssistParser.getPrefix(2, xxxYYY);
-            
+
             assertTrue(prefix.getType() == ContentAssistStrategy.PREFIX_TYPE_ID_COMPLETION
                     && "xxx".equals(prefix.getValue()));
         }
-        
+
         /* Test  x x x . y y y . z z z */
         /*            ^                */
         {
             final ContentAssistStrategy prefix = ContentAssistParser.getPrefix(4, xxxYYY);
-            
+
             assertTrue(prefix.getType() == ContentAssistStrategy.PREFIX_TYPE_ID_COMPLETION
                     && "xxx".equals(prefix.getValue()));
         }
     }
-    
+
     /**
-     * 
+     *
      */
     public void testFirstSuffix_xxxYYY()
     {
         /* Test  x x x . y y y . z z z */
         /*              ^              */
         {
-            ContentAssistStrategy prefix = ContentAssistParser.getPrefix(5, xxxYYY);
-            
+            final ContentAssistStrategy prefix = ContentAssistParser.getPrefix(5, xxxYYY);
+
             assertTrue(prefix.getType() == ContentAssistStrategy.PREFIX_TYPE_DOT_COMPLETION
                             && "xxx".equals(prefix.getValue()));
         }
@@ -204,17 +204,17 @@
         /* Test  x x x . y y y . z z z */
         /*                ^            */
         {
-            ContentAssistStrategy prefix = ContentAssistParser.getPrefix(6, xxxYYY);
-            
+            final ContentAssistStrategy prefix = ContentAssistParser.getPrefix(6, xxxYYY);
+
             assertTrue(prefix.getType() == ContentAssistStrategy.PREFIX_TYPE_DOT_COMPLETION
                             && "xxx".equals(prefix.getValue()));
         }
-        
+
         /* Test  x x x . y y y . z z z */
         /*                    ^        */
         {
-            ContentAssistStrategy prefix = ContentAssistParser.getPrefix(8, xxxYYY);
-            
+            final ContentAssistStrategy prefix = ContentAssistParser.getPrefix(8, xxxYYY);
+
             assertTrue(prefix.getType() == ContentAssistStrategy.PREFIX_TYPE_DOT_COMPLETION
                             && "xxx".equals(prefix.getValue()));
         }
@@ -229,41 +229,41 @@
         /*      ^                      */
         {
             final ContentAssistStrategy prefix = ContentAssistParser.getPrefix(1, xxxYYYZZZ);
-            
+
             assertTrue(prefix.getType() == ContentAssistStrategy.PREFIX_TYPE_ID_COMPLETION
                     && "xxx".equals(prefix.getValue()));
         }
-        
+
         /* Test  x x x . y y y . z z z */
         /*        ^                    */
         {
             final ContentAssistStrategy prefix = ContentAssistParser.getPrefix(2, xxxYYYZZZ);
-            
+
             assertTrue(prefix.getType() == ContentAssistStrategy.PREFIX_TYPE_ID_COMPLETION
                     && "xxx".equals(prefix.getValue()));
         }
-        
+
         /* Test  x x x . y y y . z z z */
         /*            ^                */
         {
             final ContentAssistStrategy prefix = ContentAssistParser.getPrefix(4, xxxYYYZZZ);
-            
+
             assertTrue(prefix.getType() == ContentAssistStrategy.PREFIX_TYPE_ID_COMPLETION
                     && "xxx".equals(prefix.getValue()));
         }
     }
-    
+
 
     /**
-     * 
+     *
      */
     public void testFirstSuffix_xxxYYYZZZ()
     {
         /* Test  x x x . y y y . z z z */
         /*              ^              */
         {
-            ContentAssistStrategy prefix = ContentAssistParser.getPrefix(5, xxxYYYZZZ);
-            
+            final ContentAssistStrategy prefix = ContentAssistParser.getPrefix(5, xxxYYYZZZ);
+
             assertTrue(prefix.getType() == ContentAssistStrategy.PREFIX_TYPE_DOT_COMPLETION
                             && "xxx".equals(prefix.getValue()));
         }
@@ -271,33 +271,33 @@
         /* Test  x x x . y y y . z z z */
         /*                ^            */
         {
-            ContentAssistStrategy prefix = ContentAssistParser.getPrefix(6, xxxYYYZZZ);
-            
+            final ContentAssistStrategy prefix = ContentAssistParser.getPrefix(6, xxxYYYZZZ);
+
             assertTrue(prefix.getType() == ContentAssistStrategy.PREFIX_TYPE_DOT_COMPLETION
                             && "xxx".equals(prefix.getValue()));
         }
-        
+
         /* Test  x x x . y y y . z z z */
         /*                    ^        */
         {
-            ContentAssistStrategy prefix = ContentAssistParser.getPrefix(8, xxxYYYZZZ);
-            
+            final ContentAssistStrategy prefix = ContentAssistParser.getPrefix(8, xxxYYYZZZ);
+
             assertTrue(prefix.getType() == ContentAssistStrategy.PREFIX_TYPE_DOT_COMPLETION
                             && "xxx".equals(prefix.getValue()));
         }
     }
-    
-    
+
+
     /**
-     * 
+     *
      */
     public void testSecondSuffix_xxxYYYZZZ()
     {
         /* Test  x x x . y y y . z z z */
         /*                      ^      */
         {
-            ContentAssistStrategy prefix = ContentAssistParser.getPrefix(9, xxxYYYZZZ);
-            
+            final ContentAssistStrategy prefix = ContentAssistParser.getPrefix(9, xxxYYYZZZ);
+
             assertTrue(prefix.getType() == ContentAssistStrategy.PREFIX_TYPE_DOT_COMPLETION
                             && "xxx.yyy".equals(prefix.getValue()));
         }
@@ -305,59 +305,59 @@
         /* Test  x x x . y y y . z z z */
         /*                        ^    */
         {
-            ContentAssistStrategy prefix = ContentAssistParser.getPrefix(10, xxxYYYZZZ);
-            
+            final ContentAssistStrategy prefix = ContentAssistParser.getPrefix(10, xxxYYYZZZ);
+
             assertTrue(prefix.getType() == ContentAssistStrategy.PREFIX_TYPE_DOT_COMPLETION
                             && "xxx.yyy".equals(prefix.getValue()));
         }
-        
+
         /* Test  x x x . y y y . z z z */
         /*                            ^*/
         {
-            ContentAssistStrategy prefix = ContentAssistParser.getPrefix(12, xxxYYYZZZ);
-            
+            final ContentAssistStrategy prefix = ContentAssistParser.getPrefix(12, xxxYYYZZZ);
+
             assertTrue(prefix.getType() == ContentAssistStrategy.PREFIX_TYPE_DOT_COMPLETION
                             && "xxx.yyy".equals(prefix.getValue()));
         }
     }
-    
+
     /**
-     * 
+     *
      */
     public void testPrefix_xxxLtYYY()
     {
         /* Test  x x x  < y y y */
         /*      ^               */
         {
-            ContentAssistStrategy prefix = ContentAssistParser.getPrefix(1, xxxLtYYY);
-            
+            final ContentAssistStrategy prefix = ContentAssistParser.getPrefix(1, xxxLtYYY);
+
             assertTrue(prefix.getType() == ContentAssistStrategy.PREFIX_TYPE_ID_COMPLETION
                             && "xxx".equals(prefix.getValue()));
         }
-        
+
         /* Test  x x x  < y y y */
         /*        ^             */
         {
-            ContentAssistStrategy prefix = ContentAssistParser.getPrefix(2, xxxLtYYY);
-            
+            final ContentAssistStrategy prefix = ContentAssistParser.getPrefix(2, xxxLtYYY);
+
             assertTrue(prefix.getType() == ContentAssistStrategy.PREFIX_TYPE_ID_COMPLETION
                             && "xxx".equals(prefix.getValue()));
         }
-        
+
         /* Test  x x x  < y y y */
         /*            ^         */
         {
-            ContentAssistStrategy prefix = ContentAssistParser.getPrefix(4, xxxLtYYY);
-            
+            final ContentAssistStrategy prefix = ContentAssistParser.getPrefix(4, xxxLtYYY);
+
             assertTrue(prefix.getType() == ContentAssistStrategy.PREFIX_TYPE_ID_COMPLETION
                             && "xxx".equals(prefix.getValue()));
         }
-        
+
         /* Test  x x x  < y y y */
         /*               ^      */
         {
-            ContentAssistStrategy prefix = ContentAssistParser.getPrefix(7, xxxLtYYY);
-            
+            final ContentAssistStrategy prefix = ContentAssistParser.getPrefix(7, xxxLtYYY);
+
             assertTrue(prefix.getType() == ContentAssistStrategy.PREFIX_TYPE_ID_COMPLETION
                             && "yyy".equals(prefix.getValue()));
         }
@@ -365,32 +365,32 @@
         /* Test  x x x  < y y y */
         /*                 ^    */
         {
-            ContentAssistStrategy prefix = ContentAssistParser.getPrefix(8, xxxLtYYY);
-            
+            final ContentAssistStrategy prefix = ContentAssistParser.getPrefix(8, xxxLtYYY);
+
             assertTrue(prefix.getType() == ContentAssistStrategy.PREFIX_TYPE_ID_COMPLETION
                             && "yyy".equals(prefix.getValue()));
         }
-        
+
         /* Test  x x x  < y y y */
         /*                 ^    */
         {
-            ContentAssistStrategy prefix = ContentAssistParser.getPrefix(10, xxxLtYYY);
-            
+            final ContentAssistStrategy prefix = ContentAssistParser.getPrefix(10, xxxLtYYY);
+
             assertTrue(prefix.getType() == ContentAssistStrategy.PREFIX_TYPE_ID_COMPLETION
                             && "yyy".equals(prefix.getValue()));
         }
     }
 
     /**
-     * 
+     *
      */
     public void testPrefix_xxxDotYYYLtZZZ()
     {
         /* Test  x x x . y y y < z z z */
         /*      ^                      */
         {
-            ContentAssistStrategy prefix = ContentAssistParser.getPrefix(1, xxxDotYYYLtZZZ);
-            
+            final ContentAssistStrategy prefix = ContentAssistParser.getPrefix(1, xxxDotYYYLtZZZ);
+
             assertTrue(prefix.getType() == ContentAssistStrategy.PREFIX_TYPE_ID_COMPLETION
                             && "xxx".equals(prefix.getValue()));
         }
@@ -398,8 +398,8 @@
         /* Test  x x x . y y y < z z z */
         /*        ^                    */
         {
-            ContentAssistStrategy prefix = ContentAssistParser.getPrefix(2, xxxDotYYYLtZZZ);
-            
+            final ContentAssistStrategy prefix = ContentAssistParser.getPrefix(2, xxxDotYYYLtZZZ);
+
             assertTrue(prefix.getType() == ContentAssistStrategy.PREFIX_TYPE_ID_COMPLETION
                             && "xxx".equals(prefix.getValue()));
         }
@@ -407,8 +407,8 @@
         /* Test  x x x . y y y < z z z */
         /*            ^                */
         {
-            ContentAssistStrategy prefix = ContentAssistParser.getPrefix(4, xxxDotYYYLtZZZ);
-            
+            final ContentAssistStrategy prefix = ContentAssistParser.getPrefix(4, xxxDotYYYLtZZZ);
+
             assertTrue(prefix.getType() == ContentAssistStrategy.PREFIX_TYPE_ID_COMPLETION
                             && "xxx".equals(prefix.getValue()));
         }
@@ -416,8 +416,8 @@
         /* Test  x x x . y y y < z z z */
         /*              ^              */
         {
-            ContentAssistStrategy prefix = ContentAssistParser.getPrefix(5, xxxDotYYYLtZZZ);
-            
+            final ContentAssistStrategy prefix = ContentAssistParser.getPrefix(5, xxxDotYYYLtZZZ);
+
             assertTrue(prefix.getType() == ContentAssistStrategy.PREFIX_TYPE_DOT_COMPLETION
                             && "xxx".equals(prefix.getValue()));
         }
@@ -425,8 +425,8 @@
         /* Test  x x x . y y y < z z z */
         /*                ^            */
         {
-            ContentAssistStrategy prefix = ContentAssistParser.getPrefix(6, xxxDotYYYLtZZZ);
-            
+            final ContentAssistStrategy prefix = ContentAssistParser.getPrefix(6, xxxDotYYYLtZZZ);
+
             assertTrue(prefix.getType() == ContentAssistStrategy.PREFIX_TYPE_DOT_COMPLETION
                             && "xxx".equals(prefix.getValue()));
         }
@@ -434,8 +434,8 @@
         /* Test  x x x . y y y < z z z */
         /*                    ^        */
         {
-            ContentAssistStrategy prefix = ContentAssistParser.getPrefix(8, xxxDotYYYLtZZZ);
-            
+            final ContentAssistStrategy prefix = ContentAssistParser.getPrefix(8, xxxDotYYYLtZZZ);
+
             assertTrue(prefix.getType() == ContentAssistStrategy.PREFIX_TYPE_DOT_COMPLETION
                             && "xxx".equals(prefix.getValue()));
         }
@@ -443,55 +443,55 @@
         /* Test  x x x . y y y < z z z */
         /*                      ^      */
         {
-            ContentAssistStrategy prefix = ContentAssistParser.getPrefix(11, xxxDotYYYLtZZZ);
-            
+            final ContentAssistStrategy prefix = ContentAssistParser.getPrefix(11, xxxDotYYYLtZZZ);
+
             assertTrue(prefix.getType() == ContentAssistStrategy.PREFIX_TYPE_ID_COMPLETION
                             && "zzz".equals(prefix.getValue()));
         }
-        
+
         /* Test  x x x . y y y < z z z */
         /*                            ^*/
         {
-            ContentAssistStrategy prefix = ContentAssistParser.getPrefix(14, xxxDotYYYLtZZZ);
-            
+            final ContentAssistStrategy prefix = ContentAssistParser.getPrefix(14, xxxDotYYYLtZZZ);
+
             assertTrue(prefix.getType() == ContentAssistStrategy.PREFIX_TYPE_ID_COMPLETION
                             && "zzz".equals(prefix.getValue()));
         }
     }
-    
+
     /**
-     * 
+     *
      */
     public void testSuffix_xxxDotYYYLtZZZ()
     {
         /* Test  x x x . y y y < z z z . */
         /*                              ^*/
         {
-            ContentAssistStrategy prefix = ContentAssistParser.getPrefix(15, xxxDotYYYLtZZZ+".");
-            
+            final ContentAssistStrategy prefix = ContentAssistParser.getPrefix(15, xxxDotYYYLtZZZ+".");
+
             assertTrue(prefix.getType() == ContentAssistStrategy.PREFIX_TYPE_DOT_COMPLETION
                             && "zzz".equals(prefix.getValue()));
         }
     }
-    
+
     /**
-     * 
+     *
      */
     public void testPrefix_xxxMapYYY()
     {
         /* Test  x x x [ ' y y y ' ] */
         /*      ^                    */
         {
-            ContentAssistStrategy prefix = ContentAssistParser.getPrefix(1, xxxMapYYY);
+            final ContentAssistStrategy prefix = ContentAssistParser.getPrefix(1, xxxMapYYY);
 
             assertTrue(prefix.getType() == ContentAssistStrategy.PREFIX_TYPE_ID_COMPLETION
                     && "xxx".equals(prefix.getValue()));
         }
-        
+
         /* Test  x x x [ ' y y y ' ] */
         /*        ^                  */
         {
-            ContentAssistStrategy prefix = ContentAssistParser.getPrefix(2, xxxMapYYY);
+            final ContentAssistStrategy prefix = ContentAssistParser.getPrefix(2, xxxMapYYY);
 
             assertTrue(prefix.getType() == ContentAssistStrategy.PREFIX_TYPE_ID_COMPLETION
                     && "xxx".equals(prefix.getValue()));
@@ -500,12 +500,12 @@
         /* Test  x x x [ ' y y y ' ] */
         /*            ^              */
         {
-            ContentAssistStrategy prefix = ContentAssistParser.getPrefix(4, xxxMapYYY);
+            final ContentAssistStrategy prefix = ContentAssistParser.getPrefix(4, xxxMapYYY);
 
             assertTrue(prefix.getType() == ContentAssistStrategy.PREFIX_TYPE_ID_COMPLETION
                     && "xxx".equals(prefix.getValue()));
         }
-        
+
         /* Test x x x [ ' y y y ' ]  */
         /*                         ^ */
 //        {
@@ -515,18 +515,18 @@
 //            assertTrue(prefix.getType() == ContentAssistStrategy.PREFIX_TYPE_DOT_COMPLETION
 //                    && "xxx['yyy']".equals(prefix.getValue()));
 //        }
-        
+
         /* Test x x x [ ' y y y ' ] .  */
         /*                           ^ */
         {
-            ContentAssistStrategy prefix = ContentAssistParser.getPrefix(12, xxxMapYYY+".");
+            final ContentAssistStrategy prefix = ContentAssistParser.getPrefix(12, xxxMapYYY+".");
 
             System.out.println(prefix.getValue());
             assertTrue(prefix.getType() == ContentAssistStrategy.PREFIX_TYPE_DOT_COMPLETION
                     && "xxx['yyy']".equals(prefix.getValue()));
         }
     }
-    
+
     /**
      * Test completion inside an array
      */
@@ -535,7 +535,7 @@
         /* Test x x x [ X X X ] */
         /*             ^ */
         {
-            ContentAssistStrategy prefix = ContentAssistParser.getPrefix(5, xxxMapXXXExpr);
+            final ContentAssistStrategy prefix = ContentAssistParser.getPrefix(5, xxxMapXXXExpr);
 
             assertTrue(prefix.getType() == ContentAssistStrategy.PREFIX_TYPE_ID_COMPLETION
                     && "XXX".equals(prefix.getValue()));
@@ -544,7 +544,7 @@
         /* Test x x x [ X X X ] */
         /*               ^ */
         {
-            ContentAssistStrategy prefix = ContentAssistParser.getPrefix(6, xxxMapXXXExpr);
+            final ContentAssistStrategy prefix = ContentAssistParser.getPrefix(6, xxxMapXXXExpr);
 
             assertTrue(prefix.getType() == ContentAssistStrategy.PREFIX_TYPE_ID_COMPLETION
                     && "XXX".equals(prefix.getValue()));
@@ -553,13 +553,13 @@
         /* Test x x x [ X X X ] */
         /*                   ^*/
         {
-            ContentAssistStrategy prefix = ContentAssistParser.getPrefix(8, xxxMapXXXExpr);
+            final ContentAssistStrategy prefix = ContentAssistParser.getPrefix(8, xxxMapXXXExpr);
 
             assertTrue(prefix.getType() == ContentAssistStrategy.PREFIX_TYPE_ID_COMPLETION
                     && "XXX".equals(prefix.getValue()));
         }
     }
-    
+
     /**
      * Tests suffix completions on dots inside brackets
      */
@@ -568,22 +568,22 @@
         /* Test x x x [ X X X . ] */
         /*                   ^*/
         {
-            ContentAssistStrategy prefix = ContentAssistParser.getPrefix(8, xxxMapXXXDotExpr);
+            final ContentAssistStrategy prefix = ContentAssistParser.getPrefix(8, xxxMapXXXDotExpr);
 
-            assertEquals(ContentAssistStrategy.PREFIX_TYPE_ID_COMPLETION, prefix.getType()); 
+            assertEquals(ContentAssistStrategy.PREFIX_TYPE_ID_COMPLETION, prefix.getType());
             assertEquals("XXX", prefix.getValue());
         }
-        
+
         /* Test x x x [ X X X . ] */
         /*                     ^*/
         {
-            ContentAssistStrategy prefix = ContentAssistParser.getPrefix(9, xxxMapXXXDotExpr);
+            final ContentAssistStrategy prefix = ContentAssistParser.getPrefix(9, xxxMapXXXDotExpr);
 
-            assertEquals(ContentAssistStrategy.PREFIX_TYPE_DOT_COMPLETION, prefix.getType()); 
+            assertEquals(ContentAssistStrategy.PREFIX_TYPE_DOT_COMPLETION, prefix.getType());
             assertEquals("XXX", prefix.getValue());
         }
     }
-    
+
     /**
      * Test dot completion inside an array expression
      */
@@ -592,49 +592,49 @@
         /* Test x x x [ X X X . Y Y Y ] */
         /*                     ^*/
         {
-            ContentAssistStrategy prefix = ContentAssistParser.getPrefix(9, xxxMapXXXDotYYYExpr);
+            final ContentAssistStrategy prefix = ContentAssistParser.getPrefix(9, xxxMapXXXDotYYYExpr);
 
-            assertEquals(ContentAssistStrategy.PREFIX_TYPE_DOT_COMPLETION, prefix.getType()); 
+            assertEquals(ContentAssistStrategy.PREFIX_TYPE_DOT_COMPLETION, prefix.getType());
             assertEquals("XXX", prefix.getValue());
         }
 
         /* Test x x x [ X X X . Y Y Y ] */
         /*                       ^*/
         {
-            ContentAssistStrategy prefix = ContentAssistParser.getPrefix(10, xxxMapXXXDotYYYExpr);
+            final ContentAssistStrategy prefix = ContentAssistParser.getPrefix(10, xxxMapXXXDotYYYExpr);
 
-            assertEquals(ContentAssistStrategy.PREFIX_TYPE_DOT_COMPLETION, prefix.getType()); 
+            assertEquals(ContentAssistStrategy.PREFIX_TYPE_DOT_COMPLETION, prefix.getType());
             assertEquals("XXX", prefix.getValue());
         }
-        
+
         /* Test x x x [ X X X . Y Y Y ] */
         /*                           ^*/
         {
-            ContentAssistStrategy prefix = ContentAssistParser.getPrefix(12, xxxMapXXXDotYYYExpr);
+            final ContentAssistStrategy prefix = ContentAssistParser.getPrefix(12, xxxMapXXXDotYYYExpr);
 
-            assertEquals(ContentAssistStrategy.PREFIX_TYPE_DOT_COMPLETION, prefix.getType()); 
+            assertEquals(ContentAssistStrategy.PREFIX_TYPE_DOT_COMPLETION, prefix.getType());
             assertEquals("XXX", prefix.getValue());
         }
 
         /* Test x x x [ X X X . Y Y Y . ] */
         /*                           ^*/
         {
-            ContentAssistStrategy prefix = ContentAssistParser.getPrefix(12, xxxMapXXXDotYYYDotExpr);
+            final ContentAssistStrategy prefix = ContentAssistParser.getPrefix(12, xxxMapXXXDotYYYDotExpr);
 
-            assertEquals(ContentAssistStrategy.PREFIX_TYPE_DOT_COMPLETION, prefix.getType()); 
+            assertEquals(ContentAssistStrategy.PREFIX_TYPE_DOT_COMPLETION, prefix.getType());
             assertEquals("XXX", prefix.getValue());
         }
 
         /* Test x x x [ X X X . Y Y Y . ] */
         /*                             ^*/
         {
-            ContentAssistStrategy prefix = ContentAssistParser.getPrefix(13, xxxMapXXXDotYYYDotExpr);
+            final ContentAssistStrategy prefix = ContentAssistParser.getPrefix(13, xxxMapXXXDotYYYDotExpr);
 
-            assertEquals(ContentAssistStrategy.PREFIX_TYPE_DOT_COMPLETION, prefix.getType()); 
+            assertEquals(ContentAssistStrategy.PREFIX_TYPE_DOT_COMPLETION, prefix.getType());
             assertEquals("XXX.YYY", prefix.getValue());
         }
     }
-    
+
     /**
      * Test dot completion on XXX.YYY.ZZZ type expressions
      */
@@ -643,27 +643,27 @@
         /* Test x x x [ X X X . Y Y Y . Z Z Z] */
         /*                             ^*/
         {
-            ContentAssistStrategy prefix = ContentAssistParser.getPrefix(13, xxxMapXXXDotYYYDotZZZExpr);
+            final ContentAssistStrategy prefix = ContentAssistParser.getPrefix(13, xxxMapXXXDotYYYDotZZZExpr);
 
-            assertEquals(ContentAssistStrategy.PREFIX_TYPE_DOT_COMPLETION, prefix.getType()); 
+            assertEquals(ContentAssistStrategy.PREFIX_TYPE_DOT_COMPLETION, prefix.getType());
             assertEquals("XXX.YYY", prefix.getValue());
         }
 
         /* Test x x x [ X X X . Y Y Y . Z Z Z] */
         /*                               ^*/
         {
-            ContentAssistStrategy prefix = ContentAssistParser.getPrefix(14, xxxMapXXXDotYYYDotZZZExpr);
+            final ContentAssistStrategy prefix = ContentAssistParser.getPrefix(14, xxxMapXXXDotYYYDotZZZExpr);
 
-            assertEquals(ContentAssistStrategy.PREFIX_TYPE_DOT_COMPLETION, prefix.getType()); 
+            assertEquals(ContentAssistStrategy.PREFIX_TYPE_DOT_COMPLETION, prefix.getType());
             assertEquals("XXX.YYY", prefix.getValue());
         }
 
         /* Test x x x [ X X X . Y Y Y . Z Z Z ] */
         /*                                   ^*/
         {
-            ContentAssistStrategy prefix = ContentAssistParser.getPrefix(16, xxxMapXXXDotYYYDotZZZExpr);
+            final ContentAssistStrategy prefix = ContentAssistParser.getPrefix(16, xxxMapXXXDotYYYDotZZZExpr);
 
-            assertEquals(ContentAssistStrategy.PREFIX_TYPE_DOT_COMPLETION, prefix.getType()); 
+            assertEquals(ContentAssistStrategy.PREFIX_TYPE_DOT_COMPLETION, prefix.getType());
             assertEquals("XXX.YYY", prefix.getValue());
         }
 
diff --git a/jsf/tests/org.eclipse.jst.jsf.contentassist.tests/src/org/eclipse/jst/jsf/contentassist/tests/ContentAssistTestsPlugin.java b/jsf/tests/org.eclipse.jst.jsf.contentassist.tests/src/org/eclipse/jst/jsf/contentassist/tests/ContentAssistTestsPlugin.java
index 883b8c9..4bda030 100644
--- a/jsf/tests/org.eclipse.jst.jsf.contentassist.tests/src/org/eclipse/jst/jsf/contentassist/tests/ContentAssistTestsPlugin.java
+++ b/jsf/tests/org.eclipse.jst.jsf.contentassist.tests/src/org/eclipse/jst/jsf/contentassist/tests/ContentAssistTestsPlugin.java
@@ -7,7 +7,7 @@
  *
  * Contributors:
  *    Cameron Bateman/Oracle - initial API and implementation
- *    
+ *
  ********************************************************************************/
 
 package org.eclipse.jst.jsf.contentassist.tests;
@@ -27,7 +27,7 @@
 
 	// The shared instance
 	private static ContentAssistTestsPlugin plugin;
-	
+
 	/**
 	 * The constructor
 	 */
@@ -39,7 +39,8 @@
 	 * (non-Javadoc)
 	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
 	 */
-	public void start(BundleContext context) throws Exception {
+	@Override
+	public void start(final BundleContext context) throws Exception {
 		super.start(context);
 	}
 
@@ -47,7 +48,8 @@
 	 * (non-Javadoc)
 	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
 	 */
-	public void stop(BundleContext context) throws Exception {
+	@Override
+	public void stop(final BundleContext context) throws Exception {
 		plugin = null;
 		super.stop(context);
 	}
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
new file mode 100644
index 0000000..03cd4f1
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.jsf.contentassist.tests/src/org/eclipse/jst/jsf/contentassist/tests/TestContentAssistParser.java
@@ -0,0 +1,108 @@
+package org.eclipse.jst.jsf.contentassist.tests;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jst.jsf.context.symbol.IBeanInstanceSymbol;
+import org.eclipse.jst.jsf.context.symbol.IBeanMethodSymbol;
+import org.eclipse.jst.jsf.context.symbol.IBeanPropertySymbol;
+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.JSFFacetedTestEnvironment;
+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;
+
+public class TestContentAssistParser extends BaseTestClass
+{
+	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
+	{
+		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}");
+
+		assertELVariableSanity(_jspFile, "myBean");
+	}
+
+
+	public void testGetPrefix() {
+		// for now there's a enough coverage through TestIdCompletionStrategy
+	}
+
+	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, "   "));
+
+		// variable test
+		SymbolInfo symbolInfo =
+			ContentAssistParser.getSymbolInfo(getDocumentContext(_jspFile, 579).getContext(), 1, "myBean");
+		assertNotNull(symbolInfo);
+		assertEquals("myBean", symbolInfo.getSymbol().getName());
+		assertTrue(symbolInfo.getSymbol() instanceof IBeanInstanceSymbol);
+		assertNotNull(symbolInfo.getRelativeRegion());
+		assertEquals(6, symbolInfo.getRelativeRegion().getLength());
+
+		// property test
+		symbolInfo =
+			ContentAssistParser.getSymbolInfo(getDocumentContext(_jspFile, 614).getContext(), 8, "myBean.property");
+		assertNotNull(symbolInfo);
+		assertEquals("property", symbolInfo.getSymbol().getName());
+		assertTrue(symbolInfo.getSymbol() instanceof IBeanPropertySymbol);
+		assertNotNull(symbolInfo.getRelativeRegion());
+
+		// method test
+		symbolInfo =
+			ContentAssistParser.getSymbolInfo(getDocumentContext(_jspFile, 706).getContext(), 8, "myBean.actionMethod");
+		assertNotNull(symbolInfo);
+		assertEquals("actionMethod", symbolInfo.getSymbol().getName());
+		assertTrue(symbolInfo.getSymbol() instanceof IBeanMethodSymbol);
+		assertNotNull(symbolInfo.getRelativeRegion());
+	}
+
+}
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 5bd76be..3f7b7b2 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
@@ -4,14 +4,20 @@
  * are made available under the terms 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
  *******************************************************************************/
 package org.eclipse.jst.jsf.contentassist.tests;
 
-import junit.framework.TestCase;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
 
+import org.eclipse.core.resources.IFile;
+import org.eclipse.jdt.core.IType;
+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.JSFFacetedTestEnvironment;
 import org.eclipse.jst.jsf.test.util.JDTTestEnvironment;
@@ -24,10 +30,14 @@
  * @author cbateman
  *
  */
-public class TestFunctionCompletionStrategy extends TestCase {
+public class TestFunctionCompletionStrategy extends BaseTestClass
+{
     private WebProjectTestEnvironment       _testEnv;
-    
-    protected void setUp() throws Exception 
+    private IFile							_jspFile;
+    private IType							_myBeanType;
+
+    @Override
+	protected void setUp() throws Exception
     {
         super.setUp();
 
@@ -35,32 +45,83 @@
 
         _testEnv = new WebProjectTestEnvironment(getClass().getName()+"_"+getName());
         _testEnv.createProject(false);
-        assertNotNull(_testEnv);       
+        assertNotNull(_testEnv);
         assertNotNull(_testEnv.getTestProject());
         assertTrue(_testEnv.getTestProject().isAccessible());
-        
-        JSFFacetedTestEnvironment jsfFacedEnv = new JSFFacetedTestEnvironment(_testEnv);
+
+        final JSFFacetedTestEnvironment jsfFacedEnv = new JSFFacetedTestEnvironment(_testEnv);
         jsfFacedEnv.initialize(IJSFCoreConstants.FACET_VERSION_1_1);
-        
+
         _testEnv.loadResourceInWebRoot(ContentAssistTestsPlugin.getDefault().getBundle(),
-                                      "/testdata/faces-config_bug149743.xml.data", 
+                                      "/testdata/faces-config_basic.xml.data",
                                       "/WEB-INF/faces-config.xml");
-        _testEnv.loadResourceInWebRoot(ContentAssistTestsPlugin.getDefault().getBundle(),
-                                      "/testdata/bug_149743.jsp.data",
-                                      "/bug_149743.jsp");
-        
+        _jspFile = (IFile) _testEnv.loadResourceInWebRoot(ContentAssistTestsPlugin.getDefault().getBundle(),
+                                      "/testdata/basicELExpressions.jsp.data",
+                                      "/basicELExpressions.jsp");
+        assertNotNull(_jspFile);
+        assertTrue(_jspFile.isAccessible());
+
         final JDTTestEnvironment jdtTestEnv = new JDTTestEnvironment(_testEnv);
-        TestFileResource resource = new TestFileResource();
-        resource.load(ContentAssistTestsPlugin.getDefault().getBundle(), 
+        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());
     }
 
     /**
      * Sanity check
      */
-//    public void testSanity()
-//    {
-//    }
+    public void testSanity() throws Exception
+    {
+		assertELSanity(_jspFile, 614, "value", "#{myBean.property}");
+		assertELSanity(_jspFile, 658, "value", "#{paramValues.foo}");
+		assertELSanity(_jspFile, 706, "action", "#{myBean.actionMethod}");
+
+		assertELVariableSanity(_jspFile, "myBean");
+    }
+
+    public void testFunctionCompletionStrategy() throws Exception
+    {
+    	// normal value binding only has properties
+    	List<ICompletionProposal>  proposals = getProposals(_jspFile, 614, 8);
+
+    	{
+	    	final Set<String> propNames = new HashSet<String>();
+	    	propNames.add("property");
+	    	propNames.add("class");
+	    	assertDisplayNamesMatch(propNames, proposals);
+    	}
+
+    	// method binding includes methods and also properties
+    	proposals = getProposals(_jspFile, 706, 8);
+
+    	{
+	    	final Set<String> propNames = new HashSet<String>();
+	    	propNames.add("property");
+	    	propNames.add("class");
+	    	propNames.add("getProperty");
+	    	propNames.add("actionMethod");
+	    	propNames.add("equals");
+	    	propNames.add("getClass");
+	    	propNames.add("hashCode");
+	    	propNames.add("notify");
+	    	propNames.add("notifyAll");
+	    	propNames.add("toString");
+	    	propNames.add("wait");
+	    	propNames.add("wait");
+	    	propNames.add("wait");
+
+	    	assertEquals(13, proposals.size());
+	    	// have to loop through explicitly here because wait appears
+	    	// in the list thrice, but can only be in the set once
+	    	for (final ICompletionProposal prop : proposals)
+	    	{
+	    		assertTrue(propNames.contains(prop.getDisplayString()));
+	    	}
+    	}
+    }
 
 }
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
new file mode 100644
index 0000000..b73ee12
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.jsf.contentassist.tests/src/org/eclipse/jst/jsf/contentassist/tests/TestIdCompletionStrategy.java
@@ -0,0 +1,119 @@
+package org.eclipse.jst.jsf.contentassist.tests;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.core.resources.IFile;
+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.JSFFacetedTestEnvironment;
+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;
+
+public class TestIdCompletionStrategy extends BaseTestClass
+{
+	private final static Set<String>   DISPLAY_NAMES;
+
+	static
+	{
+		final Set<String>  displayNames = new HashSet<String>();
+		displayNames.add("requestScope");
+		displayNames.add("cookie");
+		displayNames.add("header");
+		displayNames.add("headerValues");
+		displayNames.add("param");
+		displayNames.add("paramValues");
+		displayNames.add("facesContext");
+		displayNames.add("view");
+		displayNames.add("initParam");
+		displayNames.add("sessionScope");
+		displayNames.add("applicationScope");
+		displayNames.add("myBean");
+		DISPLAY_NAMES = Collections.unmodifiableSet(displayNames);
+	}
+	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
+	{
+		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}");
+
+		assertEquals(12, DISPLAY_NAMES.size());
+	}
+
+	public void testGetProposals() {
+
+	}
+
+	public void testIdCompletionStrategy() throws Exception
+	{
+		// empty string has all
+		assertDisplayNamesMatch(DISPLAY_NAMES, getProposals(_jspFile, 518, "", 1));
+
+		// empty whitespace has all
+		assertDisplayNamesMatch(DISPLAY_NAMES, getProposals(_jspFile, 547, 1));
+
+		// at the very start of a variable, have all
+		assertDisplayNamesMatch(DISPLAY_NAMES, getProposals(_jspFile, 579, 1));
+		// one character in, only ones matching prefix
+		assertDisplayNamesMatch(Collections.singleton("myBean"), getProposals(_jspFile, 579, 2));
+
+		// having properties should not change the variable resolved
+		assertDisplayNamesMatch(DISPLAY_NAMES, getProposals(_jspFile, 614, 1));
+		// one character in, only ones matching prefix
+		assertDisplayNamesMatch(Collections.singleton("myBean"), getProposals(_jspFile, 614, 2));
+
+		// having properties should not change the variable resolved
+		assertDisplayNamesMatch(DISPLAY_NAMES, getProposals(_jspFile, 658, 1));
+		// one character in, only ones matching prefix
+		final Set<String> paramNames = new HashSet<String>();
+		paramNames.add("param");
+		paramNames.add("paramValues");
+		assertDisplayNamesMatch(Collections.unmodifiableSet(paramNames), getProposals(_jspFile, 658, 2));
+	}
+}
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 ddbe91c..4216c18 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
@@ -4,82 +4,65 @@
  * are made available under the terms 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
  *******************************************************************************/
 package org.eclipse.jst.jsf.contentassist.tests;
 
 import java.io.ByteArrayInputStream;
-import java.util.Iterator;
 import java.util.List;
 
-import junit.framework.TestCase;
-
 import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.Path;
 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.IJSFCoreConstants;
-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.core.tests.util.JSFFacetedTestEnvironment;
-import org.eclipse.jst.jsf.designtime.resolver.ISymbolContextResolver;
-import org.eclipse.jst.jsf.designtime.resolver.StructuredDocumentSymbolResolverFactory;
 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.jsp.core.internal.domdocument.DOMModelForJSP;
-import org.eclipse.wst.sse.core.StructuredModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Node;
 
 /**
  * Regression test for 149224 -- replace '.' on completion with [] style of
  * map
- * 
+ *
  * @author cbateman
  *
  */
-public class Test_bug_149224 extends TestCase 
+public class Test_bug_149224 extends BaseTestClass
 {
     private WebProjectTestEnvironment       _testEnv;
-    
-    protected void setUp() throws Exception 
+    private IFile							_jspFile;
+
+    @Override
+	protected void setUp() throws Exception
     {
         super.setUp();
 
         JSFTestUtil.setValidationEnabled(false);
-        
+
         _testEnv = new WebProjectTestEnvironment("Test_bug_149224_"+getName());
         _testEnv.createProject(false);
-        assertNotNull(_testEnv);       
+        assertNotNull(_testEnv);
         assertNotNull(_testEnv.getTestProject());
         assertTrue(_testEnv.getTestProject().isAccessible());
-        
-        JSFFacetedTestEnvironment jsfFacedEnv = new JSFFacetedTestEnvironment(_testEnv);
+
+        final JSFFacetedTestEnvironment jsfFacedEnv = new JSFFacetedTestEnvironment(_testEnv);
         jsfFacedEnv.initialize(IJSFCoreConstants.FACET_VERSION_1_1);
-        
-        _testEnv.loadResourceInWebRoot(ContentAssistTestsPlugin.getDefault().getBundle(),
+
+        _jspFile = (IFile) _testEnv.loadResourceInWebRoot(ContentAssistTestsPlugin.getDefault().getBundle(),
                                       "/testdata/bug_149224_1.jsp.data",
                                       "/bug_149224.jsp");
-        
+
+        assertNotNull(_jspFile);
+        assertTrue(_jspFile.isAccessible());
+
         final JDTTestEnvironment jdtTestEnv = new JDTTestEnvironment(_testEnv);
         TestFileResource resource = new TestFileResource();
-        resource.load(ContentAssistTestsPlugin.getDefault().getBundle(), 
+        resource.load(ContentAssistTestsPlugin.getDefault().getBundle(),
                       "/testdata/MyBean.java.data");
         jdtTestEnv.addSourceFile("src", "beans", "MyBean", resource.toString());
-        
+
         resource = new TestFileResource();
         resource.load(ContentAssistTestsPlugin.getDefault().getBundle(),
                       "/testdata/bug_149224.properties.data");
@@ -90,44 +73,15 @@
     /**
      * Sanity check
      */
-    public void testSanity()
+    public void testSanity() throws Exception
     {
-        ContextWrapper wrapper = null;
-        
+        final ContextWrapper wrapper = null;
+
         try
         {
-            wrapper = getDocumentContext("/WebContent/bug_149224.jsp", 589);
-            IStructuredDocumentContext context = wrapper.getContext();
-            IDOMContextResolver resolver =
-                IStructuredDocumentContextResolverFactory.INSTANCE.
-                    getDOMContextResolver(context);
-            Node node = resolver.getNode();
-            JSFTestUtil.getIndexedRegion((IStructuredDocument) context.getStructuredDocument(), 589);
-            assertTrue(node instanceof Attr);
-            assertEquals("value", ((Attr)node).getNodeName());
-            assertEquals("#{bundle1.}", ((Attr)node).getNodeValue());
-            wrapper.dispose();
-            
-            wrapper = getDocumentContext("/WebContent/bug_149224.jsp", 630);
-            context = wrapper.getContext();
-            resolver =
-                IStructuredDocumentContextResolverFactory.INSTANCE.
-                    getDOMContextResolver(context);
-            node = resolver.getNode();
-            assertTrue(node instanceof Attr);
-            assertEquals("value", ((Attr)node).getNodeName());
-            assertEquals("#{bundle1.x}", ((Attr)node).getNodeValue());
-            
-            ISymbolContextResolver symbolResolver = 
-                StructuredDocumentSymbolResolverFactory.getInstance().
-                    getSymbolContextResolver(context);
-            ISymbol bundleVar = symbolResolver.getVariable("bundle1");
-            assertNotNull(bundleVar);
-        }
-        catch (Exception e)
-        {
-            e.printStackTrace();
-            fail(e.getLocalizedMessage());
+        	assertELSanity(_jspFile, 589, "value", "#{bundle1.}");
+        	assertELSanity(_jspFile, 630, "value", "#{bundle1.x}");
+            assertELVariableSanity(_jspFile, "bundle1");
         }
         finally
         {
@@ -137,113 +91,67 @@
             }
         }
     }
-    
+
     /**
      * Test the completion:
-     * 
+     *
      *      # { b u n d l e 1 . }
-     *                         ^ 
+     *                         ^
      */
-    @SuppressWarnings("unchecked")
-	public void testCompletionAtCloseBrace()
+	public void testCompletionAtCloseBrace() throws Exception
     {
-        ContextWrapper wrapper = null;
+		final List<ICompletionProposal> proposals =
+			getProposals(_jspFile, 589, "bundle1.",9);
+		assertNotNull(proposals);
+        ICompletionProposal proposal = null;
 
-        try
+        FIND_ARRAY_PROPOSAL:
+            for (final ICompletionProposal findProp : proposals)
         {
-            wrapper = getDocumentContext("/WebContent/bug_149224.jsp", 589);
-            final IStructuredDocumentContext context = wrapper.getContext();
-            ITextRegionContextResolver resolver = 
-                IStructuredDocumentContextResolverFactory.INSTANCE.getTextRegionResolver(context);
-            final ContentAssistStrategy strategy = 
-                ContentAssistParser.getPrefix(9, "bundle1.");
-
-            assertNotNull(strategy);
-            List proposals = strategy.getProposals(context);
-
-            ICompletionProposal proposal = null;
-
-            FIND_ARRAY_PROPOSAL: 
-                for (final Iterator it = proposals.iterator(); it.hasNext();)
+            // TODO: this is a bit of a hack.  Would rather be able
+            // to query for the actual replacement text
+            if (findProp.getDisplayString().startsWith("['"))
             {
-                proposal = (ICompletionProposal) it.next();
-                // TODO: this is a bit of a hack.  Would rather be able 
-                // to query for the actual replacement text
-                if (proposal.getDisplayString().startsWith("['"))
-                {
-                    break FIND_ARRAY_PROPOSAL;
-                }
-            }
-
-            assertNotNull(proposal);
-
-            proposal.apply(wrapper.getContext().getStructuredDocument());
-
-            String newELText = resolver.getRegionText();
-            assertEquals("bundle1['prop.with.dots_x']", newELText);
-        }
-        catch (Exception e)
-        {
-            e.printStackTrace();
-            fail(e.getLocalizedMessage());
-        }
-        finally
-        {
-            if (wrapper != null)
-            {
-                wrapper.dispose();
+            	proposal = findProp;
+                break FIND_ARRAY_PROPOSAL;
             }
         }
+
+        assertNotNull(proposal);
+
+        applyAndCheck(_jspFile, 589, proposal, "bundle1['prop.with.dots_x']");
     }
 
     /**
      * Test the completion:
-     * 
+     *
      *      # { b u n d l e 1 . x }
-     *                         ^ 
+     *                         ^
      */
-    @SuppressWarnings("unchecked")
-	public void testCompletionAtProperty()
+	public void testCompletionAtProperty() throws Exception
     {
-        ContextWrapper wrapper = null;
-        
+        final ContextWrapper wrapper = null;
+
         try
         {
-            wrapper = getDocumentContext("/WebContent/bug_149224.jsp", 630);
-            final IStructuredDocumentContext context = wrapper.getContext();
-            ITextRegionContextResolver resolver = 
-                IStructuredDocumentContextResolverFactory.INSTANCE.getTextRegionResolver(context);
-            final ContentAssistStrategy strategy = 
-                ContentAssistParser.getPrefix(9, "bundle1.x");
-            
-            assertNotNull(strategy);
-            List proposals = strategy.getProposals(context);
-            
+            final List<ICompletionProposal> proposals =
+            	getProposals(_jspFile, 630, 9);
+
             ICompletionProposal proposal = null;
-            
-            FIND_ARRAY_PROPOSAL: 
-                for (final Iterator it = proposals.iterator(); it.hasNext();)
-            {
-                proposal = (ICompletionProposal) it.next();
-                // TODO: this is a bit of a hack.  Would rather be able 
-                // to query for the actual replacement text
-                if (proposal.getDisplayString().startsWith("['"))
-                {
-                    break FIND_ARRAY_PROPOSAL;
-                }
-            }
+
+            FIND_ARRAY_PROPOSAL:
+                for (final ICompletionProposal completionProposal : proposals) {
+				    proposal = completionProposal;
+				    // TODO: this is a bit of a hack.  Would rather be able
+				    // to query for the actual replacement text
+				    if (proposal.getDisplayString().startsWith("['"))
+				    {
+				        break FIND_ARRAY_PROPOSAL;
+				    }
+				}
 
             assertNotNull(proposal);
-
-            proposal.apply(wrapper.getContext().getStructuredDocument());
-
-            String newELText = resolver.getRegionText();
-            assertEquals("bundle1['prop.with.dots_x']x", newELText);
-        }
-        catch (Exception e)
-        {
-            e.printStackTrace();
-            fail(e.getLocalizedMessage());
+            applyAndCheck(_jspFile, 630, proposal, "bundle1['prop.with.dots_x']x");
         }
         finally
         {
@@ -253,47 +161,4 @@
             }
         }
     }
-
-
-    private ContextWrapper getDocumentContext(String path, int offset) throws Exception
-    {
-        IProject project = _testEnv.getTestProject();
-        IFile jspFile = project.getFile(new Path(path));
-        assertTrue(jspFile.exists());
-        
-        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);
-    }
-    
-    
-    private 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();
-        }
-    }
 }
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 787a7f0..40e145c 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
@@ -7,7 +7,7 @@
  *
  * Contributors:
  *    Cameron Bateman/Oracle - initial API and implementation
- *    
+ *
  ********************************************************************************/
 package org.eclipse.jst.jsf.contentassist.tests;
 
@@ -15,69 +15,53 @@
 import java.util.List;
 import java.util.Set;
 
-import junit.framework.TestCase;
-
 import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.Path;
 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.core.IJSFCoreConstants;
-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.core.tests.util.JSFFacetedTestEnvironment;
 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.jsp.core.internal.domdocument.DOMModelForJSP;
-import org.eclipse.wst.sse.core.StructuredModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Node;
 
 /**
- * Test a situation where no expected return type information is 
+ * Test a situation where no expected return type information is
  * available for a tag.
- * 
+ *
  * @author cbateman
  *
  */
-public class Test_bug_149743 extends TestCase 
+public class Test_bug_149743 extends BaseTestClass
 {
     private WebProjectTestEnvironment       _testEnv;
-    
-    protected void setUp() throws Exception 
+    private IFile							_jspFile;
+
+    @Override
+	protected void setUp() throws Exception
     {
         super.setUp();
 
         JSFTestUtil.setValidationEnabled(false);
-        
+
         _testEnv = new WebProjectTestEnvironment("Test_bug_149743_"+getName());
         _testEnv.createProject(false);
-        assertNotNull(_testEnv);       
+        assertNotNull(_testEnv);
         assertNotNull(_testEnv.getTestProject());
         assertTrue(_testEnv.getTestProject().isAccessible());
-        
-        JSFFacetedTestEnvironment jsfFacedEnv = new JSFFacetedTestEnvironment(_testEnv);
+
+        final JSFFacetedTestEnvironment jsfFacedEnv = new JSFFacetedTestEnvironment(_testEnv);
         jsfFacedEnv.initialize(IJSFCoreConstants.FACET_VERSION_1_1);
-        
+
         _testEnv.loadResourceInWebRoot(ContentAssistTestsPlugin.getDefault().getBundle(),
-                                      "/testdata/faces-config_bug149743.xml.data", 
+                                      "/testdata/faces-config_bug149743.xml.data",
                                       "/WEB-INF/faces-config.xml");
-        _testEnv.loadResourceInWebRoot(ContentAssistTestsPlugin.getDefault().getBundle(),
+        _jspFile = (IFile) _testEnv.loadResourceInWebRoot(ContentAssistTestsPlugin.getDefault().getBundle(),
                                       "/testdata/bug_149743.jsp.data",
                                       "/bug_149743.jsp");
-        
+
         final JDTTestEnvironment jdtTestEnv = new JDTTestEnvironment(_testEnv);
-        TestFileResource resource = new TestFileResource();
-        resource.load(ContentAssistTestsPlugin.getDefault().getBundle(), 
+        final TestFileResource resource = new TestFileResource();
+        resource.load(ContentAssistTestsPlugin.getDefault().getBundle(),
                       "/testdata/MyBean.java.data");
         jdtTestEnv.addSourceFile("src", "beans", "MyBean", resource.toString());
     }
@@ -87,110 +71,29 @@
      */
     public void testSanity() throws Exception
     {
-        ContextWrapper wrapper = null;
-        
-        try
-        {
-            wrapper = getDocumentContext();
-            final IStructuredDocumentContext context = wrapper.getContext();
-            final IDOMContextResolver resolver =
-                IStructuredDocumentContextResolverFactory.INSTANCE.
-                    getDOMContextResolver(context);
-            Node node = resolver.getNode();
-            JSFTestUtil.getIndexedRegion((IStructuredDocument) context.getStructuredDocument(), context.getDocumentPosition());
-            assertTrue(node instanceof Attr);
-            assertEquals("value", ((Attr)node).getNodeName());
-            assertEquals("#{myBean.property}", ((Attr)node).getNodeValue());
-        }
-        finally
-        {
-            if (wrapper != null)
-            {
-                wrapper.dispose();
-            }
-        }
+        assertELSanity(_jspFile, 529, "value" ,"#{myBean.property}");
+        assertELVariableSanity(_jspFile, "myBean");
     }
-    
+
     /**
      * Checks the scenario for Test_bug_149743
      */
     public void testCompletionProposalsForId() throws Exception
     {
-        ContextWrapper wrapper = null;
-        
-        try
+        final List<ICompletionProposal> proposals =
+        	getProposals(_jspFile, 529, 8);
+        assertEquals(2, proposals.size());
+        final Set<String>  names = new HashSet<String>();
+
+        for (final ICompletionProposal proposal : proposals)
         {
-            wrapper = getDocumentContext();
-            ITextRegionContextResolver  resolver = 
-                IStructuredDocumentContextResolverFactory.INSTANCE.
-                    getTextRegionResolver(wrapper.getContext());
-    
-            final String elText = resolver.getRegionText().trim();
-            assertNotNull(elText);
-
-            final ContentAssistStrategy strategy = 
-                ContentAssistParser.getPrefix
-                    (wrapper.getContext().getDocumentPosition() 
-                            - resolver.getStartOffset() + 1, elText);
-
-            List<?> proposals = strategy.getProposals(wrapper.getContext());
-            assertEquals(2, proposals.size());
-            Set<String>  names = new HashSet<String>();
-            
-            for (int i = 0; i < proposals.size(); i++)
-            {
-                names.add(((ICompletionProposal)proposals.get(i)).getDisplayString());
-            }
-            assertTrue(names.contains("class"));
-            assertTrue(names.contains("property"));
+            names.add(proposal.getDisplayString());
         }
-        finally
-        {
-            if (wrapper != null)
-            {
-                wrapper.dispose();
-            }
-        }
-    }
-    
-    private ContextWrapper getDocumentContext() throws Exception
-    {
-        IProject project = _testEnv.getTestProject();
-        IFile jspFile = project.getFile(new Path("/WebContent/bug_149743.jsp"));
-        assertTrue(jspFile.exists());
-        
-        final IModelManager modelManager = 
-            StructuredModelManager.getModelManager();
-
-        IStructuredModel model = null;
-        
-        model = modelManager.getModelForRead(jspFile);
-        assertTrue(model instanceof DOMModelForJSP);
-        final IStructuredDocumentContext context = 
-            IStructuredDocumentContextFactory.INSTANCE.
-                getContext(model.getStructuredDocument(), 529);
-        return new ContextWrapper(context, model);
+        assertTrue(names.contains("class"));
+        assertTrue(names.contains("property"));
     }
 
-    private 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();
-        }
-    }
+
+
+
 }
diff --git a/jsf/tests/org.eclipse.jst.jsf.contentassist.tests/testdata/MyBean.java.data b/jsf/tests/org.eclipse.jst.jsf.contentassist.tests/testdata/MyBean.java.data
index e683924..7de1772 100644
--- a/jsf/tests/org.eclipse.jst.jsf.contentassist.tests/testdata/MyBean.java.data
+++ b/jsf/tests/org.eclipse.jst.jsf.contentassist.tests/testdata/MyBean.java.data
@@ -5,4 +5,9 @@
 	{
 		return new String[]{"blah"};
 	}
-}
\ No newline at end of file
+
+	public String actionMethod()
+	{
+		return "foo";
+	}
+}
diff --git a/jsf/tests/org.eclipse.jst.jsf.contentassist.tests/testdata/basicELExpressions.jsp.data b/jsf/tests/org.eclipse.jst.jsf.contentassist.tests/testdata/basicELExpressions.jsp.data
new file mode 100644
index 0000000..aba8370
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.jsf.contentassist.tests/testdata/basicELExpressions.jsp.data
@@ -0,0 +1,28 @@
+<%@page contentType="text/html"%>
+<%@page pageEncoding="UTF-8"%>
+ 
+<%@taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
+<%@taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
+
+
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+   "http://www.w3.org/TR/html4/loose.dtd">
+
+<html>
+  <head>
+  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+        <title>JSP Page</title>
+    </head>
+    <body>
+    <f:view>
+    <h1>JSP Page</h1>
+    	<!--  no errors -->
+	<h:outputText value="#{}"/>
+	<h:outputText value="#{   }"/>
+	<h:outputText value="#{myBean}"/>
+	<h:outputText value="#{myBean.property}"/>
+	<h:outputText value="#{paramValues.foo}"/>
+	<h:commandButton action="#{myBean.actionMethod}"/>
+    </f:view>
+    </body>
+</html>
diff --git a/jsf/tests/org.eclipse.jst.jsf.contentassist.tests/testdata/faces-config_basic.xml.data b/jsf/tests/org.eclipse.jst.jsf.contentassist.tests/testdata/faces-config_basic.xml.data
new file mode 100644
index 0000000..e4a475b
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.jsf.contentassist.tests/testdata/faces-config_basic.xml.data
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!DOCTYPE faces-config PUBLIC
+    "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN"
+    "http://java.sun.com/dtd/web-facesconfig_1_1.dtd">
+
+<faces-config>
+	<managed-bean>
+		<managed-bean-name>
+		myBean</managed-bean-name>
+		<managed-bean-class>
+		beans.MyBean</managed-bean-class>
+		<managed-bean-scope>
+		none</managed-bean-scope>
+	</managed-bean>
+
+</faces-config>
