[426807] Asynchronous session bean support (wizard changes)
diff --git a/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/util/EJBUIMessages.java b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/util/EJBUIMessages.java
index 6a3839f..41e4d0b 100644
--- a/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/util/EJBUIMessages.java
+++ b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/util/EJBUIMessages.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2003, 2008 IBM Corporation and others.
+ * Copyright (c) 2003, 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
@@ -108,11 +108,13 @@
 	public static String REMOTE_COMPONENT_INTERFACE_TOOLTIP;
 	public static String REMOTE_HOME_INTERFACE_TOOLTIP;
 	public static String EJB_CLIENT_JAR_GROUP;
+	public static String ASYNC;
 
 	//EJB Timer
     public static String timerWizardTitle;
     public static String timerWizardDescription;
     public static String timerScheduleLabel;
+    public static String NON_PERSISTENT;
 
 	static {
 		NLS.initializeMessages(BUNDLE_NAME, EJBUIMessages.class);
diff --git a/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/IEjbWizardConstants.java b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/IEjbWizardConstants.java
index c3d40fc..ff93b0f 100644
--- a/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/IEjbWizardConstants.java
+++ b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/IEjbWizardConstants.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2007, 2008 SAP AG and others.
+ * Copyright (c) 2007, 2014 SAP AG 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
@@ -8,6 +8,7 @@
  * Contributors:
  * Kaloyan Raev, kaloyan.raev@sap.com - initial API and implementation
  * Ludovic Champenois ludo@java.net
+ * IBM - Async and Non-persistent support
  *******************************************************************************/
 package org.eclipse.jst.ejb.ui.internal.wizard;
 
@@ -29,6 +30,9 @@
 	public static final String LOCAL_BUSINESS_INTERFACE = EJBUIMessages.LOCAL_BUSINESS_INTERFACE;
 	public static final String LOCAL_BUSINESS_INTERFACE_LABEL = EJBUIMessages.LOCAL_BUSINESS_INTERFACE_LABEL;
 	public static final String NO_INTERFACE = EJBUIMessages.NO_INTERFACE;
+	public static final String ASYNC = EJBUIMessages.ASYNC;
+	public static final String NON_PERSISTENT = EJBUIMessages.NON_PERSISTENT;
+	
 	public static final String EJB_NAME = EJBUIMessages.EJB_NAME;
 	
 	public final static String TRANSACTION_TYPE_CONTAINER = EJBUIMessages.TRANSACTION_TYPE_CONTAINER;
diff --git a/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/NewSessionBeanClassWizardPage.java b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/NewSessionBeanClassWizardPage.java
index d5c0d3e..563d108 100644
--- a/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/NewSessionBeanClassWizardPage.java
+++ b/plugins/org.eclipse.jst.ejb.ui/ejb_ui/org/eclipse/jst/ejb/ui/internal/wizard/NewSessionBeanClassWizardPage.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2007, 2008 SAP AG and others.
+ * Copyright (c) 2007, 2014 SAP AG 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
@@ -7,6 +7,7 @@
  *
  * Contributors:
  * Kaloyan Raev, kaloyan.raev@sap.com - initial API and implementation
+ * IBM - Async and Non-persistent support
  *******************************************************************************/
 package org.eclipse.jst.ejb.ui.internal.wizard;
 
@@ -16,6 +17,7 @@
 import static org.eclipse.jst.j2ee.ejb.internal.operations.INewSessionBeanClassDataModelProperties.REMOTE;
 import static org.eclipse.jst.j2ee.ejb.internal.operations.INewSessionBeanClassDataModelProperties.REMOTE_BUSINESS_INTERFACE;
 import static org.eclipse.jst.j2ee.ejb.internal.operations.INewSessionBeanClassDataModelProperties.STATE_TYPE;
+import static org.eclipse.jst.j2ee.ejb.internal.operations.INewSessionBeanClassDataModelProperties.ASYNC;
 import static org.eclipse.jst.j2ee.internal.common.operations.INewJavaClassDataModelProperties.INTERFACES;
 
 import java.util.ArrayList;
@@ -33,13 +35,15 @@
 import org.eclipse.wst.common.frameworks.datamodel.DataModelPropertyDescriptor;
 import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
 
-public class NewSessionBeanClassWizardPage extends NewEnterpriseBeanClassWizardPage {
+public class NewSessionBeanClassWizardPage extends
+		NewEnterpriseBeanClassWizardPage {
 
 	private Label stateTypeLabel;
 	private Combo stateTypeCombo;
 	private Button remoteCheckbox;
 	private Button localCheckbox;
 	private Button noInterfaceCheckbox;
+	private Button ansyncCheckbox;
 	private Text remoteInterfaceName;
 	private Text localInterfaceName;
 
@@ -47,13 +51,13 @@
 			String pageDesc, String pageTitle, String moduleType) {
 		super(model, pageName, pageDesc, pageTitle, moduleType);
 	}
-	
+
 	@Override
 	protected Composite createTopLevelComposite(Composite parent) {
 		Composite composite = super.createTopLevelComposite(parent);
-		
+
 		createBusinessInterfacesGroup(composite);
-		
+
 		return composite;
 	}
 
@@ -66,38 +70,48 @@
 
 		stateTypeCombo = new Combo(composite, SWT.READ_ONLY);
 		stateTypeCombo.setLayoutData(gdhspan(1));
-		DataModelPropertyDescriptor[] descriptors = model.getValidPropertyDescriptors(STATE_TYPE);
+		DataModelPropertyDescriptor[] descriptors = model
+				.getValidPropertyDescriptors(STATE_TYPE);
 		for (DataModelPropertyDescriptor descriptor : descriptors) {
 			stateTypeCombo.add(descriptor.getPropertyDescription());
 		}
 		stateTypeCombo.select(0);
 		synchHelper.synchCombo(stateTypeCombo, STATE_TYPE, null);
-		
+
 		Group group = new Group(composite, SWT.NONE);
-        group.setLayoutData(gdhspan(2));
-        group.setLayout(new GridLayout(2, false));
-        group.setText(IEjbWizardConstants.CREATE_BUSINESS_INTERFACE);
-		
+		group.setLayoutData(gdhspan(2));
+		group.setLayout(new GridLayout(2, false));
+		group.setText(IEjbWizardConstants.CREATE_BUSINESS_INTERFACE);
+
 		remoteCheckbox = new Button(group, SWT.CHECK);
 		remoteCheckbox.setLayoutData(gdhspan(1));
 		remoteCheckbox.setText(IEjbWizardConstants.REMOTE_BUSINESS_INTERFACE);
 		synchHelper.synchCheckbox(remoteCheckbox, REMOTE, null);
 		remoteInterfaceName = new Text(group, SWT.SINGLE | SWT.BORDER);
-		remoteInterfaceName.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		synchHelper.synchText(remoteInterfaceName, REMOTE_BUSINESS_INTERFACE, null);
+		remoteInterfaceName
+				.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		synchHelper.synchText(remoteInterfaceName, REMOTE_BUSINESS_INTERFACE,
+				null);
 
 		localCheckbox = new Button(group, SWT.CHECK);
 		localCheckbox.setLayoutData(gdhspan(1));
 		localCheckbox.setText(IEjbWizardConstants.LOCAL_BUSINESS_INTERFACE);
 		synchHelper.synchCheckbox(localCheckbox, LOCAL, null);
 		localInterfaceName = new Text(group, SWT.SINGLE | SWT.BORDER);
-		localInterfaceName.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		synchHelper.synchText(localInterfaceName, LOCAL_BUSINESS_INTERFACE, null);
-		
+		localInterfaceName
+				.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		synchHelper.synchText(localInterfaceName, LOCAL_BUSINESS_INTERFACE,
+				null);
+
 		noInterfaceCheckbox = new Button(group, SWT.CHECK);
 		noInterfaceCheckbox.setLayoutData(gdhspan(2));
 		noInterfaceCheckbox.setText(IEjbWizardConstants.NO_INTERFACE);
 		synchHelper.synchCheckbox(noInterfaceCheckbox, NO_INTERFACE, null);
+
+		ansyncCheckbox = new Button(group, SWT.CHECK);
+		ansyncCheckbox.setLayoutData(gdhspan(2));
+		ansyncCheckbox.setText(IEjbWizardConstants.ASYNC);
+		synchHelper.synchCheckbox(ansyncCheckbox, ASYNC, null);
 	}
 
 	private static GridData gdhspan(int span) {
@@ -110,13 +124,14 @@
 	protected String[] getValidationPropertyNames() {
 		ArrayList<String> names = new ArrayList<String>();
 		names.addAll(Arrays.asList(super.getValidationPropertyNames()));
-		
+
 		names.add(STATE_TYPE);
 		names.add(INTERFACES);
 		names.add(LOCAL_BUSINESS_INTERFACE);
 		names.add(REMOTE_BUSINESS_INTERFACE);
 		names.add(NO_INTERFACE);
-		
+		names.add(ASYNC);
+
 		return names.toArray(new String[0]);
 	}
 }
diff --git a/plugins/org.eclipse.jst.ejb.ui/property_files/ejb_ui.properties b/plugins/org.eclipse.jst.ejb.ui/property_files/ejb_ui.properties
index e92b933..15e1a8b 100644
--- a/plugins/org.eclipse.jst.ejb.ui/property_files/ejb_ui.properties
+++ b/plugins/org.eclipse.jst.ejb.ui/property_files/ejb_ui.properties
@@ -93,7 +93,9 @@
 MESSAGE_LISTENER_INTERFACE_HYPERLINK_TOOLTIP=Set message listener interface
 CLICK_TO_SELECT=<click to select>
 EJB_CLIENT_JAR_GROUP=EJB Client JAR
+ASYNC=As&ynchronous
 
 timerWizardTitle=Create EJB Timer Callback
 timerWizardDescription=Create Java class with an added EJB Timer Callback method.
 timerScheduleLabel=Schedule: 
+NON_PERSISTENT=&Non-persistent
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/CreateSessionBeanTemplateModel.java b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/CreateSessionBeanTemplateModel.java
index 6917d3e..fa24710 100644
--- a/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/CreateSessionBeanTemplateModel.java
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/CreateSessionBeanTemplateModel.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2007, 2012 SAP AG and others.
+ * Copyright (c) 2007, 2014 SAP AG 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
@@ -7,7 +7,8 @@
  *
  * Contributors:
  * Kaloyan Raev, kaloyan.raev@sap.com - initial API and implementation
- * Roberto Sanchez, rsanchez@mx1.ibm.com - Add remote and local annotations to bean class 
+ * Roberto Sanchez, rsanchez@mx1.ibm.com - Add remote and local annotations to bean class
+ * IBM - Async and Non-persistent support
  *******************************************************************************/
 package org.eclipse.jst.j2ee.ejb.internal.operations;
 
@@ -38,6 +39,8 @@
 	public static final String QUALIFIED_REMOTE = "javax.ejb.Remote"; //$NON-NLS-1$
 	public static final String QUALIFIED_REMOTE_HOME = "javax.ejb.RemoteHome"; //$NON-NLS-1$
 	public static final String QUALIFIED_LOCAL_HOME = "javax.ejb.LocalHome"; //$NON-NLS-1$
+	public static final String QUALIFIED_ASYNCHRONOUS = "javax.ejb.Asynchronous"; //$NON-NLS-1$
+	 
 	public static final String QUALIFIED_TRANSACTION_MANAGEMENT = "javax.ejb.TransactionManagement"; //$NON-NLS-1$
 	public static final String QUALIFIED_TRANSACTION_MANAGEMENT_TYPE = "javax.ejb.TransactionManagementType"; //$NON-NLS-1$
 	
@@ -89,6 +92,10 @@
 			collection.add(QUALIFIED_LOCAL_BEAN);
 		}
 		
