diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/operations/JavaEEFacetConstants.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/operations/JavaEEFacetConstants.java
index 287f332..808ff5f 100644
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/operations/JavaEEFacetConstants.java
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/operations/JavaEEFacetConstants.java
@@ -13,6 +13,7 @@
 	public static final IProjectFacetVersion APP_CLIENT_14 = APP_CLIENT_FACET.getVersion("1.4"); //$NON-NLS-1$
 	public static final IProjectFacetVersion APP_CLIENT_5 = APP_CLIENT_FACET.getVersion("5.0"); //$NON-NLS-1$
 	public static final IProjectFacetVersion APP_CLIENT_6 = APP_CLIENT_FACET.getVersion("6.0"); //$NON-NLS-1$
+	public static final IProjectFacetVersion APP_CLIENT_7 = APP_CLIENT_FACET.getVersion("7.0"); //$NON-NLS-1$
 	
 	public static final IProjectFacet EJB_FACET = ProjectFacetsManager.getProjectFacet(IModuleConstants.JST_EJB_MODULE); //$NON-NLS-1$
 	public static final IProjectFacetVersion EJB_11 = EJB_FACET.getVersion("1.1"); //$NON-NLS-1$
@@ -20,6 +21,7 @@
 	public static final IProjectFacetVersion EJB_21 = EJB_FACET.getVersion("2.1"); //$NON-NLS-1$
 	public static final IProjectFacetVersion EJB_3 = EJB_FACET.getVersion("3.0"); //$NON-NLS-1$
 	public static final IProjectFacetVersion EJB_31 = EJB_FACET.getVersion("3.1"); //$NON-NLS-1$
+	public static final IProjectFacetVersion EJB_32 = EJB_FACET.getVersion("3.2"); //$NON-NLS-1$
 	
 	public static final IProjectFacet WEB_FACET = ProjectFacetsManager.getProjectFacet(IModuleConstants.JST_WEB_MODULE); //$NON-NLS-1$
 	public static final IProjectFacetVersion WEB_22 = WEB_FACET.getVersion("2.2"); //$NON-NLS-1$
@@ -27,11 +29,13 @@
 	public static final IProjectFacetVersion WEB_24 = WEB_FACET.getVersion("2.4"); //$NON-NLS-1$
 	public static final IProjectFacetVersion WEB_25 = WEB_FACET.getVersion("2.5"); //$NON-NLS-1$
 	public static final IProjectFacetVersion WEB_30 = WEB_FACET.getVersion("3.0"); //$NON-NLS-1$
+	public static final IProjectFacetVersion WEB_31 = WEB_FACET.getVersion("3.1"); //$NON-NLS-1$
 	
 	public static final IProjectFacet CONNECTOR_FACET = ProjectFacetsManager.getProjectFacet(IModuleConstants.JST_CONNECTOR_MODULE); //$NON-NLS-1$
 	public static final IProjectFacetVersion CONNECTOR_1 = CONNECTOR_FACET.getVersion("1.0"); //$NON-NLS-1$
 	public static final IProjectFacetVersion CONNECTOR_15 = CONNECTOR_FACET.getVersion("1.5"); //$NON-NLS-1$
 	public static final IProjectFacetVersion CONNECTOR_16 = CONNECTOR_FACET.getVersion("1.6"); //$NON-NLS-1$
+	public static final IProjectFacetVersion CONNECTOR_17 = CONNECTOR_FACET.getVersion("1.7"); //$NON-NLS-1$
 	
 	public static final IProjectFacet EAR_FACET = ProjectFacetsManager.getProjectFacet(IModuleConstants.JST_EAR_MODULE); //$NON-NLS-1$
 	public static final IProjectFacetVersion EAR_12 = EAR_FACET.getVersion("1.2"); //$NON-NLS-1$
@@ -39,13 +43,16 @@
 	public static final IProjectFacetVersion EAR_14 = EAR_FACET.getVersion("1.4"); //$NON-NLS-1$
 	public static final IProjectFacetVersion EAR_5 = EAR_FACET.getVersion("5.0"); //$NON-NLS-1$
 	public static final IProjectFacetVersion EAR_6 = EAR_FACET.getVersion("6.0"); //$NON-NLS-1$
+	public static final IProjectFacetVersion EAR_7 = EAR_FACET.getVersion("7.0"); //$NON-NLS-1$
 	
 	public static final IProjectFacet JAVA_FACET = ProjectFacetsManager.getProjectFacet(IModuleConstants.JST_JAVA); //$NON-NLS-1$
 	public static final IProjectFacetVersion JAVA_13 = JAVA_FACET.getVersion("1.3"); //$NON-NLS-1$
 	public static final IProjectFacetVersion JAVA_14 = JAVA_FACET.getVersion("1.4"); //$NON-NLS-1$
 	public static final IProjectFacetVersion JAVA_5 = JAVA_FACET.getVersion("5.0"); //$NON-NLS-1$
 	public static final IProjectFacetVersion JAVA_6 = JAVA_FACET.getVersion("6.0"); //$NON-NLS-1$
