diff --git a/plugins/org.eclipse.jst.j2ee.web/web/org/eclipse/jst/j2ee/internal/web/operations/CreateFilterTemplateModel.java b/plugins/org.eclipse.jst.j2ee.web/web/org/eclipse/jst/j2ee/internal/web/operations/CreateFilterTemplateModel.java
index 0f0ec62..d815f2f 100644
--- a/plugins/org.eclipse.jst.j2ee.web/web/org/eclipse/jst/j2ee/internal/web/operations/CreateFilterTemplateModel.java
+++ b/plugins/org.eclipse.jst.j2ee.web/web/org/eclipse/jst/j2ee/internal/web/operations/CreateFilterTemplateModel.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2007, 2021 SAP AG and others.
+ * Copyright (c) 2007, 2022 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
@@ -11,18 +11,16 @@
 package org.eclipse.jst.j2ee.internal.web.operations;
 
 import static org.eclipse.jst.j2ee.internal.common.operations.INewJavaClassDataModelProperties.ABSTRACT_METHODS;
+import static org.eclipse.jst.j2ee.internal.web.operations.INewFilterClassDataModelProperties.ASYNC_SUPPORT;
 import static org.eclipse.jst.j2ee.internal.web.operations.INewFilterClassDataModelProperties.DESTROY;
 import static org.eclipse.jst.j2ee.internal.web.operations.INewFilterClassDataModelProperties.DO_FILTER;
 import static org.eclipse.jst.j2ee.internal.web.operations.INewFilterClassDataModelProperties.FILTER_MAPPINGS;
 import static org.eclipse.jst.j2ee.internal.web.operations.INewFilterClassDataModelProperties.INIT;
 import static org.eclipse.jst.j2ee.internal.web.operations.INewFilterClassDataModelProperties.INIT_PARAM;
-import static org.eclipse.jst.j2ee.internal.web.operations.INewFilterClassDataModelProperties.ASYNC_SUPPORT;
-import static org.eclipse.jst.j2ee.web.IServletConstants.DESTROY_SIGNATURE;
-import static org.eclipse.jst.j2ee.web.IServletConstants.DO_FILTER_SIGNATURE;
-import static org.eclipse.jst.j2ee.web.IServletConstants.FILTER_INIT_SIGNATURE;
 import static org.eclipse.jst.j2ee.web.IServletConstants.METHOD_DESTROY;
 import static org.eclipse.jst.j2ee.web.IServletConstants.METHOD_DO_FILTER;
 import static org.eclipse.jst.j2ee.web.IServletConstants.METHOD_INIT;
+import static org.eclipse.jst.j2ee.web.IServletConstants.QUALIFIED_ANNOTATION_DISPATCHER_TYPE;
 import static org.eclipse.jst.j2ee.web.IServletConstants.QUALIFIED_ANNOTATION_INIT_PARAM;
 import static org.eclipse.jst.j2ee.web.IServletConstants.QUALIFIED_FILTER_CHAIN;
 import static org.eclipse.jst.j2ee.web.IServletConstants.QUALIFIED_FILTER_CONFIG;
@@ -31,7 +29,6 @@
 import static org.eclipse.jst.j2ee.web.IServletConstants.QUALIFIED_SERVLET_REQUEST;
 import static org.eclipse.jst.j2ee.web.IServletConstants.QUALIFIED_SERVLET_RESPONSE;
 import static org.eclipse.jst.j2ee.web.IServletConstants.QUALIFIED_WEB_FILTER;
-import static org.eclipse.jst.j2ee.web.IServletConstants.QUALIFIED_ANNOTATION_DISPATCHER_TYPE;
 
 import java.util.ArrayList;
 import java.util.Collection;
@@ -41,6 +38,7 @@
 import java.util.Map;
 
 import org.eclipse.jst.j2ee.internal.common.operations.Method;
+import org.eclipse.jst.j2ee.web.IServletConstants;
 import org.eclipse.jst.j2ee.webapplication.DispatcherType;
 import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
 