+		if (isAsynchronous()) {
+			collection.add(QUALIFIED_ASYNCHRONOUS);
+		}
+		
 		List<BusinessInterface> interfaces = getBusinessInterfaces();
 		if (addBusinessAnnotationToBeanClass()){
 			for (BusinessInterface iface : interfaces) {
@@ -206,6 +213,10 @@
 		return dataModel.getBooleanProperty(NO_INTERFACE);
 	}
 	
+	public boolean isAsynchronous() {
+		return dataModel.getBooleanProperty(ASYNC);
+	}
+	
 	public Map<String, String> getClassAnnotationParams() {
 		Map<String, String> result = new Hashtable<String, String>();
 		String dispName = getProperty(EJB_NAME).trim();
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/INewSessionBeanClassDataModelProperties.java b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/INewSessionBeanClassDataModelProperties.java
index 19e03f6..04b6afd 100644
--- a/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/INewSessionBeanClassDataModelProperties.java
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/INewSessionBeanClassDataModelProperties.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2007, 2012 SAP AG and others.
+ * Copyright (c) 2007, 2014 SAP AG 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
@@ -8,6 +8,7 @@
  * Contributors:
  * Kaloyan Raev, kaloyan.raev@sap.com - initial API and implementation
  * Roberto Sanchez, rsanchez@mx1.ibm.com - Add remote and local annotations to bean class
+ * IBM - Async and Non-persistent support
  *******************************************************************************/
 package org.eclipse.jst.j2ee.ejb.internal.operations;
 
@@ -70,4 +71,20 @@
 	
 	public static final String BUSINESS_INTERFACE_ANNOTATION_LOCATION = "INewSessionBeanClassDataModelProperties.BUSINESS_INTERFACE_ANNOTATION_LOCATION"; //$NON-NLS-1$
 	
+	/**
+	 * Optional, boolean property used to specify whether add the Asynchronous annotation to the class definition or not. 
+	 * The default value is false.
+	 * 
+	 * @since 3.6
+	 */
+	public static final String ASYNC = "INewSessionBeanClassDataModelProperties.ASYNC"; //$NON-NLS-1$
+	
+	/**
+	 * Optional, boolean property used to specify whether to define the timer as non-persistent or not.
+	 * The default value is false.
+	 * 
+	 * @since 3.6
+	 */
+	public static final String NON_PERSISTENT = "INewSessionBeanClassDataModelProperties.NON_PERSISTENT"; //$NON-NLS-1$
+	
 }
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/NewEnterpriseBeanClassDataModelProvider.java b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/NewEnterpriseBeanClassDataModelProvider.java
index 993fe34..c6f3f44 100644
--- a/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/NewEnterpriseBeanClassDataModelProvider.java
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/NewEnterpriseBeanClassDataModelProvider.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2008 SAP AG and others.
+ * Copyright (c) 2008, 2014 SAP AG 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
@@ -7,6 +7,7 @@
  *
  * Contributors:
  * Kaloyan Raev, kaloyan.raev@sap.com - initial API and implementation
+ * IBM - Async and Non-persistent support
  *******************************************************************************/
 package org.eclipse.jst.j2ee.ejb.internal.operations;
 
@@ -25,11 +26,14 @@
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Status;
 import org.eclipse.jst.j2ee.ejb.internal.plugin.EjbPlugin;
+import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
+import org.eclipse.jst.j2ee.internal.common.J2EEVersionUtil;
 import org.eclipse.jst.j2ee.internal.common.operations.NewJavaClassDataModelProvider;
 import org.eclipse.jst.j2ee.internal.ejb.project.operations.EJBCreationResourceHandler;
 import org.eclipse.jst.j2ee.model.IModelProvider;
 import org.eclipse.jst.j2ee.model.ModelProviderManager;
 import org.eclipse.jst.j2ee.project.JavaEEProjectUtilities;
+import org.eclipse.jst.j2ee.project.facet.IJ2EEFacetConstants;
 import org.eclipse.jst.javaee.ejb.EJBJar;
 import org.eclipse.jst.javaee.ejb.EnterpriseBeans;
 import org.eclipse.jst.javaee.ejb.SessionBean;
@@ -37,6 +41,7 @@
 import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
 import org.eclipse.wst.common.frameworks.datamodel.IDataModelProvider;
 import org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonPlugin;
+import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
 
 public class NewEnterpriseBeanClassDataModelProvider extends NewJavaClassDataModelProvider {
 
@@ -179,5 +184,52 @@
 		}
 		return Status.OK_STATUS;
 	}