+	public static final IProjectFacetVersion JAVA_7 = JAVA_FACET.getVersion("1.7"); //$NON-NLS-1$
 
 	public static final IProjectFacet WEBFRAGMENT_FACET = ProjectFacetsManager.getProjectFacet(IModuleConstants.JST_WEBFRAGMENT_MODULE);
 	public static final IProjectFacetVersion WEBFRAGMENT_30 = WEBFRAGMENT_FACET.getVersion("3.0"); //$NON-NLS-1$
+	public static final IProjectFacetVersion WEBFRAGMENT_31 = WEBFRAGMENT_FACET.getVersion("3.1"); //$NON-NLS-1$
 }
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/web/operations/AddWebArtifactOperationTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/web/operations/AddWebArtifactOperationTest.java
index d43870e..cfe3cc9 100644
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/web/operations/AddWebArtifactOperationTest.java
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/web/operations/AddWebArtifactOperationTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
+ * Copyright (c) 2005, 2014 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -20,6 +20,7 @@
 import junit.framework.Test;
 import junit.framework.TestSuite;
 
+import org.eclipse.core.commands.ExecutionException;
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.resources.ResourcesPlugin;
@@ -32,6 +33,8 @@
 import org.eclipse.jst.j2ee.internal.common.operations.INewJavaClassDataModelProperties;
 import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
 import org.eclipse.jst.j2ee.internal.plugin.J2EEPreferences;
+import org.eclipse.jst.j2ee.internal.web.operations.INewFilterClassDataModelProperties;
+import org.eclipse.jst.j2ee.internal.web.operations.INewServletClassDataModelProperties;
 import org.eclipse.jst.j2ee.internal.web.operations.NewFilterClassDataModelProvider;
 import org.eclipse.jst.j2ee.internal.web.operations.NewListenerClassDataModelProvider;
 import org.eclipse.jst.j2ee.internal.web.operations.NewServletClassDataModelProvider;
@@ -46,8 +49,10 @@
 import org.eclipse.jst.j2ee.webapplication.WebApp;
 import org.eclipse.jst.javaee.core.DisplayName;
 import org.eclipse.jst.javaee.core.UrlPatternType;
+import org.eclipse.jst.jee.model.tests.SynchronousModelChangedListener;
 import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
 import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModelOperation;
 import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
 import org.eclipse.wst.common.tests.OperationTestCase;
 import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.JavaEEFacetConstants;
@@ -72,7 +77,8 @@
     
     public static final String LISTENER_NAME = "TestListener"; //$NON-NLS-1$
     public static final String LISTENER_CLASS_NAME = PACKAGE + "." + LISTENER_NAME; //$NON-NLS-1$
-
+	private IModelProvider mergedModelProvider;
+	
     /**
 	 * @param name
 	 */
@@ -189,6 +195,132 @@
     			SERVLET_DEFAULT_MAPPING, urlPattern.getValue());
     }
     