@@ -60,31 +58,58 @@
     
 	@Override
 	public Collection<String> getImports() {
-		Collection<String> collection = super.getImports();
+		Collection<String> imports = super.getImports();
 		
+		String javaEEVersion = getJavaEEVersion();
 		if (shouldGenInit()) {
-			collection.add(QUALIFIED_FILTER_CONFIG);
-			collection.add(QUALIFIED_SERVLET_EXCEPTION);
+			if (SERVLET_5_0.equals(javaEEVersion)) {
+				imports.add(IServletConstants.QUALIFIED_JAKARTA_FILTER_CONFIG);
+				imports.add(IServletConstants.QUALIFIED_JAKARTA_SERVLET_EXCEPTION);
+			}
+			else {
+				imports.add(QUALIFIED_FILTER_CONFIG);
+				imports.add(QUALIFIED_SERVLET_EXCEPTION);
+			}
 		}
 		
 		if (shouldGenDoFilter()) {
-			collection.add(QUALIFIED_SERVLET_REQUEST);
-			collection.add(QUALIFIED_SERVLET_RESPONSE);
-			collection.add(QUALIFIED_FILTER_CHAIN);
-			collection.add(QUALIFIED_IO_EXCEPTION);
-			collection.add(QUALIFIED_SERVLET_EXCEPTION);
-		}
-		if (SERVLET_3.equals(getJavaEEVersion()) || SERVLET_3_1.equals(getJavaEEVersion()) || SERVLET_4_0.equals(getJavaEEVersion())){
-			collection.add(QUALIFIED_WEB_FILTER);
-			if (getInitParams()!= null && getInitParams().size()>0){
-				collection.add(QUALIFIED_ANNOTATION_INIT_PARAM);
+			if (SERVLET_5_0.equals(javaEEVersion)) {
+				imports.add(IServletConstants.QUALIFIED_JAKARTA_SERVLET_REQUEST);
+				imports.add(IServletConstants.QUALIFIED_JAKARTA_SERVLET_RESPONSE);
+				imports.add(IServletConstants.QUALIFIED_JAKARTA_FILTER_CHAIN);
+				imports.add(QUALIFIED_IO_EXCEPTION);
+				imports.add(IServletConstants.QUALIFIED_JAKARTA_SERVLET_EXCEPTION);
 			}
-			if (hasDispatchers()){
-				collection.add(QUALIFIED_ANNOTATION_DISPATCHER_TYPE);
+			else {
+				imports.add(QUALIFIED_SERVLET_REQUEST);
+				imports.add(QUALIFIED_SERVLET_RESPONSE);
+				imports.add(QUALIFIED_FILTER_CHAIN);
+				imports.add(QUALIFIED_IO_EXCEPTION);
+				imports.add(QUALIFIED_SERVLET_EXCEPTION);
+			}
+		}
+		if (SERVLET_5_0.equals(javaEEVersion)) {
+			imports.add(IServletConstants.QUALIFIED_JAKARTA_WEB_FILTER);
+			if (getInitParams() != null && !getInitParams().isEmpty()) {
+				imports.add(IServletConstants.QUALIFIED_JAKARTA_ANNOTATION_INIT_PARAM);
+			}
+			if (hasDispatchers()) {
+				imports.add(IServletConstants.QUALIFIED_JAKARTA_ANNOTATION_DISPATCHER_TYPE);
+			}
+		}
+		else {
+			if (SERVLET_3.equals(javaEEVersion) || SERVLET_3_1.equals(javaEEVersion) || SERVLET_4_0.equals(javaEEVersion)) {
+				imports.add(QUALIFIED_WEB_FILTER);
+				if (getInitParams() != null && !getInitParams().isEmpty()) {
+					imports.add(QUALIFIED_ANNOTATION_INIT_PARAM);
+				}
+				if (hasDispatchers()) {
+					imports.add(QUALIFIED_ANNOTATION_DISPATCHER_TYPE);
+				}
 			}
 		}
 		
-		return collection;
+		return imports;
 	}
 
 	public String getFilterName() {
@@ -200,9 +225,16 @@
 		
 		while (iterator.hasNext()) {
 			Method method = iterator.next();
-			if ((METHOD_INIT.equals(method.getName()) && FILTER_INIT_SIGNATURE.equals(method.getSignature())) || 
-					(METHOD_DESTROY.equals(method.getName()) && DESTROY_SIGNATURE.equals(method.getSignature())) ||
-					(METHOD_DO_FILTER.equals(method.getName()) && DO_FILTER_SIGNATURE.equals(method.getSignature()))) {
+			String methodName = method.getName();
+			String methodSignature = method.getSignature();
+			if ((METHOD_INIT.equals(methodName) && (IServletConstants.FILTER_INIT_SIGNATURE.equals(methodSignature))) ||
+					(METHOD_DESTROY.equals(methodName) && (IServletConstants.DESTROY_SIGNATURE.equals(methodSignature))) ||
+					(METHOD_DO_FILTER.equals(methodName) && (IServletConstants.DO_FILTER_SIGNATURE.equals(methodSignature)))) {
+				iterator.remove();
+			}
+			else if ((METHOD_INIT.equals(methodName) && (IServletConstants.JAKARTA_FILTER_INIT_SIGNATURE.equals(methodSignature))) ||
+					(METHOD_DESTROY.equals(methodName) && (IServletConstants.JAKARTA_DESTROY_SIGNATURE.equals(methodSignature))) ||
+					(METHOD_DO_FILTER.equals(methodName) && (IServletConstants.JAKARTA_DO_FILTER_SIGNATURE.equals(methodSignature)))) {
 				iterator.remove();
 			}
 		}
diff --git a/plugins/org.eclipse.jst.j2ee.web/web/org/eclipse/jst/j2ee/internal/web/operations/CreateListenerTemplateModel.java b/plugins/org.eclipse.jst.j2ee.web/web/org/eclipse/jst/j2ee/internal/web/operations/CreateListenerTemplateModel.java
index 77cd5d4..78c8c02 100644
--- a/plugins/org.eclipse.jst.j2ee.web/web/org/eclipse/jst/j2ee/internal/web/operations/CreateListenerTemplateModel.java
+++ b/plugins/org.eclipse.jst.j2ee.web/web/org/eclipse/jst/j2ee/internal/web/operations/CreateListenerTemplateModel.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2007, 2021 SAP AG and others.
+ * Copyright (c) 2007, 2022 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
@@ -29,59 +29,111 @@
 import java.util.Collection;
 import java.util.List;
 
+import org.eclipse.jst.j2ee.web.IServletConstants;
 import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
 
 public class CreateListenerTemplateModel extends CreateWebClassTemplateModel {
 	
 	@Override
 	public Collection<String> getImports() {
-		Collection<String> collection = super.getImports();
+		Collection<String> imports = super.getImports();
 		
 		if (implementServletContextListener()) {
-			collection.add(QUALIFIED_SERVLET_CONTEXT_LISTENER);
-			collection.add(QUALIFIED_SERVLET_CONTEXT_EVENT);
+			if (SERVLET_5_0.equals(getJavaEEVersion())) {
+				imports.add(IServletConstants.QUALIFIED_JAKARTA_SERVLET_CONTEXT_LISTENER);
+				imports.add(IServletConstants.QUALIFIED_JAKARTA_SERVLET_CONTEXT_EVENT);
+			}
+			else {
+				imports.add(QUALIFIED_SERVLET_CONTEXT_LISTENER);
+				imports.add(QUALIFIED_SERVLET_CONTEXT_EVENT);
+			}
 		}
 		
 		if (implementServletContextAttributeListener()) {
-			collection.add(QUALIFIED_SERVLET_CONTEXT_ATTRIBUTE_LISTENER);
-			collection.add(QUALIFIED_SERVLET_CONTEXT_ATTRIBUTE_EVENT);
+			if (SERVLET_5_0.equals(getJavaEEVersion())) {
+				imports.add(IServletConstants.QUALIFIED_SERVLET_CONTEXT_ATTRIBUTE_LISTENER);
+				imports.add(IServletConstants.QUALIFIED_SERVLET_CONTEXT_ATTRIBUTE_EVENT);
+			}
+			else {
+				imports.add(QUALIFIED_SERVLET_CONTEXT_ATTRIBUTE_LISTENER);
+				imports.add(QUALIFIED_SERVLET_CONTEXT_ATTRIBUTE_EVENT);
+			}
 		}
 		
 		if (implementHttpSessionListener()) {
-			collection.add(QUALIFIED_HTTP_SESSION_LISTENER);
-			collection.add(QUALIFIED_HTTP_SESSION_EVENT);
+			if (SERVLET_5_0.equals(getJavaEEVersion())) {
+				imports.add(IServletConstants.QUALIFIED_HTTP_SESSION_LISTENER);
+				imports.add(IServletConstants.QUALIFIED_HTTP_SESSION_EVENT);
+			}
+			else {
+				imports.add(QUALIFIED_HTTP_SESSION_LISTENER);
+				imports.add(QUALIFIED_HTTP_SESSION_EVENT);
+			}
 		}
 		
 		if (implementHttpSessionAttributeListener()) {
-			collection.add(QUALIFIED_HTTP_SESSION_ATTRIBUTE_LISTENER);
-			collection.add(QUALIFIED_HTTP_SESSION_BINDING_EVENT);
+			if (SERVLET_5_0.equals(getJavaEEVersion())) {
+				imports.add(IServletConstants.QUALIFIED_HTTP_SESSION_ATTRIBUTE_LISTENER);
+				imports.add(IServletConstants.QUALIFIED_HTTP_SESSION_BINDING_EVENT);
+			}
+			else {
+				imports.add(QUALIFIED_HTTP_SESSION_ATTRIBUTE_LISTENER);
+				imports.add(QUALIFIED_HTTP_SESSION_BINDING_EVENT);
+			}
 		}
 		
 		if (implementHttpSessionActivationListener()) {
-			collection.add(QUALIFIED_HTTP_SESSION_ACTIVATION_LISTENER);
-			collection.add(QUALIFIED_HTTP_SESSION_EVENT);
+			if (SERVLET_5_0.equals(getJavaEEVersion())) {
+				imports.add(IServletConstants.QUALIFIED_HTTP_SESSION_ACTIVATION_LISTENER);
+				imports.add(IServletConstants.QUALIFIED_HTTP_SESSION_EVENT);
+			}
+			else {
+				imports.add(QUALIFIED_HTTP_SESSION_ACTIVATION_LISTENER);
+				imports.add(QUALIFIED_HTTP_SESSION_EVENT);
+			}
 		}
 		
 		if (implementHttpSessionBindingListener()) {
-			collection.add(QUALIFIED_HTTP_SESSION_BINDING_LISTENER);
-			collection.add(QUALIFIED_HTTP_SESSION_BINDING_EVENT);
+			if (SERVLET_5_0.equals(getJavaEEVersion())) {
+				imports.add(IServletConstants.QUALIFIED_HTTP_SESSION_BINDING_LISTENER);
+				imports.add(IServletConstants.QUALIFIED_HTTP_SESSION_BINDING_EVENT);
+			}
+			else {
+				imports.add(QUALIFIED_HTTP_SESSION_BINDING_LISTENER);
+				imports.add(QUALIFIED_HTTP_SESSION_BINDING_EVENT);
+			}
 		}
 		
 		if (implementServletRequestListener()) {
-			collection.add(QUALIFIED_SERVLET_REQUEST_LISTENER);
-			collection.add(QUALIFIED_SERVLET_REQUEST_EVENT);
+			if (SERVLET_5_0.equals(getJavaEEVersion())) {
+				imports.add(IServletConstants.QUALIFIED_SERVLET_REQUEST_LISTENER);
+				imports.add(IServletConstants.QUALIFIED_SERVLET_REQUEST_EVENT);
+			}
+			else {
+				imports.add(QUALIFIED_SERVLET_REQUEST_LISTENER);
+				imports.add(QUALIFIED_SERVLET_REQUEST_EVENT);
+			}
 		}
 		
 		if (implementServletRequestAttributeListener()) {
-			collection.add(QUALIFIED_SERVLET_REQUEST_ATTRIBUTE_LISTENER);
-			collection.add(QUALIFIED_SERVLET_REQUEST_ATTRIBUTE_EVENT);
+			if (SERVLET_5_0.equals(getJavaEEVersion())) {
+				imports.add(IServletConstants.QUALIFIED_SERVLET_REQUEST_ATTRIBUTE_LISTENER);
+				imports.add(IServletConstants.QUALIFIED_SERVLET_REQUEST_ATTRIBUTE_EVENT);
+			}
+			else {
+				imports.add(QUALIFIED_SERVLET_REQUEST_ATTRIBUTE_LISTENER);
+				imports.add(QUALIFIED_SERVLET_REQUEST_ATTRIBUTE_EVENT);
+			}
 		}
 		
-		if (SERVLET_3.equals(getJavaEEVersion()) || SERVLET_3_1.equals(getJavaEEVersion()) || SERVLET_4_0.equals(getJavaEEVersion())){
-			collection.add(QUALIFIED_WEB_LISTENER);
+		if (SERVLET_5_0.equals(getJavaEEVersion())) {
+			imports.add(IServletConstants.QUALIFIED_JAKARTA_WEB_LISTENER);
+		}
+		else if (SERVLET_3.equals(getJavaEEVersion()) || SERVLET_3_1.equals(getJavaEEVersion()) || SERVLET_4_0.equals(getJavaEEVersion())){
+			imports.add(QUALIFIED_WEB_LISTENER);
 		}
 		
-		return collection;
+		return imports;
 	}
 
 	public CreateListenerTemplateModel(IDataModel dataModel) {
diff --git a/plugins/org.eclipse.jst.j2ee.web/web/org/eclipse/jst/j2ee/internal/web/operations/NewFilterClassDataModelProvider.java b/plugins/org.eclipse.jst.j2ee.web/web/org/eclipse/jst/j2ee/internal/web/operations/NewFilterClassDataModelProvider.java
index 21ef143..68e7a48 100644
--- a/plugins/org.eclipse.jst.j2ee.web/web/org/eclipse/jst/j2ee/internal/web/operations/NewFilterClassDataModelProvider.java
+++ b/plugins/org.eclipse.jst.j2ee.web/web/org/eclipse/jst/j2ee/internal/web/operations/NewFilterClassDataModelProvider.java
@@ -328,7 +328,7 @@
 			}
 		}
 		// Return interface list
-		return interfaceList;
+		return jakartaInterfaceList;
 	}
 
 	/**
diff --git a/plugins/org.eclipse.jst.servlet.ui/servlet_ui/org/eclipse/jst/servlet/ui/internal/wizard/AddListenerWizardPage.java b/plugins/org.eclipse.jst.servlet.ui/servlet_ui/org/eclipse/jst/servlet/ui/internal/wizard/AddListenerWizardPage.java
index 1681b8a..f99fbd5 100644
--- a/plugins/org.eclipse.jst.servlet.ui/servlet_ui/org/eclipse/jst/servlet/ui/internal/wizard/AddListenerWizardPage.java
+++ b/plugins/org.eclipse.jst.servlet.ui/servlet_ui/org/eclipse/jst/servlet/ui/internal/wizard/AddListenerWizardPage.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2008 SAP AG and others.
+ * Copyright (c) 2008, 2022 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
@@ -15,22 +15,48 @@
 import static org.eclipse.jst.j2ee.web.IServletConstants.QUALIFIED_HTTP_SESSION_ACTIVATION_LISTENER;
 import static org.eclipse.jst.j2ee.web.IServletConstants.QUALIFIED_HTTP_SESSION_ATTRIBUTE_LISTENER;
 import static org.eclipse.jst.j2ee.web.IServletConstants.QUALIFIED_HTTP_SESSION_BINDING_LISTENER;
+import static org.eclipse.jst.j2ee.web.IServletConstants.QUALIFIED_HTTP_SESSION_ID_LISTENER;
 import static org.eclipse.jst.j2ee.web.IServletConstants.QUALIFIED_HTTP_SESSION_LISTENER;
 import static org.eclipse.jst.j2ee.web.IServletConstants.QUALIFIED_SERVLET_CONTEXT_ATTRIBUTE_LISTENER;
 import static org.eclipse.jst.j2ee.web.IServletConstants.QUALIFIED_SERVLET_CONTEXT_LISTENER;
+import static org.eclipse.jst.j2ee.web.IServletConstants.QUALIFIED_SERVLET_REQUEST_ASYNC_EVENT_LISTENER;
 import static org.eclipse.jst.j2ee.web.IServletConstants.QUALIFIED_SERVLET_REQUEST_ATTRIBUTE_LISTENER;
 import static org.eclipse.jst.j2ee.web.IServletConstants.QUALIFIED_SERVLET_REQUEST_LISTENER;
-import static org.eclipse.jst.j2ee.web.IServletConstants.QUALIFIED_HTTP_SESSION_ID_LISTENER;
-import static org.eclipse.jst.j2ee.web.IServletConstants.QUALIFIED_SERVLET_REQUEST_ASYNC_EVENT_LISTENER;
-import static org.eclipse.jst.servlet.ui.internal.wizard.IWebWizardConstants.*;
+import static org.eclipse.jst.servlet.ui.internal.wizard.IWebWizardConstants.ADD_LISTENER_WIZARD_ASYNC_EVENTS;
+import static org.eclipse.jst.servlet.ui.internal.wizard.IWebWizardConstants.ADD_LISTENER_WIZARD_CHANGES_TO_ATTRIBUTES_C;
+import static org.eclipse.jst.servlet.ui.internal.wizard.IWebWizardConstants.ADD_LISTENER_WIZARD_CHANGES_TO_ATTRIBUTES_G;
+import static org.eclipse.jst.servlet.ui.internal.wizard.IWebWizardConstants.ADD_LISTENER_WIZARD_CHANGES_TO_ATTRIBUTES_H;
+import static org.eclipse.jst.servlet.ui.internal.wizard.IWebWizardConstants.ADD_LISTENER_WIZARD_HTTP_SESSION_EVENTS;
+import static org.eclipse.jst.servlet.ui.internal.wizard.IWebWizardConstants.ADD_LISTENER_WIZARD_LIFECYCLE_I;
+import static org.eclipse.jst.servlet.ui.internal.wizard.IWebWizardConstants.ADD_LISTENER_WIZARD_LIFECYCLE_L;
+import static org.eclipse.jst.servlet.ui.internal.wizard.IWebWizardConstants.ADD_LISTENER_WIZARD_LIFECYCLE_Y;
+import static org.eclipse.jst.servlet.ui.internal.wizard.IWebWizardConstants.ADD_LISTENER_WIZARD_OBJECT_BINDING;
+import static org.eclipse.jst.servlet.ui.internal.wizard.IWebWizardConstants.ADD_LISTENER_WIZARD_OBJECT_SESSION_ID;
+import static org.eclipse.jst.servlet.ui.internal.wizard.IWebWizardConstants.ADD_LISTENER_WIZARD_PAGE_DESC;
+import static org.eclipse.jst.servlet.ui.internal.wizard.IWebWizardConstants.ADD_LISTENER_WIZARD_PAGE_TITLE;
+import static org.eclipse.jst.servlet.ui.internal.wizard.IWebWizardConstants.ADD_LISTENER_WIZARD_SERVLET_CONTEXT_EVENTS;
+import static org.eclipse.jst.servlet.ui.internal.wizard.IWebWizardConstants.ADD_LISTENER_WIZARD_SERVLET_REQUEST_EVENTS;
+import static org.eclipse.jst.servlet.ui.internal.wizard.IWebWizardConstants.ADD_LISTENER_WIZARD_SESSION_MIGRATION;
+import static org.eclipse.jst.servlet.ui.internal.wizard.IWebWizardConstants.CLEAR_BUTTON;
+import static org.eclipse.jst.servlet.ui.internal.wizard.IWebWizardConstants.SELECT_ALL_BUTTON;
 
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaCore;
 import org.eclipse.jdt.internal.ui.JavaPluginImages;
 import org.eclipse.jface.dialogs.Dialog;
 import org.eclipse.jst.j2ee.internal.web.operations.INewServletClassDataModelProperties;
+import org.eclipse.jst.j2ee.internal.web.operations.NewListenerClassDataModelProvider;
+import org.eclipse.jst.j2ee.internal.web.plugin.WebPlugin;
+import org.eclipse.jst.j2ee.project.JavaEEProjectUtilities;
+import org.eclipse.jst.j2ee.web.IServletConstants;
+import org.eclipse.jst.j2ee.web.project.facet.WebFacetUtils;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.SelectionAdapter;
 import org.eclipse.swt.events.SelectionEvent;
@@ -41,9 +67,13 @@
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Group;
 import org.eclipse.swt.widgets.Label;
+import org.eclipse.wst.common.componentcore.internal.operation.IArtifactEditOperationDataModelProperties;
+import org.eclipse.wst.common.componentcore.internal.util.FacetedProjectUtilities;
 import org.eclipse.wst.common.frameworks.datamodel.DataModelEvent;
 import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
 import org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelWizardPage;
+import org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonPlugin;
+import org.eclipse.wst.common.project.facet.core.FacetedProjectFramework;
 
 public class AddListenerWizardPage extends DataModelWizardPage  {
 	
@@ -99,62 +129,68 @@
 	private void createServletContextEvents(Composite parent) {
 		Group group = createGroup(parent, ADD_LISTENER_WIZARD_SERVLET_CONTEXT_EVENTS);
 
+		boolean useJakartaPackages = useJakartaPackages();
+
 		createEventListenerRow(group, 
-				ADD_LISTENER_WIZARD_LIFECYCLE_L, 
-				QUALIFIED_SERVLET_CONTEXT_LISTENER,
+				ADD_LISTENER_WIZARD_LIFECYCLE_L,
+				useJakartaPackages ? IServletConstants.QUALIFIED_JAKARTA_SERVLET_CONTEXT_LISTENER : QUALIFIED_SERVLET_CONTEXT_LISTENER,
 				INTERFACES);
 
 		createEventListenerRow(group, 
-				ADD_LISTENER_WIZARD_CHANGES_TO_ATTRIBUTES_C, 
-				QUALIFIED_SERVLET_CONTEXT_ATTRIBUTE_LISTENER, 
+				ADD_LISTENER_WIZARD_CHANGES_TO_ATTRIBUTES_C,
+				useJakartaPackages ? IServletConstants.QUALIFIED_JAKARTA_SERVLET_CONTEXT_ATTRIBUTE_LISTENER : QUALIFIED_SERVLET_CONTEXT_ATTRIBUTE_LISTENER,
 				INTERFACES);
 	}
 	
 	private void createHttpSessionEvents(Composite parent) {
 		Group group = createGroup(parent, ADD_LISTENER_WIZARD_HTTP_SESSION_EVENTS);
 		
+		boolean useJakartaPackages = useJakartaPackages();
+
 		createEventListenerRow(group, 
-				ADD_LISTENER_WIZARD_LIFECYCLE_I, 
-				QUALIFIED_HTTP_SESSION_LISTENER, 
+				ADD_LISTENER_WIZARD_LIFECYCLE_I,
+				useJakartaPackages ? IServletConstants.QUALIFIED_JAKARTA_HTTP_SESSION_LISTENER : QUALIFIED_HTTP_SESSION_LISTENER,
 				INTERFACES);
 		
 		createEventListenerRow(group, 
-				ADD_LISTENER_WIZARD_CHANGES_TO_ATTRIBUTES_H, 
-				QUALIFIED_HTTP_SESSION_ATTRIBUTE_LISTENER, 
+				ADD_LISTENER_WIZARD_CHANGES_TO_ATTRIBUTES_H,
+				useJakartaPackages ? IServletConstants.QUALIFIED_JAKARTA_HTTP_SESSION_ATTRIBUTE_LISTENER : QUALIFIED_HTTP_SESSION_ATTRIBUTE_LISTENER,
 				INTERFACES);
 		
 		createEventListenerRow(group, 
-				ADD_LISTENER_WIZARD_SESSION_MIGRATION, 
-				QUALIFIED_HTTP_SESSION_ACTIVATION_LISTENER, 
+				ADD_LISTENER_WIZARD_SESSION_MIGRATION,
+				useJakartaPackages ? IServletConstants.QUALIFIED_JAKARTA_HTTP_SESSION_ACTIVATION_LISTENER : QUALIFIED_HTTP_SESSION_ACTIVATION_LISTENER,
 				INTERFACES);
 		
-		createEventListenerRow(group, 
-				ADD_LISTENER_WIZARD_OBJECT_BINDING, 
-				QUALIFIED_HTTP_SESSION_BINDING_LISTENER, 
+		createEventListenerRow(group,
+				ADD_LISTENER_WIZARD_OBJECT_BINDING,
+				useJakartaPackages ? IServletConstants.QUALIFIED_JAKARTA_HTTP_SESSION_BINDING_LISTENER : QUALIFIED_HTTP_SESSION_BINDING_LISTENER,
 				INTERFACES);
 		
-		createEventListenerRow(group, 
-				ADD_LISTENER_WIZARD_OBJECT_SESSION_ID, 
-				QUALIFIED_HTTP_SESSION_ID_LISTENER, 
-				INTERFACES);		
+		createEventListenerRow(group,
+				ADD_LISTENER_WIZARD_OBJECT_SESSION_ID,
+				useJakartaPackages ? IServletConstants.QUALIFIED_JAKARTA_HTTP_SESSION_ID_LISTENER : QUALIFIED_HTTP_SESSION_ID_LISTENER,
+				INTERFACES);
 	}
 	
 	private void createServletRequestEvents(Composite parent) {
 		Group group = createGroup(parent, ADD_LISTENER_WIZARD_SERVLET_REQUEST_EVENTS);
 		
-		createEventListenerRow(group, 
-				ADD_LISTENER_WIZARD_LIFECYCLE_Y, 
-				QUALIFIED_SERVLET_REQUEST_LISTENER, 
+		boolean useJakartaPackages = useJakartaPackages();
+
+		createEventListenerRow(group,
+				ADD_LISTENER_WIZARD_LIFECYCLE_Y,
+				useJakartaPackages ? IServletConstants.QUALIFIED_JAKARTA_SERVLET_REQUEST_LISTENER : QUALIFIED_SERVLET_REQUEST_LISTENER,
 				INTERFACES);
 
-		createEventListenerRow(group, 
-				ADD_LISTENER_WIZARD_CHANGES_TO_ATTRIBUTES_G, 
-				QUALIFIED_SERVLET_REQUEST_ATTRIBUTE_LISTENER, 
+		createEventListenerRow(group,
+				ADD_LISTENER_WIZARD_CHANGES_TO_ATTRIBUTES_G,
+				useJakartaPackages ? IServletConstants.QUALIFIED_JAKARTA_SERVLET_REQUEST_ATTRIBUTE_LISTENER : QUALIFIED_SERVLET_REQUEST_ATTRIBUTE_LISTENER,
 				INTERFACES);
 		
-		createEventListenerRow(group, 
-				ADD_LISTENER_WIZARD_ASYNC_EVENTS, 
-				QUALIFIED_SERVLET_REQUEST_ASYNC_EVENT_LISTENER, 
+		createEventListenerRow(group,
+				ADD_LISTENER_WIZARD_ASYNC_EVENTS,
+				useJakartaPackages ? IServletConstants.QUALIFIED_JAKARTA_SERVLET_REQUEST_ASYNC_EVENT_LISTENER : QUALIFIED_SERVLET_REQUEST_ASYNC_EVENT_LISTENER,
 				INTERFACES);		
 	
 	}
@@ -171,12 +207,12 @@
 	}
 	
 	private void createEventListenerRow(Composite parent, String event, String listener, String property) {
-		if (listener.equals(QUALIFIED_HTTP_SESSION_ID_LISTENER)){
+		if (listener.equals(QUALIFIED_HTTP_SESSION_ID_LISTENER) || listener.equals(IServletConstants.QUALIFIED_JAKARTA_HTTP_SESSION_ID_LISTENER)){
 			changeSessionID = createCheckbox(parent, event, listener, property);
 			changeSessionIDIconLabel = createInterfaceIcon(parent);
 			changeSessionIDInterfaceLabel = createInterfaceLabel(parent, listener);
 		}
-		else if (listener.equals(QUALIFIED_SERVLET_REQUEST_ASYNC_EVENT_LISTENER)){
+		else if (listener.equals(QUALIFIED_SERVLET_REQUEST_ASYNC_EVENT_LISTENER) || listener.equals(IServletConstants.QUALIFIED_JAKARTA_SERVLET_REQUEST_ASYNC_EVENT_LISTENER)){
 			asyncListener = createCheckbox(parent, event, listener, property);
 			asyncListenerIconLabel = createInterfaceIcon(parent);
 			asyncListenerInterfaceLabel = createInterfaceLabel(parent, listener);
@@ -247,10 +283,18 @@
 			interfaces = new ArrayList();
 			model.setProperty(INTERFACES, interfaces);
 		}
-		
-		for (String iface : LISTENER_INTERFACES) {
-			if (!interfaces.contains(iface)) {
-				interfaces.add(iface);
+		if (useJakartaPackages()) {
+			for (String iface : NewListenerClassDataModelProvider.JAKARTA_LISTENER_INTERFACES) {
+				if (!interfaces.contains(iface)) {
+					interfaces.add(iface);
+				}
+			}
+		}
+		else {
+			for (String iface : LISTENER_INTERFACES) {
+				if (!interfaces.contains(iface)) {
+					interfaces.add(iface);
+				}
 			}
 		}
 		
@@ -266,7 +310,8 @@
 		}
 		
 		interfaces.removeAll(Arrays.asList(LISTENER_INTERFACES));
-		
+		interfaces.removeAll(Arrays.asList(NewListenerClassDataModelProvider.JAKARTA_LISTENER_INTERFACES));
+
 		synchHelper2.synchUIWithModel(INTERFACES, DataModelEvent.VALUE_CHG);
 		model.notifyPropertyChange(INTERFACES, DataModelEvent.VALUE_CHG);
 	}
@@ -283,8 +328,65 @@
 			setServlet31ListenersVisible(false);
 		}
 	}
-	
-	
+
+	private boolean useJakartaPackages() {
+		Object nameValue = model.getProperty(IArtifactEditOperationDataModelProperties.PROJECT_NAME);
+		if (nameValue != null) {
+			String projectName = nameValue.toString();
+
+			try {
+				IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName);
+				String id = null;
+				if(JavaEEProjectUtilities.isDynamicWebProject(project)){
+					id = WebFacetUtils.WEB_FACET.getId();
+				}else {
+					id = WebFacetUtils.WEBFRAGMENT_FACET.getId();
+				}
+				String facetVersion = FacetedProjectUtilities.getProjectFacetVersion(project, id).getVersionString();
+				if (facetVersion != null && facetVersion.length() > 0) {
+					float f = Float.parseFloat(facetVersion);
+					return f >= 5;
+				}
+			}
+			catch (NullPointerException e) {
+				// not a faceted project, then
+			}
+			catch (NumberFormatException e) {
+				// this should never happen
+				WTPCommonPlugin.logError(e);
+			}
+
+			if (projectName != null && projectName.length() > 0) {
+				IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName);
+				if (project != null && project.isAccessible()) {
+					// the default when otherwise indeterminate should be Jakarta
+					try {
+						IJavaProject javaProject = JavaCore.create(project);
+						if (javaProject != null && javaProject.exists()) {
+							if (javaProject.findType(IServletConstants.QUALIFIED_JAKARTA_GENERIC_SERVLET) != null) {
+								return true;
+							}
+						}
+					}
+					catch (CoreException e) {
+						WTPCommonPlugin.logError(e);
+					}
+					try {
+						// check to see if it is Jakarta Servlet 5 or newer
+						if (FacetedProjectFramework.hasProjectFacet(project, WebFacetUtils.WEB_FACET.getId(), WebFacetUtils.WEB_50.getVersionString())) {
+							return true;
+						}
+					}
+					catch (CoreException e) {
+						WebPlugin.log(e);
+					}
+				}
+			}
+			return false;
+		}
+		return false;
+	}
+
 	private void setServlet31ListenersVisible(boolean visible){
 		changeSessionID.setVisible(visible);
 		changeSessionIDIconLabel.setVisible(visible);