-	
+
+	// constant array used for version tolerance: EJB version, Web version, Web Fragment version
+	private static final int EJB31_VERSIONS[] = {J2EEVersionConstants.VERSION_3_1, J2EEVersionConstants.VERSION_3_0, J2EEVersionConstants.VERSION_3_0};
+	private static final int EJB32_VERSIONS[] = {J2EEVersionConstants.VERSION_3_2, J2EEVersionConstants.VERSION_3_1, J2EEVersionConstants.VERSION_3_1};
+
+	protected boolean ejb3xOrLater(int ejbVersion) {
+		boolean retVal = false;
+		IProject project = getTargetProject();
+		// default to EJB 31
+		int ejbVersions[] = EJB31_VERSIONS;
+		IProjectFacetVersion facetVersion = null;
+		int versionToCheck = ejbVersion;
+
+		switch (ejbVersion) {
+			case J2EEVersionConstants.VERSION_3_1:
+				ejbVersions = EJB31_VERSIONS;
+				break;
+			case J2EEVersionConstants.VERSION_3_2:
+				ejbVersions = EJB32_VERSIONS;
+				break;
+		}
+
+		if (project != null)
+		{
+			if (JavaEEProjectUtilities.isEJBProject(project))
+			{
+				facetVersion = JavaEEProjectUtilities.getProjectFacetVersion(project, IJ2EEFacetConstants.EJB);
+				versionToCheck = ejbVersions[0];
+			}
+			else if (JavaEEProjectUtilities.isDynamicWebProject(project))
+			{
+				facetVersion = JavaEEProjectUtilities.getProjectFacetVersion(project, IJ2EEFacetConstants.DYNAMIC_WEB);
+				versionToCheck = ejbVersions[1];
+			}
+			else if (JavaEEProjectUtilities.isWebFragmentProject(project))
+			{
+				facetVersion = JavaEEProjectUtilities.getProjectFacetVersion(project, IJ2EEFacetConstants.WEBFRAGMENT);
+				versionToCheck = ejbVersions[2];
+			}
+			if (facetVersion != null)
+			{
+				int version = J2EEVersionUtil.convertVersionStringToInt(facetVersion.getVersionString());
+				retVal = version >= versionToCheck;
+			}
+		}
+		return retVal;
+	}
+
 }
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/NewSessionBeanClassDataModelProvider.java b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/NewSessionBeanClassDataModelProvider.java
index 00fed1b..548d9af 100644
--- a/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/NewSessionBeanClassDataModelProvider.java
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/NewSessionBeanClassDataModelProvider.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2007, 2012 SAP AG and others.
+ * Copyright (c) 2007, 2014 SAP AG 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
@@ -9,6 +9,7 @@
  * Kaloyan Raev, kaloyan.raev@sap.com - initial API and implementation
  * Roberto Sanchez, rsanchez@mx1.ibm.com - Add remote and local annotations to bean class
  * Roberto Sanchez, rsanchez@mx1.ibm.com - Allow adopter to change default value of package for interfaces