+    
+    public void testAddServlet_Web30_Defaults() throws Exception{
+       	createWebProject(WEB_PROJECT_NAME, JavaEEFacetConstants.WEB_30);
+    	IProject proj = ProjectUtilities.getProject(WEB_PROJECT_NAME);
+
+    	mergedModelProvider = ModelProviderManager.getModelProvider(proj);
+		org.eclipse.jst.javaee.web.WebApp webApp = (org.eclipse.jst.javaee.web.WebApp) mergedModelProvider.getModelObject();
+		
+    	addServlet_Defaults_Annotations();
+    	
+    	assertJavaFileExists(SERVLET_CLASS_NAME);  	
+    	
+       	List servlets = webApp.getServlets();
+    	assertEquals("Exactly one servlet is expected in the model, but " + servlets.size() + " are found", 
+    			1, servlets.size());
+    	org.eclipse.jst.javaee.web.Servlet servlet = (org.eclipse.jst.javaee.web.Servlet) servlets.get(0);
+    	assertEquals("Servlet name is expected to be " + SERVLET_NAME + ", but it is " + servlet.getServletName(), 
+    			SERVLET_NAME, servlet.getServletName());
+    	assertEquals("Servlet class name is expected to be " + SERVLET_CLASS_NAME + ", but it is " + servlet.getServletClass(), 
+    			SERVLET_CLASS_NAME, servlet.getServletClass());
+		
+		List params = servlet.getInitParams();
+		assertNotNull("List of initialization parameters cannot be retrieved", params);
+		assertEquals("None initialization parameter is expected, but " + params.size() + " are found", 
+				0, params.size());
+    	
+    	List mappings = webApp.getServletMappings();
+    	assertEquals("Exactly one servlet mapping is expected, but " + mappings.size() + " are found", 
+    			1, mappings.size());
+    	org.eclipse.jst.javaee.web.ServletMapping mapping = (org.eclipse.jst.javaee.web.ServletMapping) mappings.get(0);
+    	assertEquals("Servlet name of the mapping is expected to be " + SERVLET_NAME + ", but it is " + mapping.getServletName(), 
+    			SERVLET_NAME, mapping.getServletName());
+    	List urlPatterns = mapping.getUrlPatterns();
+    	assertEquals("Exactly one URL pattern is expected in the mapping, but " + urlPatterns.size() + " are found", 
+    			1, urlPatterns.size());
+    	UrlPatternType urlPattern = (UrlPatternType) urlPatterns.get(0);
+    	assertEquals("Servlet mapping URL pattern value is expected to be " + SERVLET_DEFAULT_MAPPING + ", but it is " + urlPattern.getValue(), 
+    			SERVLET_DEFAULT_MAPPING, urlPattern.getValue());    	   	
+    }
+    
+    
+    public void testAddServlet_Web30_Async() throws Exception {
+    	createWebProject(WEB_PROJECT_NAME, JavaEEFacetConstants.WEB_30);
+    	IProject proj = ProjectUtilities.getProject(WEB_PROJECT_NAME);
+
+    	mergedModelProvider = ModelProviderManager.getModelProvider(proj);
+		org.eclipse.jst.javaee.web.WebApp webApp = (org.eclipse.jst.javaee.web.WebApp) mergedModelProvider.getModelObject();
+		
+    	addServlet_Async();
+    	
+    	assertJavaFileExists(SERVLET_CLASS_NAME);  	
+    	
+       	List servlets = webApp.getServlets();
+    	assertEquals("Exactly one servlet is expected in the model, but " + servlets.size() + " are found", 
+    			1, servlets.size());
+    	org.eclipse.jst.javaee.web.Servlet servlet = (org.eclipse.jst.javaee.web.Servlet) servlets.get(0);
+    	assertEquals("Servlet name is expected to be " + SERVLET_NAME + ", but it is " + servlet.getServletName(), 
+    			SERVLET_NAME, servlet.getServletName());
+    	assertEquals("Servlet class name is expected to be " + SERVLET_CLASS_NAME + ", but it is " + servlet.getServletClass(), 
+    			SERVLET_CLASS_NAME, servlet.getServletClass());
+		
+		List params = servlet.getInitParams();
+		assertNotNull("List of initialization parameters cannot be retrieved", params);
+		assertEquals("None initialization parameter is expected, but " + params.size() + " are found", 
+				0, params.size());
+    	
+    	List mappings = webApp.getServletMappings();
+    	assertEquals("Exactly one servlet mapping is expected, but " + mappings.size() + " are found", 
+    			1, mappings.size());
+    	org.eclipse.jst.javaee.web.ServletMapping mapping = (org.eclipse.jst.javaee.web.ServletMapping) mappings.get(0);
+    	assertEquals("Servlet name of the mapping is expected to be " + SERVLET_NAME + ", but it is " + mapping.getServletName(), 
+    			SERVLET_NAME, mapping.getServletName());
+    	List urlPatterns = mapping.getUrlPatterns();
+    	assertEquals("Exactly one URL pattern is expected in the mapping, but " + urlPatterns.size() + " are found", 
+    			1, urlPatterns.size());
+    	UrlPatternType urlPattern = (UrlPatternType) urlPatterns.get(0);
+    	assertEquals("Servlet mapping URL pattern value is expected to be " + SERVLET_DEFAULT_MAPPING + ", but it is " + urlPattern.getValue(), 
+    			SERVLET_DEFAULT_MAPPING, urlPattern.getValue());    	
+    	
+    	
+    	assertTrue(servlet.isAsyncSupported());
+    }
+    
+    public void testAddServlet_Web31_Async() throws Exception {
+    	createWebProject(WEB_PROJECT_NAME, JavaEEFacetConstants.WEB_31);
+    	IProject proj = ProjectUtilities.getProject(WEB_PROJECT_NAME);
+
+    	mergedModelProvider = ModelProviderManager.getModelProvider(proj);
+		org.eclipse.jst.javaee.web.WebApp webApp = (org.eclipse.jst.javaee.web.WebApp) mergedModelProvider.getModelObject();
+		
+    	addServlet_Async();
+    	
+    	assertJavaFileExists(SERVLET_CLASS_NAME);  	
+    	
+       	List servlets = webApp.getServlets();
+    	assertEquals("Exactly one servlet is expected in the model, but " + servlets.size() + " are found", 
+    			1, servlets.size());
+    	org.eclipse.jst.javaee.web.Servlet servlet = (org.eclipse.jst.javaee.web.Servlet) servlets.get(0);
+    	assertEquals("Servlet name is expected to be " + SERVLET_NAME + ", but it is " + servlet.getServletName(), 
+    			SERVLET_NAME, servlet.getServletName());
+    	assertEquals("Servlet class name is expected to be " + SERVLET_CLASS_NAME + ", but it is " + servlet.getServletClass(), 
+    			SERVLET_CLASS_NAME, servlet.getServletClass());
+		
+		List params = servlet.getInitParams();
+		assertNotNull("List of initialization parameters cannot be retrieved", params);
+		assertEquals("None initialization parameter is expected, but " + params.size() + " are found", 
+				0, params.size());
+    	
+    	List mappings = webApp.getServletMappings();
+    	assertEquals("Exactly one servlet mapping is expected, but " + mappings.size() + " are found", 
+    			1, mappings.size());
+    	org.eclipse.jst.javaee.web.ServletMapping mapping = (org.eclipse.jst.javaee.web.ServletMapping) mappings.get(0);
+    	assertEquals("Servlet name of the mapping is expected to be " + SERVLET_NAME + ", but it is " + mapping.getServletName(), 
+    			SERVLET_NAME, mapping.getServletName());
+    	List urlPatterns = mapping.getUrlPatterns();
+    	assertEquals("Exactly one URL pattern is expected in the mapping, but " + urlPatterns.size() + " are found", 
+    			1, urlPatterns.size());
+    	UrlPatternType urlPattern = (UrlPatternType) urlPatterns.get(0);
+    	assertEquals("Servlet mapping URL pattern value is expected to be " + SERVLET_DEFAULT_MAPPING + ", but it is " + urlPattern.getValue(), 
+    			SERVLET_DEFAULT_MAPPING, urlPattern.getValue());    	
+    	
+    	
+    	assertTrue(servlet.isAsyncSupported());
+    }    
+    
+    
     public void testAddFilter_Web24_Defaults_NoJETEmitter() throws Exception {
 		disableJETEmitter();
 		testAddFilter_Web24_Defaults();
@@ -297,6 +429,136 @@
     			0, mapping.getDispatchers().size());
     }
     