+ * IBM - Async and Non-persistent support
  *******************************************************************************/
 package org.eclipse.jst.j2ee.ejb.internal.operations;
 
@@ -18,6 +19,7 @@
 import static org.eclipse.jst.j2ee.ejb.internal.operations.INewSessionBeanClassDataModelProperties.LOCAL_HOME;
 import static org.eclipse.jst.j2ee.ejb.internal.operations.INewSessionBeanClassDataModelProperties.LOCAL_HOME_INTERFACE;
 import static org.eclipse.jst.j2ee.ejb.internal.operations.INewSessionBeanClassDataModelProperties.NO_INTERFACE;
+import static org.eclipse.jst.j2ee.ejb.internal.operations.INewSessionBeanClassDataModelProperties.ASYNC;
 import static org.eclipse.jst.j2ee.ejb.internal.operations.INewSessionBeanClassDataModelProperties.REMOTE;
 import static org.eclipse.jst.j2ee.ejb.internal.operations.INewSessionBeanClassDataModelProperties.REMOTE_BUSINESS_INTERFACE;
 import static org.eclipse.jst.j2ee.ejb.internal.operations.INewSessionBeanClassDataModelProperties.REMOTE_COMPONENT_INTERFACE;
@@ -49,19 +51,15 @@
 import org.eclipse.jst.j2ee.ejb.internal.plugin.EjbPlugin;
 import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
 import org.eclipse.jst.j2ee.internal.common.J2EECommonMessages;
-import org.eclipse.jst.j2ee.internal.common.J2EEVersionUtil;
 import org.eclipse.jst.j2ee.internal.common.operations.NewJavaClassDataModelProvider;
 import org.eclipse.jst.j2ee.internal.ejb.project.operations.EJBCreationResourceHandler;
 import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
-import org.eclipse.jst.j2ee.project.JavaEEProjectUtilities;
-import org.eclipse.jst.j2ee.project.facet.IJ2EEFacetConstants;
 import org.eclipse.osgi.util.NLS;
 import org.eclipse.wst.common.frameworks.datamodel.DataModelPropertyDescriptor;
 import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
 import org.eclipse.wst.common.frameworks.datamodel.IDataModelOperation;
 import org.eclipse.wst.common.frameworks.datamodel.IDataModelProvider;
 import org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonPlugin;