+    public void testAddFilter_Web30_Defaults() throws Exception {
+    	createWebProject(WEB_PROJECT_NAME, JavaEEFacetConstants.WEB_30);
+    	IProject proj = ProjectUtilities.getProject(WEB_PROJECT_NAME);
+
+    	mergedModelProvider = ModelProviderManager.getModelProvider(proj);
+		org.eclipse.jst.javaee.web.WebApp webApp = (org.eclipse.jst.javaee.web.WebApp) mergedModelProvider.getModelObject();
+		
+    	addFilter_Defaults_Annotations();
+    	
+		assertJavaFileExists(FILTER_CLASS_NAME);
+    	
+    	List filters = webApp.getFilters();
+    	assertEquals("Exactly one filter is expected in the model, but " + filters.size() + " are found", 
+    			1, filters.size());
+    	org.eclipse.jst.javaee.web.Filter filter = (org.eclipse.jst.javaee.web.Filter) filters.get(0);
+    	assertEquals("Filter name is expected to be " + FILTER_NAME + ", but it is " + filter.getFilterName(), 
+    			FILTER_NAME, filter.getFilterName());
+    	assertEquals("Filter class name is expected to be " + FILTER_CLASS_NAME + ", but it is " + filter.getFilterClass(), 
+    			FILTER_CLASS_NAME, filter.getFilterClass());
+    	
+    	List params = filter.getInitParams();
+		assertNotNull("List of initialization parameters cannot be retrieved", params);
+		assertEquals("None initialization parameter is expected, but " + params.size() + " are found", 
+				0, params.size());
+    	
+    	List mappings = webApp.getFilterMappings();
+    	assertEquals("Exactly one filter mapping is expected, but " + mappings.size() + " are found", 
+    			1, mappings.size());
+    	org.eclipse.jst.javaee.web.FilterMapping mapping = (org.eclipse.jst.javaee.web.FilterMapping) mappings.get(0);
+    	assertEquals("Filter name of the mapping is expected to be " + FILTER_NAME + ", but it is " + mapping.getFilterName(), 
+    			FILTER_NAME, mapping.getFilterName());
+    	List urlPatterns = mapping.getUrlPatterns();
+    	assertEquals("Exactly one URL pattern is expected in the mapping, but " + urlPatterns.size() + " are found", 
+    			1, urlPatterns.size());
+    	UrlPatternType urlPattern = (UrlPatternType) urlPatterns.get(0);
+    	assertEquals("Filter mapping URL pattern value is expected to be " + FILTER_DEFAULT_MAPPING + ", but it is " + urlPattern.getValue(), 
+    			FILTER_DEFAULT_MAPPING, urlPattern.getValue());
+    	assertEquals("None servlet name is expected in the filter mapping, but " + mapping.getServletNames().size() + " are found", 
+    			0, mapping.getServletNames().size());
+    	assertEquals("None dispatcher is expected in the filter mapping, but " + mapping.getDispatchers().size() + " are found", 
+    			0, mapping.getDispatchers().size());    	
+    }
+    
+    public void testAddFilter_Web30_Async() throws Exception {
+    	createWebProject(WEB_PROJECT_NAME, JavaEEFacetConstants.WEB_30);
+    	IProject proj = ProjectUtilities.getProject(WEB_PROJECT_NAME);
+
+    	mergedModelProvider = ModelProviderManager.getModelProvider(proj);
+		org.eclipse.jst.javaee.web.WebApp webApp = (org.eclipse.jst.javaee.web.WebApp) mergedModelProvider.getModelObject();
+		
+    	addFilter_Async();
+    	
+		assertJavaFileExists(FILTER_CLASS_NAME);
+    	
+    	List filters = webApp.getFilters();
+    	assertEquals("Exactly one filter is expected in the model, but " + filters.size() + " are found", 
+    			1, filters.size());
+    	org.eclipse.jst.javaee.web.Filter filter = (org.eclipse.jst.javaee.web.Filter) filters.get(0);
+    	assertEquals("Filter name is expected to be " + FILTER_NAME + ", but it is " + filter.getFilterName(), 
+    			FILTER_NAME, filter.getFilterName());
+    	assertEquals("Filter class name is expected to be " + FILTER_CLASS_NAME + ", but it is " + filter.getFilterClass(), 
+    			FILTER_CLASS_NAME, filter.getFilterClass());
+    	
+    	List params = filter.getInitParams();
+		assertNotNull("List of initialization parameters cannot be retrieved", params);
+		assertEquals("None initialization parameter is expected, but " + params.size() + " are found", 
+				0, params.size());
+    	
+    	List mappings = webApp.getFilterMappings();
+    	assertEquals("Exactly one filter mapping is expected, but " + mappings.size() + " are found", 
+    			1, mappings.size());
+    	org.eclipse.jst.javaee.web.FilterMapping mapping = (org.eclipse.jst.javaee.web.FilterMapping) mappings.get(0);
+    	assertEquals("Filter name of the mapping is expected to be " + FILTER_NAME + ", but it is " + mapping.getFilterName(), 
+    			FILTER_NAME, mapping.getFilterName());
+    	List urlPatterns = mapping.getUrlPatterns();
+    	assertEquals("Exactly one URL pattern is expected in the mapping, but " + urlPatterns.size() + " are found", 
+    			1, urlPatterns.size());
+    	UrlPatternType urlPattern = (UrlPatternType) urlPatterns.get(0);
+    	assertEquals("Filter mapping URL pattern value is expected to be " + FILTER_DEFAULT_MAPPING + ", but it is " + urlPattern.getValue(), 
+    			FILTER_DEFAULT_MAPPING, urlPattern.getValue());
+    	assertEquals("None servlet name is expected in the filter mapping, but " + mapping.getServletNames().size() + " are found", 
+    			0, mapping.getServletNames().size());
+    	assertEquals("None dispatcher is expected in the filter mapping, but " + mapping.getDispatchers().size() + " are found", 
+    			0, mapping.getDispatchers().size());    	
+    }
+    
+    
+    public void testAddFilter_Web31_Async() throws Exception {
+    	createWebProject(WEB_PROJECT_NAME, JavaEEFacetConstants.WEB_31);
+    	IProject proj = ProjectUtilities.getProject(WEB_PROJECT_NAME);
+
+    	mergedModelProvider = ModelProviderManager.getModelProvider(proj);
+		org.eclipse.jst.javaee.web.WebApp webApp = (org.eclipse.jst.javaee.web.WebApp) mergedModelProvider.getModelObject();
+		
+    	addFilter_Async();
+    	
+		assertJavaFileExists(FILTER_CLASS_NAME);
+    	
+    	List filters = webApp.getFilters();
+    	assertEquals("Exactly one filter is expected in the model, but " + filters.size() + " are found", 
+    			1, filters.size());
+    	org.eclipse.jst.javaee.web.Filter filter = (org.eclipse.jst.javaee.web.Filter) filters.get(0);
+    	assertEquals("Filter name is expected to be " + FILTER_NAME + ", but it is " + filter.getFilterName(), 
+    			FILTER_NAME, filter.getFilterName());
+    	assertEquals("Filter class name is expected to be " + FILTER_CLASS_NAME + ", but it is " + filter.getFilterClass(), 
+    			FILTER_CLASS_NAME, filter.getFilterClass());
+    	
+    	List params = filter.getInitParams();
+		assertNotNull("List of initialization parameters cannot be retrieved", params);
+		assertEquals("None initialization parameter is expected, but " + params.size() + " are found", 
+				0, params.size());
+    	
+    	List mappings = webApp.getFilterMappings();
+    	assertEquals("Exactly one filter mapping is expected, but " + mappings.size() + " are found", 
+    			1, mappings.size());
+    	org.eclipse.jst.javaee.web.FilterMapping mapping = (org.eclipse.jst.javaee.web.FilterMapping) mappings.get(0);
+    	assertEquals("Filter name of the mapping is expected to be " + FILTER_NAME + ", but it is " + mapping.getFilterName(), 
+    			FILTER_NAME, mapping.getFilterName());
+    	List urlPatterns = mapping.getUrlPatterns();
+    	assertEquals("Exactly one URL pattern is expected in the mapping, but " + urlPatterns.size() + " are found", 
+    			1, urlPatterns.size());
+    	UrlPatternType urlPattern = (UrlPatternType) urlPatterns.get(0);
+    	assertEquals("Filter mapping URL pattern value is expected to be " + FILTER_DEFAULT_MAPPING + ", but it is " + urlPattern.getValue(), 
+    			FILTER_DEFAULT_MAPPING, urlPattern.getValue());
+    	assertEquals("None servlet name is expected in the filter mapping, but " + mapping.getServletNames().size() + " are found", 
+    			0, mapping.getServletNames().size());
+    	assertEquals("None dispatcher is expected in the filter mapping, but " + mapping.getDispatchers().size() + " are found", 
+    			0, mapping.getDispatchers().size());    	
+    }
+    
     public void testAddListener_Web24_Defaults_NoJETEmitter() throws Exception {
 		disableJETEmitter();
 		testAddListener_Web24_Defaults();
@@ -352,6 +614,89 @@
     			LISTENER_CLASS_NAME, listener.getListenerClass());
     }
 