-import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
 import org.eclipse.wst.project.facet.IProductConstants;
 
 public class NewSessionBeanClassDataModelProvider extends NewEnterpriseBeanClassDataModelProvider {
@@ -72,8 +70,8 @@
 	private static final String REMOTE_HOME_SUFFIX = "RemoteHome"; //$NON-NLS-1$
 	private static final String LOCAL_COMPONENT_SUFFIX = "LocalComponent"; //$NON-NLS-1$
 	private static final String REMOTE_COMPONENT_SUFFIX = "RemoteComponent"; //$NON-NLS-1$
-
-
+	
+	
 	@Override
 	public IDataModelOperation getDefaultOperation() {
 		return new AddSessionBeanOperation(getDataModel());
@@ -95,6 +93,7 @@
 		propertyNames.add(REMOTE);
 		propertyNames.add(LOCAL);
 		propertyNames.add(NO_INTERFACE);
+		propertyNames.add(ASYNC);
 		propertyNames.add(STATE_TYPE);
 		propertyNames.add(REMOTE_HOME);
 		propertyNames.add(LOCAL_HOME);
@@ -127,9 +126,11 @@
 		else if (propertyName.equals(REMOTE))
 			return Boolean.FALSE;
 		else if (propertyName.equals(LOCAL))
-			return new Boolean(!ejb31OrLater());
+			return new Boolean(!ejb3xOrLater(J2EEVersionConstants.VERSION_3_1));
 		else if (propertyName.equals(NO_INTERFACE)) 
-			return new Boolean(ejb31OrLater());
+			return new Boolean(ejb3xOrLater(J2EEVersionConstants.VERSION_3_1));
+		else if (ASYNC.equals(propertyName))
+			return Boolean.FALSE;
 		else if (propertyName.equals(STATE_TYPE))
 			return StateType.STATELESS.toString(); 
 		else if (propertyName.equals(INTERFACES)) {
@@ -242,6 +243,7 @@
 			dataModel.notifyPropertyChange(REMOTE, IDataModel.DEFAULT_CHG);
 			dataModel.notifyPropertyChange(LOCAL, IDataModel.DEFAULT_CHG);
 			dataModel.notifyPropertyChange(NO_INTERFACE, IDataModel.DEFAULT_CHG);
+			dataModel.notifyPropertyChange(ASYNC, IDataModel.DEFAULT_CHG);
 			dataModel.notifyPropertyChange(REMOTE_BUSINESS_INTERFACE, IDataModel.DEFAULT_CHG);
 			dataModel.notifyPropertyChange(LOCAL_BUSINESS_INTERFACE, IDataModel.DEFAULT_CHG);
 		} else if (CLASS_NAME.equals(propertyName) || JAVA_PACKAGE.equals(propertyName)) {
@@ -275,6 +277,8 @@
 			if(getLocalProperty() != null){
 				getLocalProperty().setFullyQualifiedName(propertyValue.toString());
 			}
+		} else if (propertyName.equals(ASYNC)) {
+			getDataModel().notifyPropertyChange(ASYNC, IDataModel.DEFAULT_CHG);
 		} 
 
 		return result;
@@ -286,6 +290,8 @@
 			return getDataModel().getBooleanProperty(REMOTE);
 		} else if (LOCAL_BUSINESS_INTERFACE.equals(propertyName)) {
 			return getDataModel().getBooleanProperty(LOCAL);
+		} else if (ASYNC.equals(propertyName)) {
+			return ejb3xOrLater(J2EEVersionConstants.VERSION_3_1);
 		}
 		
 		return super.isPropertyEnabled(propertyName);
@@ -374,6 +380,8 @@
 			return validateComponentHomeInterfaces();
 		} else if (INTERFACES.equals(propertyName)) {
 			return validateInterfacesList();
+		} else if (ASYNC.equals(propertyName) && getBooleanProperty(ASYNC)) {
+			return validateAsynchronous();
 		}
 			
 		return super.validate(propertyName);