+    
+    public void testAddListener_Web30_Defaults() throws Exception {
+    	createWebProject(WEB_PROJECT_NAME, JavaEEFacetConstants.WEB_30);
+    	IProject proj = ProjectUtilities.getProject(WEB_PROJECT_NAME);
+
+    	mergedModelProvider = ModelProviderManager.getModelProvider(proj);
+		org.eclipse.jst.javaee.web.WebApp webApp = (org.eclipse.jst.javaee.web.WebApp) mergedModelProvider.getModelObject();
+		
+    	addListener_Defaults_Annotations();
+
+		assertJavaFileExists(LISTENER_CLASS_NAME);
+    	
+    	List listeners = webApp.getListeners();
+    	assertEquals("Exactly one listener is expected in the model, but " + listeners.size() + " are found", 
+    			1, listeners.size());
+    	org.eclipse.jst.javaee.core.Listener listener = (org.eclipse.jst.javaee.core.Listener) listeners.get(0);
+    	assertEquals("Listener " + LISTENER_CLASS_NAME + " is expected in the model, but " + listener.getListenerClass() + " is found", 
+    			LISTENER_CLASS_NAME, listener.getListenerClass());
+    }    
+    
+    
+    
+    public void testAddListener_Web31_AsyncListener() throws Exception {
+    	createWebProject(WEB_PROJECT_NAME, JavaEEFacetConstants.WEB_31);
+    	IProject proj = ProjectUtilities.getProject(WEB_PROJECT_NAME);
+
+    	mergedModelProvider = ModelProviderManager.getModelProvider(proj);
+		org.eclipse.jst.javaee.web.WebApp webApp = (org.eclipse.jst.javaee.web.WebApp) mergedModelProvider.getModelObject();
+		
+		addListener_AsyncListener();
+		assertJavaFileExists(LISTENER_CLASS_NAME);
+    	
+    	List listeners = webApp.getListeners();
+    	assertEquals("Exactly one listener is expected in the model, but " + listeners.size() + " are found", 
+    			1, listeners.size());
+    	org.eclipse.jst.javaee.core.Listener listener = (org.eclipse.jst.javaee.core.Listener) listeners.get(0);
+    	assertEquals("Listener " + LISTENER_CLASS_NAME + " is expected in the model, but " + listener.getListenerClass() + " is found", 
+    			LISTENER_CLASS_NAME, listener.getListenerClass());
+    	
+    	
+    }   
+    
+    
+    public void testAddListener_Web31_HttpSessionIdListener() throws Exception {
+    	createWebProject(WEB_PROJECT_NAME, JavaEEFacetConstants.WEB_31);
+    	IProject proj = ProjectUtilities.getProject(WEB_PROJECT_NAME);
+
+    	mergedModelProvider = ModelProviderManager.getModelProvider(proj);
+		org.eclipse.jst.javaee.web.WebApp webApp = (org.eclipse.jst.javaee.web.WebApp) mergedModelProvider.getModelObject();
+		
+		addListener_HttpSessionIdListener();
+		assertJavaFileExists(LISTENER_CLASS_NAME);
+    	
+    	List listeners = webApp.getListeners();
+    	assertEquals("Exactly one listener is expected in the model, but " + listeners.size() + " are found", 
+    			1, listeners.size());
+    	org.eclipse.jst.javaee.core.Listener listener = (org.eclipse.jst.javaee.core.Listener) listeners.get(0);
+    	assertEquals("Listener " + LISTENER_CLASS_NAME + " is expected in the model, but " + listener.getListenerClass() + " is found", 
+    			LISTENER_CLASS_NAME, listener.getListenerClass());
+    	
+    	
+    }        
+    
+    public void testAddListener_Web31_MultiListeners() throws Exception {
+    	createWebProject(WEB_PROJECT_NAME, JavaEEFacetConstants.WEB_31);
+    	IProject proj = ProjectUtilities.getProject(WEB_PROJECT_NAME);
+
+    	mergedModelProvider = ModelProviderManager.getModelProvider(proj);
+		org.eclipse.jst.javaee.web.WebApp webApp = (org.eclipse.jst.javaee.web.WebApp) mergedModelProvider.getModelObject();
+		
+		addListener_MultiInterfaces();
+		assertJavaFileExists(LISTENER_CLASS_NAME);
+    	
+    	List listeners = webApp.getListeners();
+    	assertEquals("Exactly one listener is expected in the model, but " + listeners.size() + " are found", 
+    			1, listeners.size());
+    	org.eclipse.jst.javaee.core.Listener listener = (org.eclipse.jst.javaee.core.Listener) listeners.get(0);
+    	assertEquals("Listener " + LISTENER_CLASS_NAME + " is expected in the model, but " + listener.getListenerClass() + " is found", 
+    			LISTENER_CLASS_NAME, listener.getListenerClass());
+    	
+    	
+    }        
+    
 	@Override
 	protected void tearDown() throws Exception {
 		// uncomment the below line if you want to dump a check whether the
@@ -376,7 +721,7 @@
     public void createWebProject(String projectName, IProjectFacetVersion version) throws Exception {
     	IDataModel dm = WebProjectCreationOperationTest.getWebDataModel(
 				projectName, null, null, null, null, version, false);
-    	runAndVerify(dm);
+     	runAndVerify(dm);
     }
 
     private void addServlet_Defaults() throws Exception {
@@ -387,6 +732,32 @@
         runAndVerify(dm);
     }
     
+    private void addServlet_Defaults_Annotations() throws Exception {
+    	IDataModel dm = DataModelFactory.createDataModel(NewServletClassDataModelProvider.class);
+    	dm.setProperty(PROJECT_NAME, WEB_PROJECT_NAME);
+    	dm.setProperty(JAVA_PACKAGE, PACKAGE);
+    	dm.setProperty(CLASS_NAME, SERVLET_NAME);
+    	executeAndWait(dm.getDefaultOperation());
+    }
+    
+    
+    private void addServlet_Async() throws Exception {
+    	IDataModel dm = DataModelFactory.createDataModel(NewServletClassDataModelProvider.class);
+    	dm.setProperty(PROJECT_NAME, WEB_PROJECT_NAME);
+    	dm.setProperty(JAVA_PACKAGE, PACKAGE);
+    	dm.setProperty(CLASS_NAME, SERVLET_NAME);
+    	dm.setBooleanProperty(INewServletClassDataModelProperties.ASYNC_SUPPORT, true);
+    	executeAndWait(dm.getDefaultOperation());
+    }
+    
+	private void executeAndWait(IDataModelOperation dataModelOperation) throws InterruptedException, ExecutionException {
+		SynchronousModelChangedListener listener = new SynchronousModelChangedListener(1);
+		mergedModelProvider.addListener(listener);
+		dataModelOperation.execute(null, null);
+		listener.waitForEvents();
+		mergedModelProvider.removeListener(listener);
+	}
+    
     private void addFilter_Defaults() throws Exception {
     	IDataModel dm = DataModelFactory.createDataModel(NewFilterClassDataModelProvider.class);
     	dm.setProperty(PROJECT_NAME, WEB_PROJECT_NAME);
@@ -395,6 +766,23 @@
         runAndVerify(dm);
     }
     
+    private void addFilter_Defaults_Annotations() throws Exception {
+    	IDataModel dm = DataModelFactory.createDataModel(NewFilterClassDataModelProvider.class);
+    	dm.setProperty(PROJECT_NAME, WEB_PROJECT_NAME);
+    	dm.setProperty(JAVA_PACKAGE, PACKAGE);
+    	dm.setProperty(CLASS_NAME, FILTER_NAME);
+      	executeAndWait(dm.getDefaultOperation());
+    }   
+    
+    private void addFilter_Async() throws Exception {
+    	IDataModel dm = DataModelFactory.createDataModel(NewFilterClassDataModelProvider.class);
+    	dm.setProperty(PROJECT_NAME, WEB_PROJECT_NAME);
+    	dm.setProperty(JAVA_PACKAGE, PACKAGE);
+    	dm.setProperty(CLASS_NAME, FILTER_NAME);
+    	dm.setBooleanProperty(INewFilterClassDataModelProperties.ASYNC_SUPPORT, true);
+       	executeAndWait(dm.getDefaultOperation());
+    }    
+    
     private void addListener_Defaults() throws Exception {
     	IDataModel dm = DataModelFactory.createDataModel(NewListenerClassDataModelProvider.class);
     	dm.setProperty(PROJECT_NAME, WEB_PROJECT_NAME);
@@ -406,6 +794,54 @@
         runAndVerify(dm);
     }
     
+    
+    private void addListener_Defaults_Annotations() throws Exception {
+    	IDataModel dm = DataModelFactory.createDataModel(NewListenerClassDataModelProvider.class);
+    	dm.setProperty(PROJECT_NAME, WEB_PROJECT_NAME);
+    	dm.setProperty(JAVA_PACKAGE, PACKAGE);
+    	dm.setProperty(CLASS_NAME, LISTENER_NAME);
+    	List interfaces = new ArrayList();
+    	interfaces.add(NewListenerClassDataModelProvider.LISTENER_INTERFACES[0]);
+    	dm.setProperty(INTERFACES, interfaces);
+    	executeAndWait(dm.getDefaultOperation());
+    }
+    
+    
+    private void addListener_AsyncListener() throws Exception {
+    	IDataModel dm = DataModelFactory.createDataModel(NewListenerClassDataModelProvider.class);
+    	dm.setProperty(PROJECT_NAME, WEB_PROJECT_NAME);
+    	dm.setProperty(JAVA_PACKAGE, PACKAGE);
+    	dm.setProperty(CLASS_NAME, LISTENER_NAME);
+    	List interfaces = new ArrayList();
+    	interfaces.add(NewListenerClassDataModelProvider.LISTENER_INTERFACES[9]);
+    	dm.setProperty(INTERFACES, interfaces);
+    	executeAndWait(dm.getDefaultOperation());
+    }
+    
+    private void addListener_HttpSessionIdListener() throws Exception {
+    	IDataModel dm = DataModelFactory.createDataModel(NewListenerClassDataModelProvider.class);
+    	dm.setProperty(PROJECT_NAME, WEB_PROJECT_NAME);
+    	dm.setProperty(JAVA_PACKAGE, PACKAGE);
+    	dm.setProperty(CLASS_NAME, LISTENER_NAME);
+    	List interfaces = new ArrayList();
+    	interfaces.add(NewListenerClassDataModelProvider.LISTENER_INTERFACES[6]);
+    	dm.setProperty(INTERFACES, interfaces);
+    	executeAndWait(dm.getDefaultOperation());
+    }
+    
+    private void addListener_MultiInterfaces() throws Exception{
+    	//add sessionid and async listeners
+    	IDataModel dm = DataModelFactory.createDataModel(NewListenerClassDataModelProvider.class);
+    	dm.setProperty(PROJECT_NAME, WEB_PROJECT_NAME);
+    	dm.setProperty(JAVA_PACKAGE, PACKAGE);
+    	dm.setProperty(CLASS_NAME, LISTENER_NAME);
+    	List interfaces = new ArrayList();
+      	interfaces.add(NewListenerClassDataModelProvider.LISTENER_INTERFACES[9]);
+    	interfaces.add(NewListenerClassDataModelProvider.LISTENER_INTERFACES[6]);
+    	dm.setProperty(INTERFACES, interfaces);
+    	executeAndWait(dm.getDefaultOperation());   	
+    }
+    
     private void assertJavaFileExists(String fullyQualifiedName) throws JavaModelException {
 		IJavaProject javaProject = JavaCore.create(
 				ResourcesPlugin.getWorkspace().getRoot())
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/web/operations/WebProjectCreationOperationTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/web/operations/WebProjectCreationOperationTest.java
index 9b88cee..3517bfe 100644
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/web/operations/WebProjectCreationOperationTest.java
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/web/operations/WebProjectCreationOperationTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
+ * Copyright (c) 2005, 2014 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -75,7 +75,7 @@
 		OperationTestCase.runAndVerify(dm);
 	}
 	
-	
+
 	public void testWeb22_ChangedContentDir() throws Exception {
 		IDataModel dm = getWebDataModel("goodWeb", null, null, "myAwesomeContentDir", null, JavaEEFacetConstants.WEB_22, true);
 		OperationTestCase.runAndVerify(dm);
@@ -559,7 +559,11 @@
     	
     	facetModel.setBooleanProperty(IJ2EEFacetInstallDataModelProperties.GENERATE_DD, createDD);
     	
-    	if(version.equals(JavaEEFacetConstants.WEB_30))    	{
+    	if (version.equals(JavaEEFacetConstants.WEB_31)){
+    		IDataModel javaFacetModel = facetMap.getFacetDataModel(IJ2EEFacetConstants.JAVA);
+	    	javaFacetModel.setProperty(IFacetDataModelProperties.FACET_VERSION, JavaEEFacetConstants.JAVA_7);   		
+    	}
+    	else if(version.equals(JavaEEFacetConstants.WEB_30))    	{
     		IDataModel javaFacetModel = facetMap.getFacetDataModel(IJ2EEFacetConstants.JAVA);
 	    	javaFacetModel.setProperty(IFacetDataModelProperties.FACET_VERSION, JavaEEFacetConstants.JAVA_6);
     	}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tests/web/verifiers/WebProjectCreationDataModelVerifier.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tests/web/verifiers/WebProjectCreationDataModelVerifier.java
index 154f1cc..310bfcb 100644
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tests/web/verifiers/WebProjectCreationDataModelVerifier.java
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tests/web/verifiers/WebProjectCreationDataModelVerifier.java
@@ -65,7 +65,7 @@
     @Override
     protected void verifyDD(Object modelObj) {
 		String version = J2EEProjectUtilities.getJ2EEProjectVersion(project);
-		if(version.equals(J2EEVersionConstants.VERSION_2_5_TEXT) || version.equals(J2EEVersionConstants.VERSION_3_0_TEXT)){
+		if(version.equals(J2EEVersionConstants.VERSION_2_5_TEXT) || version.equals(J2EEVersionConstants.VERSION_3_0_TEXT) || version.equals(J2EEVersionConstants.VERSION_3_1_TEXT)){
 			WebApp web = (WebApp)modelObj;
 			Assert.assertEquals("Invalid project version", version, web.getVersion().getLiteral());
 		} else {