@@ -381,18 +389,28 @@
 
 	protected IStatus validateStateType() {
 		String value = getStringProperty(STATE_TYPE);
-		if (StateType.SINGLETON.toString().equals(value) && !ejb31OrLater()) {
+		if (StateType.SINGLETON.toString().equals(value) && !ejb3xOrLater(J2EEVersionConstants.VERSION_3_1)) {
 			return WTPCommonPlugin.createErrorStatus(EJBCreationResourceHandler.ERR_SINGLETON_NOT_ALLOWED);
 		}
 		return Status.OK_STATUS;
 	}
 
 	protected IStatus validateNoInterface() {
-		if (!ejb31OrLater()) {
+		if (!ejb3xOrLater(J2EEVersionConstants.VERSION_3_1)) {
 			return WTPCommonPlugin.createErrorStatus(EJBCreationResourceHandler.ERR_NO_INTERFACE_NOT_ALLOWED);
 		}
 		return Status.OK_STATUS;
 	}
+	
+	protected IStatus validateAsynchronous() {
+		IStatus retVal = Status.OK_STATUS;
+		if (getBooleanProperty(ASYNC)) {
+			if (ejb3xOrLater(J2EEVersionConstants.VERSION_3_1)) {
+				retVal = new Status(IStatus.WARNING, EjbPlugin.PLUGIN_ID, EJBCreationResourceHandler.WRN_EJB31_ASYNC_NOT_SUPPORTED);
+			}
+		}
+		return retVal;
+	}
 
 	protected IStatus validateEjbInterface(String fullyQualifiedName) {
 		IStatus status = validateJavaTypeName(fullyQualifiedName);
@@ -500,7 +518,7 @@
 
 	protected IStatus validateInterfacesList() {
 		List<BusinessInterface> list = (List<BusinessInterface>) getProperty(INTERFACES);
-		if (list.isEmpty() && !ejb31OrLater()) {
+		if (list.isEmpty() && !ejb3xOrLater(J2EEVersionConstants.VERSION_3_1)) {
 			return new Status(IStatus.WARNING, EjbPlugin.PLUGIN_ID, EJBCreationResourceHandler.WRN_NO_CLIENT_VIEW); 
 		}
 		return Status.OK_STATUS;
@@ -545,32 +563,4 @@
 		}
 		return WTPCommonPlugin.OK_STATUS;
 	}
-
-	private boolean ejb31OrLater() {
-		boolean retVal = false;
-		IProject project = getTargetProject();
-		if (project != null)
-		{
-			if (JavaEEProjectUtilities.isEJBProject(project))
-			{
-				IProjectFacetVersion facetVersion = JavaEEProjectUtilities.getProjectFacetVersion(project, IJ2EEFacetConstants.EJB);
-				int version = J2EEVersionUtil.convertVersionStringToInt(facetVersion.getVersionString());
-				retVal = version >= J2EEVersionConstants.VERSION_3_1;
-			}
-			else if (JavaEEProjectUtilities.isDynamicWebProject(project))
-			{
-				IProjectFacetVersion facetVersion = JavaEEProjectUtilities.getProjectFacetVersion(project, IJ2EEFacetConstants.DYNAMIC_WEB);
-				int version = J2EEVersionUtil.convertVersionStringToInt(facetVersion.getVersionString());
-				retVal = version >= J2EEVersionConstants.VERSION_3_0;
-			}
-			else if (JavaEEProjectUtilities.isWebFragmentProject(project))
-			{
-				IProjectFacetVersion facetVersion = JavaEEProjectUtilities.getProjectFacetVersion(project, IJ2EEFacetConstants.WEBFRAGMENT);
-				int version = J2EEVersionUtil.convertVersionStringToInt(facetVersion.getVersionString());
-				retVal = version >= J2EEVersionConstants.VERSION_3_0;
-			}
-		}
-		return retVal;
-	}
-	
 }
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/SessionBeanTemplate.java b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/SessionBeanTemplate.java
index 4da505d..8693ded 100644
--- a/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/SessionBeanTemplate.java
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejb/org/eclipse/jst/j2ee/ejb/internal/operations/SessionBeanTemplate.java
@@ -1,11 +1,12 @@
 /*******************************************************************************
- * Copyright (c) 2007, 2012 SAP AG and others.
+ * Copyright (c) 2007, 2014 SAP AG and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- * This class has been generated from a javajet template. 
+ * This class has been generated from a javajet template.
+ * IBM - Async and Non-persistent support 
  *******************************************************************************/
 package org.eclipse.jst.j2ee.ejb.internal.operations;
 
@@ -53,35 +54,36 @@
   protected final String TEXT_27 = ".class)"; //$NON-NLS-1$
   protected final String TEXT_28 = NL + "@RemoteHome("; //$NON-NLS-1$
   protected final String TEXT_29 = ".class)"; //$NON-NLS-1$
-  protected final String TEXT_30 = NL + "public "; //$NON-NLS-1$
-  protected final String TEXT_31 = "abstract "; //$NON-NLS-1$
-  protected final String TEXT_32 = "final "; //$NON-NLS-1$
-  protected final String TEXT_33 = "class "; //$NON-NLS-1$
-  protected final String TEXT_34 = " extends "; //$NON-NLS-1$
-  protected final String TEXT_35 = " implements "; //$NON-NLS-1$
-  protected final String TEXT_36 = ", "; //$NON-NLS-1$
-  protected final String TEXT_37 = " {"; //$NON-NLS-1$
-  protected final String TEXT_38 = NL + NL + "    /**" + NL + "     * Default constructor. " + NL + "     */" + NL + "    public "; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-  protected final String TEXT_39 = "() {" + NL + "        // TODO Auto-generated constructor stub" + NL + "    }"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-  protected final String TEXT_40 = NL + "       " + NL + "    /**" + NL + "     * @see "; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-  protected final String TEXT_41 = "#"; //$NON-NLS-1$
-  protected final String TEXT_42 = "("; //$NON-NLS-1$
-  protected final String TEXT_43 = ")" + NL + "     */" + NL + "    public "; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-  protected final String TEXT_44 = "("; //$NON-NLS-1$
-  protected final String TEXT_45 = ") {" + NL + "        super("; //$NON-NLS-1$ //$NON-NLS-2$
-  protected final String TEXT_46 = ");" + NL + "        // TODO Auto-generated constructor stub" + NL + "    }"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-  protected final String TEXT_47 = NL + NL + "\t/**" + NL + "     * @see "; //$NON-NLS-1$ //$NON-NLS-2$
-  protected final String TEXT_48 = "#"; //$NON-NLS-1$
-  protected final String TEXT_49 = "("; //$NON-NLS-1$
-  protected final String TEXT_50 = ")" + NL + "     */" + NL + "    public "; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-  protected final String TEXT_51 = " "; //$NON-NLS-1$
-  protected final String TEXT_52 = "("; //$NON-NLS-1$
-  protected final String TEXT_53 = ") {" + NL + "        // TODO Auto-generated method stub"; //$NON-NLS-1$ //$NON-NLS-2$
-  protected final String TEXT_54 = NL + "\t\t\treturn "; //$NON-NLS-1$
-  protected final String TEXT_55 = ";"; //$NON-NLS-1$
-  protected final String TEXT_56 = NL + "    }"; //$NON-NLS-1$
-  protected final String TEXT_57 = NL + NL + "}"; //$NON-NLS-1$
-  protected final String TEXT_58 = NL;
+  protected final String TEXT_30 = NL + "@Asynchronous"; //$NON-NLS-1$
+  protected final String TEXT_31 = NL + "public "; //$NON-NLS-1$
+  protected final String TEXT_32 = "abstract "; //$NON-NLS-1$
+  protected final String TEXT_33 = "final "; //$NON-NLS-1$
+  protected final String TEXT_34 = "class "; //$NON-NLS-1$
+  protected final String TEXT_35 = " extends "; //$NON-NLS-1$
+  protected final String TEXT_36 = " implements "; //$NON-NLS-1$
+  protected final String TEXT_37 = ", "; //$NON-NLS-1$
+  protected final String TEXT_38 = " {"; //$NON-NLS-1$
+  protected final String TEXT_39 = NL + NL + "    /**" + NL + "     * Default constructor. " + NL + "     */" + NL + "    public "; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+  protected final String TEXT_40 = "() {" + NL + "        // TODO Auto-generated constructor stub" + NL + "    }"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+  protected final String TEXT_41 = NL + "       " + NL + "    /**" + NL + "     * @see "; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+  protected final String TEXT_42 = "#"; //$NON-NLS-1$
+  protected final String TEXT_43 = "("; //$NON-NLS-1$
+  protected final String TEXT_44 = ")" + NL + "     */" + NL + "    public "; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+  protected final String TEXT_45 = "("; //$NON-NLS-1$
+  protected final String TEXT_46 = ") {" + NL + "        super("; //$NON-NLS-1$ //$NON-NLS-2$
+  protected final String TEXT_47 = ");" + NL + "        // TODO Auto-generated constructor stub" + NL + "    }"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+  protected final String TEXT_48 = NL + NL + "\t/**" + NL + "     * @see "; //$NON-NLS-1$ //$NON-NLS-2$
+  protected final String TEXT_49 = "#"; //$NON-NLS-1$
+  protected final String TEXT_50 = "("; //$NON-NLS-1$
+  protected final String TEXT_51 = ")" + NL + "     */" + NL + "    public "; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+  protected final String TEXT_52 = " "; //$NON-NLS-1$
+  protected final String TEXT_53 = "("; //$NON-NLS-1$
+  protected final String TEXT_54 = ") {" + NL + "        // TODO Auto-generated method stub"; //$NON-NLS-1$ //$NON-NLS-2$
+  protected final String TEXT_55 = NL + "\t\t\treturn "; //$NON-NLS-1$
+  protected final String TEXT_56 = ";"; //$NON-NLS-1$
+  protected final String TEXT_57 = NL + "    }"; //$NON-NLS-1$
+  protected final String TEXT_58 = NL + NL + "}"; //$NON-NLS-1$
+  protected final String TEXT_59 = NL;
 
   public String generate(Object argument)
   {
@@ -247,31 +249,38 @@
 	}
 
     
-	if (model.isPublic()) { 
+	if (model.isAsynchronous()) {
 
     stringBuffer.append(TEXT_30);
+    
+	}
+
+    
+	if (model.isPublic()) { 
+
+    stringBuffer.append(TEXT_31);
      
 	} 
 
 	if (model.isAbstract()) { 
 
-    stringBuffer.append(TEXT_31);
+    stringBuffer.append(TEXT_32);
     
 	}
 
 	if (model.isFinal()) {
 
-    stringBuffer.append(TEXT_32);
+    stringBuffer.append(TEXT_33);
     
 	}
 
-    stringBuffer.append(TEXT_33);
+    stringBuffer.append(TEXT_34);
     stringBuffer.append( model.getClassName() );
     
 	String superClass = model.getSuperclassName();
  	if (superClass != null && superClass.length() > 0) {
 
-    stringBuffer.append(TEXT_34);
+    stringBuffer.append(TEXT_35);
     stringBuffer.append( superClass );
     
 	}
@@ -279,7 +288,7 @@
 	List<String> interfaces = model.getInterfaces(); 
  	if ( interfaces.size() > 0) { 
 
-    stringBuffer.append(TEXT_35);
+    stringBuffer.append(TEXT_36);
     
 	}
 	
@@ -287,7 +296,7 @@
    		String INTERFACE = interfaces.get(i);
    		if (i > 0) {
 
-    stringBuffer.append(TEXT_36);
+    stringBuffer.append(TEXT_37);
     
 		}
 
@@ -295,13 +304,13 @@
     
 	}
 
-    stringBuffer.append(TEXT_37);
+    stringBuffer.append(TEXT_38);
      
 	if (!model.hasEmptySuperclassConstructor()) { 
 
-    stringBuffer.append(TEXT_38);
-    stringBuffer.append( model.getClassName() );
     stringBuffer.append(TEXT_39);
+    stringBuffer.append( model.getClassName() );
+    stringBuffer.append(TEXT_40);
      
 	} 
 
@@ -310,19 +319,19 @@
 		for (Constructor constructor : constructors) {
 			if (constructor.isPublic() || constructor.isProtected()) { 
 
-    stringBuffer.append(TEXT_40);
-    stringBuffer.append( model.getSuperclassName() );
     stringBuffer.append(TEXT_41);
     stringBuffer.append( model.getSuperclassName() );
     stringBuffer.append(TEXT_42);
-    stringBuffer.append( constructor.getParamsForJavadoc() );
+    stringBuffer.append( model.getSuperclassName() );
     stringBuffer.append(TEXT_43);
-    stringBuffer.append( model.getClassName() );
+    stringBuffer.append( constructor.getParamsForJavadoc() );
     stringBuffer.append(TEXT_44);
-    stringBuffer.append( constructor.getParamsForDeclaration() );
+    stringBuffer.append( model.getClassName() );
     stringBuffer.append(TEXT_45);
-    stringBuffer.append( constructor.getParamsForCall() );
+    stringBuffer.append( constructor.getParamsForDeclaration() );
     stringBuffer.append(TEXT_46);
+    stringBuffer.append( constructor.getParamsForCall() );
+    stringBuffer.append(TEXT_47);
     
 			} 
 		} 
@@ -332,36 +341,36 @@
 	if (model.shouldImplementAbstractMethods()) {
 		for (Method method : model.getUnimplementedMethods()) { 
 
-    stringBuffer.append(TEXT_47);
-    stringBuffer.append( method.getContainingJavaClass() );
     stringBuffer.append(TEXT_48);
-    stringBuffer.append( method.getName() );
+    stringBuffer.append( method.getContainingJavaClass() );
     stringBuffer.append(TEXT_49);
-    stringBuffer.append( method.getParamsForJavadoc() );
-    stringBuffer.append(TEXT_50);
-    stringBuffer.append( method.getReturnType() );
-    stringBuffer.append(TEXT_51);
     stringBuffer.append( method.getName() );
+    stringBuffer.append(TEXT_50);
+    stringBuffer.append( method.getParamsForJavadoc() );
+    stringBuffer.append(TEXT_51);
+    stringBuffer.append( method.getReturnType() );
     stringBuffer.append(TEXT_52);
-    stringBuffer.append( method.getParamsForDeclaration() );
+    stringBuffer.append( method.getName() );
     stringBuffer.append(TEXT_53);
+    stringBuffer.append( method.getParamsForDeclaration() );
+    stringBuffer.append(TEXT_54);
      
 			String defaultReturnValue = method.getDefaultReturnValue();
 			if (defaultReturnValue != null) { 
 
-    stringBuffer.append(TEXT_54);
-    stringBuffer.append( defaultReturnValue );
     stringBuffer.append(TEXT_55);
+    stringBuffer.append( defaultReturnValue );
+    stringBuffer.append(TEXT_56);
     
 			} 
 
-    stringBuffer.append(TEXT_56);
+    stringBuffer.append(TEXT_57);
      
 		}
 	} 
 
-    stringBuffer.append(TEXT_57);
     stringBuffer.append(TEXT_58);
+    stringBuffer.append(TEXT_59);
     return stringBuffer.toString();
   }
 }
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/ejbcreation/org/eclipse/jst/j2ee/internal/ejb/project/operations/EJBCreationResourceHandler.java b/plugins/org.eclipse.jst.j2ee.ejb/ejbcreation/org/eclipse/jst/j2ee/internal/ejb/project/operations/EJBCreationResourceHandler.java
index a55d26b..a75d1e3 100644
--- a/plugins/org.eclipse.jst.j2ee.ejb/ejbcreation/org/eclipse/jst/j2ee/internal/ejb/project/operations/EJBCreationResourceHandler.java
+++ b/plugins/org.eclipse.jst.j2ee.ejb/ejbcreation/org/eclipse/jst/j2ee/internal/ejb/project/operations/EJBCreationResourceHandler.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
+ * Copyright (c) 2000, 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
@@ -167,10 +167,12 @@
 	public static String WRN_NO_CLIENT_VIEW;
 	public static String ERR_SINGLETON_NOT_ALLOWED;
 	public static String ERR_NO_INTERFACE_NOT_ALLOWED;
+	public static String WRN_EJB31_ASYNC_NOT_SUPPORTED;
 
 	//EJB Timer specific
     public static String timerScheduleDefault;
     public static String errorTimerScheduleMissing;
+    public static String WRN_EJB31_NON_PERSISTENT_NO_SUPPORTED;
       
 	static {
 		NLS.initializeMessages(BUNDLE_NAME, EJBCreationResourceHandler.class);
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/property_files/ejbcreation.properties b/plugins/org.eclipse.jst.j2ee.ejb/property_files/ejbcreation.properties
index df81386..82a3036 100644
--- a/plugins/org.eclipse.jst.j2ee.ejb/property_files/ejbcreation.properties
+++ b/plugins/org.eclipse.jst.j2ee.ejb/property_files/ejbcreation.properties
@@ -1,5 +1,5 @@
 ###############################################################################
-# Copyright (c) 2003, 2006 IBM Corporation and others.
+# Copyright (c) 2003, 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
@@ -150,7 +150,9 @@
 WRN_BEAN_NAME_IS_EMPTY=Bean name is empty, the containter will use the name of the bean class.
 WRN_NO_CLIENT_VIEW=No client view configured. Clients will not be able to access this bean.
 ERR_SINGLETON_NOT_ALLOWED=The 'Singleton' state type is allowed only for EJB projects with version 3.1 or later.
-ERR_NO_INTERFACE_NOT_ALLOWED=The no-interface client view is allowed only for EJB projects with version 3.1 or later. 
+ERR_NO_INTERFACE_NOT_ALLOWED=The no-interface client view is allowed only for EJB projects with version 3.1 or later.
+WRN_EJB31_ASYNC_NOT_SUPPORTED=Asynchronous methods are not supported in EJB 3.1 Lite.
 
 timerScheduleDefault= second="*/10", minute="*", hour="8-23", dayOfWeek="Mon-Fri",\n      dayOfMonth="*", month="*", year="*", info="MyTimer"
 errorTimerScheduleMissing=The schedule cannot be empty.
+WRN_EJB31_NON_PERSISTENT_NO_SUPPORTED=Non-persistent Timers are not supported in EJB 3.1 Lite.
diff --git a/plugins/org.eclipse.jst.j2ee.ejb/templates/sessionBean_classHeader.template b/plugins/org.eclipse.jst.j2ee.ejb/templates/sessionBean_classHeader.template
index b8d3eec..41ffc28 100644
--- a/plugins/org.eclipse.jst.j2ee.ejb/templates/sessionBean_classHeader.template
+++ b/plugins/org.eclipse.jst.j2ee.ejb/templates/sessionBean_classHeader.template
@@ -107,4 +107,11 @@
 @RemoteHome(<%=model.getRemoteHomeClassSimpleName()%>.class)
 <%
 	}
+%>
+<%
+	if (model.isAsynchronous()) {
+%>
+@Asynchronous
+<%
+	}
 %>
\ No newline at end of file