diff --git a/appserver/admin/template/src/main/resources/config/default-web.xml b/appserver/admin/template/src/main/resources/config/default-web.xml
index 33f6c03..e16a530 100644
--- a/appserver/admin/template/src/main/resources/config/default-web.xml
+++ b/appserver/admin/template/src/main/resources/config/default-web.xml
@@ -313,7 +313,6 @@
         jakarta.security.auth.message-api.jar
         jakarta.authorization-api.jar
         jakarta.transaction-api.jar
-        jakarta.xml.rpc-api.jar
         webservices-osgi.jar
         weld-osgi-bundle.jar
         jersey-mvc-jsp.jar
diff --git a/appserver/core/api-exporter-fragment/pom.xml b/appserver/core/api-exporter-fragment/pom.xml
index f540319..c482434 100755
--- a/appserver/core/api-exporter-fragment/pom.xml
+++ b/appserver/core/api-exporter-fragment/pom.xml
@@ -290,13 +290,6 @@
 javax.xml.parsers; \
 javax.xml.registry; \
 javax.xml.registry.infomodel; \
-javax.xml.rpc; \
-javax.xml.rpc.encoding; \
-javax.xml.rpc.handler; \
-javax.xml.rpc.handler.soap; \
-javax.xml.rpc.holders; \
-javax.xml.rpc.server; \
-javax.xml.rpc.soap; \
 javax.xml.soap; \
 javax.xml.stream; \
 javax.xml.stream.events; \
diff --git a/appserver/deployment/dol/src/main/java/com/sun/enterprise/deployment/ServiceReferenceDescriptor.java b/appserver/deployment/dol/src/main/java/com/sun/enterprise/deployment/ServiceReferenceDescriptor.java
index 235e765..594fdee 100644
--- a/appserver/deployment/dol/src/main/java/com/sun/enterprise/deployment/ServiceReferenceDescriptor.java
+++ b/appserver/deployment/dol/src/main/java/com/sun/enterprise/deployment/ServiceReferenceDescriptor.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2018 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2020 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -211,7 +211,7 @@
     }
 
     public boolean hasGenericServiceInterface() {
-        return "javax.xml.rpc.Service".equals(serviceInterface);
+        return false;
     }
 
     public boolean hasGeneratedServiceInterface() {
diff --git a/appserver/deployment/schemas/src/main/resources/glassfish/lib/schemas/jax-rpc-ri-config.xsd b/appserver/deployment/schemas/src/main/resources/glassfish/lib/schemas/jax-rpc-ri-config.xsd
deleted file mode 100644
index b45afba..0000000
--- a/appserver/deployment/schemas/src/main/resources/glassfish/lib/schemas/jax-rpc-ri-config.xsd
+++ /dev/null
@@ -1,433 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    Copyright (c) 1997, 2018 Oracle and/or its affiliates. All rights reserved.
-
-    This program and the accompanying materials are made available under the
-    terms of the Eclipse Public License v. 2.0, which is available at
-    http://www.eclipse.org/legal/epl-2.0.
-
-    This Source Code may also be made available under the following Secondary
-    Licenses when the conditions for such availability set forth in the
-    Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
-    version 2 with the GNU Classpath Exception, which is available at
-    https://www.gnu.org/software/classpath/license.html.
-
-    SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
-
--->
-
-<xsd:schema
-        xmlns:xsd="http://www.w3.org/2001/XMLSchema"
-        xmlns:tns="http://java.sun.com/xml/ns/jax-rpc/ri/config"
-        targetNamespace="http://java.sun.com/xml/ns/jax-rpc/ri/config"
-        elementFormDefault="qualified"
-        attributeFormDefault="unqualified"
-        version="1.0">
-
-    <xsd:annotation>
-        <xsd:documentation>
-        This is the schema for wscompile configuration files.
-        The only allowed top-level element is "configuration".
-        </xsd:documentation>
-    </xsd:annotation>
-
-    <xsd:element name="configuration">
-        <xsd:annotation>
-            <xsd:documentation>
-            The top-level element. It must contain one out of three possible elements,
-            corresponding to three different ways to feed service information to the tool.
-            
-            Elements: (mutually exclusive)
-                "service" - a service description based on a set of service endpoint interfaces;
-                "wsdl" - a WSDL document to import and process;
-                "modelfile" - a previously saved model file (-model option in wscompile).
-                "j2eeMappingFile" - J2EE mapping information defined by JSR 109
-            </xsd:documentation>
-        </xsd:annotation>
-        <xsd:complexType>
-            <xsd:sequence>
-                <xsd:choice>
-                    <xsd:element name="service" type="tns:serviceType"/>
-                    <xsd:element name="wsdl" type="tns:wsdlType"/>
-                    <xsd:element name="modelfile" type="tns:modelfileType"/>
-			  <xsd:element name="j2eeMappingFile" type="tns:j2eeMappingFileType"/>
-                </xsd:choice>
-            </xsd:sequence>
-        </xsd:complexType>
-    </xsd:element>
-
-    <xsd:complexType name="serviceType">
-        <xsd:annotation>
-            <xsd:documentation>
-            A description of a service based on a set of Java interfaces (called "service endpoint
-            interfaces" in the spec).
-            
-            Attributes:
-                "name" - service name;
-                "targetNamespace" - target namespace for the generated WSDL document;
-                "typeNamespace" - target namespace for the XML Schema embedded in the generated WSDL document;
-                "packageName" - name of the Java package to use by default.
-                
-            Elements:
-                "interface"* - a sequence of service endpoint interface descriptions;
-                "typeMappingRegistry"? - the type mapping registry to use for this service;
-                "handlerChains"? - default handler chains for the endpoints in this service;
-                "namespaceMappingRegistry"? - XML namespace to Java package mapping information.
-            </xsd:documentation>
-        </xsd:annotation>
-
-        <xsd:sequence>
-            <xsd:element name="interface" type="tns:interfaceType" minOccurs="0" maxOccurs="unbounded"/>
-            <xsd:element name="typeMappingRegistry" type="tns:typeMappingRegistryType" minOccurs="0"/>
-            <xsd:element name="handlerChains" type="tns:handlerChainsType" minOccurs="0"/>
-            <xsd:element name="namespaceMappingRegistry" type="tns:namespaceMappingRegistryType" minOccurs="0"/>
-        </xsd:sequence>
-        <xsd:attribute name="name" type="xsd:string" use="required"/>
-        <xsd:attribute name="targetNamespace" type="xsd:anyURI" use="required"/>
-        <xsd:attribute name="typeNamespace" type="xsd:anyURI" use="required"/>
-        <xsd:attribute name="packageName" type="xsd:string" use="required"/>
-    </xsd:complexType>
-
-    <xsd:complexType name="interfaceType">
-        <xsd:annotation>
-            <xsd:documentation>
-            An endpoint definition based on a service endpoint interface.
-            
-            Attributes:
-                "name" - name of the service endpoint interface (a Java interface);
-                "servantName" (optional) - name of the service endpoint implementation class;
-                "soapAction" (optional) - SOAPAction string to use for all operations in the interface;
-                "soapActionBase" (optional) - base URI for the SOAPAction string; the SOAPAction for
-                    a given operation will be obtained by appending the operation name to the value provided
-                    here; this attribute is exclusive with the "soapAction" one.
-                    
-            Elements:
-                "handlerChains" - specifies the handler chains for this endpoint.
-            </xsd:documentation>
-        </xsd:annotation>
-
-        <xsd:sequence>
-            <xsd:element name="handlerChains" type="tns:handlerChainsType" minOccurs="0"/>
-        </xsd:sequence>
-        <xsd:attribute name="name" type="xsd:string" use="required"/>
-        <xsd:attribute name="servantName" type="xsd:string"/>
-        <xsd:attribute name="soapAction" type="xsd:string"/>
-        <xsd:attribute name="soapActionBase" type="xsd:string"/>
-    </xsd:complexType>
-
-    <xsd:complexType name="wsdlType">
-        <xsd:annotation>
-            <xsd:documentation>
-            A description of a service based on an existing WSDL document.
-            
-            Attributes:
-                "location" - URL of the WSDL document;
-                "packageName" - name of the Java package to use by default.
-                
-            Elements:
-                "typeMappingRegistry"? - the type mapping registry to use for this service;
-                "handlerChains"? - default handler chains for the endpoints in this service;
-                "namespaceMappingRegistry"? - XML namespace to Java package mapping information.
-            </xsd:documentation>
-        </xsd:annotation>
-
-        <xsd:sequence>
-            <xsd:element name="typeMappingRegistry" type="tns:typeMappingRegistryType" minOccurs="0"/>
-            <xsd:element name="handlerChains" type="tns:handlerChainsType" minOccurs="0"/>
-            <xsd:element name="namespaceMappingRegistry" type="tns:namespaceMappingRegistryType" minOccurs="0"/>
-        </xsd:sequence>
-        <xsd:attribute name="location" type="xsd:anyURI" use="required"/>
-        <xsd:attribute name="packageName" type="xsd:string" use="required"/>
-    </xsd:complexType>
-
-    <xsd:complexType name="modelfileType">
-        <xsd:annotation>
-            <xsd:documentation>
-            A description of a service based on an existing model file.
-            
-            Attributes:
-                "location" - URL of the model file (typically ending in .xml.gz);
-            </xsd:documentation>
-        </xsd:annotation>
-
-        <xsd:sequence>
-        </xsd:sequence>
-        <xsd:attribute name="location" type="xsd:anyURI" use="required"/>
-    </xsd:complexType>
-
-    <xsd:complexType name="j2eeMappingFileType">
-        <xsd:annotation>
-            <xsd:documentation>
-            
-            Attirbutes:
-                "location" - the J2EE mapping file URL
-                "wsdlLocation" - the wsdl file URL
-                
-            </xsd:documentation>
-        </xsd:annotation>
-
-        <xsd:attribute name="location" type="xsd:anyURI" use="required"/>
-        <xsd:attribute name="wsdlLocation" type="xsd:anyURI" use="required"/>
-    </xsd:complexType>
-
-
-    <xsd:complexType name="handlerChainsType">
-        <xsd:annotation>
-            <xsd:documentation>
-            A set of handlerChains.
-            </xsd:documentation>
-        </xsd:annotation>
-
-        <xsd:sequence>
-            <xsd:element name="chain" type="tns:chainType" minOccurs="0" maxOccurs="unbounded"/>
-        </xsd:sequence>
-    </xsd:complexType>
-
-    <xsd:complexType name="chainType">
-        <xsd:annotation>
-            <xsd:documentation>
-            A handler chain.
-            
-            Attributes:
-                "runAt" - specifies whether the chain must run on the client or the server;
-                "roles" - the SOAP roles for the chain.
-                
-            Elements:
-                "handler"* - a sequence of handlers that form this chain.
-            </xsd:documentation>
-        </xsd:annotation>
-
-        <xsd:sequence>
-            <xsd:element name="handler" type="tns:handlerType" minOccurs="0" maxOccurs="unbounded"/>
-        </xsd:sequence>
-        <xsd:attribute name="runAt" type="tns:runAtType" use="required"/>
-        <xsd:attribute name="roles" type="tns:roleListType"/>
-    </xsd:complexType>
-
-    <xsd:simpleType name="roleListType">
-        <xsd:annotation>
-            <xsd:documentation>
-            A list of SOAP roles, i.e. a list of URIs.
-            </xsd:documentation>
-        </xsd:annotation>
-
-        <xsd:list itemType="xsd:anyURI"/>
-    </xsd:simpleType>
-
-    <xsd:complexType name="handlerType">
-        <xsd:annotation>
-            <xsd:documentation>
-            A handler description.
-            
-            Attributes:
-                "className" - the name of the handler's class;
-                "headers" - the names of the headers consumed by this handler.
-            
-            Elements:
-                "property"* - initialization properties for this handler.
-            </xsd:documentation>
-        </xsd:annotation>
-
-        <xsd:sequence>
-            <xsd:element name="property" type="tns:propertyType" minOccurs="0" maxOccurs="unbounded"/>
-        </xsd:sequence>
-        <xsd:attribute name="className" type="xsd:string" use="required"/>
-        <xsd:attribute name="headers" type="tns:headerListType"/>
-    </xsd:complexType>
-
-    <xsd:simpleType name="headerListType">
-        <xsd:annotation>
-            <xsd:documentation>
-            A list of header names, i.e. a list of QNames.
-            </xsd:documentation>
-        </xsd:annotation>
-
-        <xsd:list itemType="xsd:QName"/>
-    </xsd:simpleType>
-
-    <xsd:complexType name="propertyType">
-        <xsd:annotation>
-            <xsd:documentation>
-            An initialization property for a handler.
-            
-            Attributes:
-                "name" - the name of the property;
-                "value" - its value.
-            </xsd:documentation>
-        </xsd:annotation>
-
-        <xsd:sequence>
-        </xsd:sequence>
-        <xsd:attribute name="name" type="xsd:string" use="required"/>
-        <xsd:attribute name="value" type="xsd:string" use="required"/>
-    </xsd:complexType>
-
-    <xsd:simpleType name ="runAtType">
-        <xsd:annotation>
-            <xsd:documentation>
-            The places a handler chain can run at, one of "client" or "server".
-            </xsd:documentation>
-        </xsd:annotation>
-
-        <xsd:restriction base="xsd:string">
-            <xsd:enumeration value="client"/>
-            <xsd:enumeration value="server"/>
-        </xsd:restriction>
-    </xsd:simpleType>
-
-    <xsd:complexType name="typeMappingRegistryType">
-        <xsd:annotation>
-            <xsd:documentation>
-            A type mapping registry.
-            
-            Elements:
-                "import"? - a list of XML Schema documents that describe user-defined types.
-                "typeMapping"* - a sequence of type mappings, one per encoding.
-                "additionalTypes"? - a list of additional Java types that should be processed even if
-                    don't appear in the interfaces for the service.
-            </xsd:documentation>
-        </xsd:annotation>
-
-        <xsd:sequence>
-            <xsd:element name="import" type="tns:importType" minOccurs="0"/>
-            <xsd:element name="typeMapping" type="tns:typeMappingType" minOccurs="0" maxOccurs="unbounded"/>
-            <xsd:element name="additionalTypes" type="tns:additionalTypesType" minOccurs="0"/>
-        </xsd:sequence>
-    </xsd:complexType>
-
-    <xsd:complexType name="importType">
-            <xsd:annotation>
-            <xsd:documentation>
-            A list of schema documents to import, usually describing schema types used
-            by pluggable serializers.
-            
-            Elements:
-                "schema"* - a list of schema documents to import.
-            </xsd:documentation>
-        </xsd:annotation>
-
-        <xsd:sequence>
-            <xsd:element name="schema" type="tns:schemaType" minOccurs="0" maxOccurs="unbounded"/>
-        </xsd:sequence>
-    </xsd:complexType>
-
-    <xsd:complexType name="schemaType">
-        <xsd:annotation>
-            <xsd:documentation>
-            One schema document to be imported.
-            Attributes:
-                "namespace" - the namespace that the document describes;
-                "location" - a URL pointing to the schema document.
-            </xsd:documentation>
-        </xsd:annotation>
-
-        <xsd:sequence>
-        </xsd:sequence>
-        <xsd:attribute name="namespace" type="xsd:anyURI" use="required"/>
-        <xsd:attribute name="location" type="xsd:anyURI" use="required"/>
-    </xsd:complexType>
-
-    <xsd:complexType name="typeMappingType">
-        <xsd:annotation>
-            <xsd:documentation>
-            A type mapping for a particular encoding.
-            
-            Attributes:
-                "encodingStyle" - the URI denoting the encoding.
-            
-            Elements:
-                "entry"* - a list of type mapping entries.
-            </xsd:documentation>
-        </xsd:annotation>
-
-        <xsd:sequence>
-            <xsd:element name="entry" type="tns:entryType" minOccurs="0" maxOccurs="unbounded"/>
-        </xsd:sequence>
-        <xsd:attribute name="encodingStyle" type="xsd:anyURI" use="required"/>
-    </xsd:complexType>
-
-    <xsd:complexType name="entryType">
-        <xsd:annotation>
-            <xsd:documentation>
-            An entry in a type mapping.
-            
-            Attributes:
-                "schemaType" - the name of a schema type;
-                "javaType" - the name of the corresponding Java class;
-                "serializerFactory" - the name of the serializer factory class to use for this type;
-                "deserializerFactory" - the name of the deserializer factory class to use for this type.
-            </xsd:documentation>
-        </xsd:annotation>
-
-        <xsd:sequence>
-        </xsd:sequence>
-        <xsd:attribute name="schemaType" type="xsd:QName" use="required"/>
-        <xsd:attribute name="javaType" type="xsd:string" use="required"/>
-        <xsd:attribute name="serializerFactory" type="xsd:string" use="required"/>
-        <xsd:attribute name="deserializerFactory" type="xsd:string" use="required"/>
-    </xsd:complexType>
-
-    <xsd:complexType name="additionalTypesType">
-        <xsd:annotation>
-            <xsd:documentation>
-            A list of additional Java types to be processed by the tool..
-            
-            Elements:
-                "class"* - a list of classes to be processed.
-            </xsd:documentation>
-        </xsd:annotation>
-
-        <xsd:sequence>
-            <xsd:element name="class" type="tns:classType" minOccurs="0" maxOccurs="unbounded"/>
-        </xsd:sequence>
-    </xsd:complexType>
-
-    <xsd:complexType name="classType">
-        <xsd:annotation>
-            <xsd:documentation>
-            A Java class description.
-            
-            Attributes:
-                "class" - the name of the class.
-            </xsd:documentation>
-        </xsd:annotation>
-
-        <xsd:sequence>
-        </xsd:sequence>
-        <xsd:attribute name="name" type="xsd:string" use="required"/>
-    </xsd:complexType>
-
-    <xsd:complexType name="namespaceMappingRegistryType">
-        <xsd:annotation>
-            <xsd:documentation>
-            A registry mapping XML namespace to/from Java packages.
-            
-            Elements:
-                "namespaceMapping"* - a list of mappings.
-            </xsd:documentation>
-        </xsd:annotation>
-        
-        <xsd:sequence>
-            <xsd:element name="namespaceMapping" type="tns:namespaceMappingType" minOccurs="0" maxOccurs="unbounded"/>
-        </xsd:sequence>
-    </xsd:complexType>
-
-    <xsd:complexType name="namespaceMappingType">
-        <xsd:annotation>
-            <xsd:documentation>
-            One XML namespace to/from Java package mapping.
-            
-            Attributes:
-                "namespace" - XML namespace name;
-                "packageName" - Java package name.
-            </xsd:documentation>
-        </xsd:annotation>
-
-        <xsd:sequence>
-        </xsd:sequence>
-        <xsd:attribute name="namespace" type="xsd:anyURI" use="required"/>
-        <xsd:attribute name="packageName" type="xsd:string" use="required"/>
-    </xsd:complexType>
-
-</xsd:schema>
diff --git a/appserver/ejb/ejb-container/src/main/java/com/sun/ejb/EjbInvocation.java b/appserver/ejb/ejb-container/src/main/java/com/sun/ejb/EjbInvocation.java
index 7a5079e..ad1a0ea 100644
--- a/appserver/ejb/ejb-container/src/main/java/com/sun/ejb/EjbInvocation.java
+++ b/appserver/ejb/ejb-container/src/main/java/com/sun/ejb/EjbInvocation.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2018 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2020 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -16,7 +16,6 @@
 
 package com.sun.ejb;
 
-//XXX: import javax.xml.rpc.handler.MessageContext;
 /* HARRY : JACC Changes */
 
 import com.sun.ejb.containers.*;
@@ -31,7 +30,6 @@
 import com.sun.ejb.containers.interceptors.InterceptorUtil;
 import javax.naming.NameNotFoundException;
 import javax.transaction.Transaction;
-import javax.xml.rpc.handler.MessageContext;
 import javax.xml.soap.SOAPMessage;
 import javax.xml.ws.WebServiceContext;
 import java.lang.reflect.Constructor;
@@ -197,14 +195,7 @@
      * loader that was active before message delivery began.
      */
     private ClassLoader originalContextClassLoader;
-    
-    /**
-     * Used for web service invocations to hold SOAP message context.
-     * EJBs can access message context through SessionContext.
-     */
-	/* HARRY: JACC Related Changes */
-     public MessageContext messageContext;
-    
+
     /**
      * Used for JACC PolicyContextHandlers. The handler can query the container
      * back for parameters on the ejb. This is set during the method invocation
@@ -248,10 +239,6 @@
 
     private boolean wasCancelCalled = false;
 
-    /**
-     * Used by container within JAXRPC handler processing code.
-     */
-    private Object webServiceTie;
     private Method webServiceMethod;
 
     // True if lock is currently held for this invocation
@@ -684,14 +671,6 @@
        return getEjbSecurityManager().isCallerInRole(role);
    } 
 
-    public void setWebServiceTie(Object tie) {
-        webServiceTie = tie;
-    }
-
-    public Object getWebServiceTie() {
-        return webServiceTie;
-    }
-
     public void setWebServiceMethod(Method method) {
         webServiceMethod = method;
     }
@@ -700,10 +679,6 @@
         return webServiceMethod;
     }
 
-    public void setMessageContext(MessageContext msgContext) {
-       messageContext = msgContext;
-    }
-
    public ResourceHandler getResourceHandler() {
        ResourceHandler rh = super.getResourceHandler();
        if (rh == null) {
diff --git a/appserver/ejb/ejb-container/src/main/java/com/sun/ejb/containers/AbstractSessionContextImpl.java b/appserver/ejb/ejb-container/src/main/java/com/sun/ejb/containers/AbstractSessionContextImpl.java
index e2abd2f..30c33c3 100644
--- a/appserver/ejb/ejb-container/src/main/java/com/sun/ejb/containers/AbstractSessionContextImpl.java
+++ b/appserver/ejb/ejb-container/src/main/java/com/sun/ejb/containers/AbstractSessionContextImpl.java
@@ -97,21 +97,8 @@
     }
 
     public MessageContext getMessageContext() {
-        InvocationManager invManager = EjbContainerUtilImpl.getInstance().getInvocationManager();
-        try {
-            ComponentInvocation inv = invManager.getCurrentInvocation();
-
-            if ((inv != null) && isWebServiceInvocation(inv)) {
-                return ((EjbInvocation) inv).messageContext;
-            } else {
-                throw new IllegalStateException("Attempt to access " +
-                        "MessageContext outside of a web service invocation");
-            }
-        } catch (Exception e) {
-            IllegalStateException ise = new IllegalStateException();
-            ise.initCause(e);
-            throw ise;
-        }
+        //no jax-rpc anymore
+        return null;
     }
 
     public <T> T getBusinessObject(Class<T> businessInterface)
diff --git a/appserver/ejb/ejb-internal-api/src/main/java/org/glassfish/ejb/api/EJBInvocation.java b/appserver/ejb/ejb-internal-api/src/main/java/org/glassfish/ejb/api/EJBInvocation.java
index 57d9d5c..3e34e1a 100644
--- a/appserver/ejb/ejb-internal-api/src/main/java/org/glassfish/ejb/api/EJBInvocation.java
+++ b/appserver/ejb/ejb-internal-api/src/main/java/org/glassfish/ejb/api/EJBInvocation.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2018 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2020 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -19,7 +19,6 @@
 
 import java.lang.reflect.Method;
 import javax.ejb.EJBContext;
-import javax.xml.rpc.handler.MessageContext;
 
 /**
  * This interface provides access to the exported portions of the
@@ -82,23 +81,6 @@
     */
    public boolean isCallerInRole(String role);
 
-    /**
-     * Used by JAXRPC pre/postHandler classes
-     * @param tie an instance of com.sun.xml.rpc.spi.runtime.Tie
-     */
-    public void setWebServiceTie(Object tie);
-
-
-    /**
-     * Used for setting JAXRPC message context.
-     */
-    public void setMessageContext(MessageContext msgContext);
-
-    /**
-     * @return instance of com.sun.xml.rpc.spi.runtime.Tie
-     */
-    public Object getWebServiceTie();
-
     public void setWebServiceMethod(Method method);
     public Method getWebServiceMethod();
     public void setWebServiceContext(Object webServiceContext);
diff --git a/appserver/extras/embedded/all/pom.xml b/appserver/extras/embedded/all/pom.xml
index d294d82..5795db3 100644
--- a/appserver/extras/embedded/all/pom.xml
+++ b/appserver/extras/embedded/all/pom.xml
@@ -503,11 +503,6 @@
             <artifactId>jakarta.enterprise.concurrent</artifactId>
             <optional>true</optional>
         </dependency>
-        <dependency>
-            <groupId>jakarta.xml.rpc</groupId>
-            <artifactId>jakarta.xml.rpc-api</artifactId>
-            <optional>true</optional>
-        </dependency>
         <!-- glassfish-corba -->
         <dependency>
             <groupId>org.glassfish.corba</groupId>
diff --git a/appserver/extras/embedded/shell/glassfish-embedded-static-shell/pom.xml b/appserver/extras/embedded/shell/glassfish-embedded-static-shell/pom.xml
index 39deac6..fc06988 100755
--- a/appserver/extras/embedded/shell/glassfish-embedded-static-shell/pom.xml
+++ b/appserver/extras/embedded/shell/glassfish-embedded-static-shell/pom.xml
@@ -345,11 +345,6 @@
             <artifactId>jakarta.enterprise.concurrent</artifactId>
             <optional>true</optional>
         </dependency>
-        <dependency>
-            <groupId>jakarta.xml.rpc</groupId>
-            <artifactId>jakarta.xml.rpc-api</artifactId>
-            <optional>true</optional>
-        </dependency>
         <!-- glassfish-corba -->
         <dependency>
             <groupId>org.glassfish.corba</groupId>
diff --git a/appserver/extras/javaee/manifest-jar/pom.xml b/appserver/extras/javaee/manifest-jar/pom.xml
index e99a3f8..376432d 100644
--- a/appserver/extras/javaee/manifest-jar/pom.xml
+++ b/appserver/extras/javaee/manifest-jar/pom.xml
@@ -34,7 +34,7 @@
                 <configuration>
                     <archive>
                         <manifestEntries>
-                            <Class-Path>../modules/jakarta.servlet-api.jar ../modules/endorsed/jakarta.annotation-api.jar ../modules/jakarta.ejb-api.jar ../modules/jakarta.transaction-api.jar ../modules/jakarta.enterprise.deploy-api.jar ../modules/jakarta.management.j2ee-api.jar ../modules/jakarta.resource-api.jar ../modules/jakarta.security.auth.message-api.jar ../modules/jakarta.authorization-api.jar ../modules/webservices-osgi.jar ../modules/jaxb-osgi.jar ../modules/endorsed/jakarta.xml.bind-api.jar ../modules/endorsed/webservices-api-osgi.jar ../modules/jakarta.xml.rpc-api.jar ../modules/jakarta.xml.registry-api.jar ../modules/jakarta.mail.jar ../modules/jakarta.activation.jar ../modules/jakarta.faces.jar ../modules/jakarta.servlet.jsp-api.jar ../modules/jakarta.el.jar ../modules/jakarta.servlet.jsp.jstl-api.jar ../modules/jakarta.persistence.jar ../modules/jakarta.jms-api.jar ../modules/bean-validator.jar ../modules/cdi-api.jar ../../mq/lib/jaxm-api.jar ../modules/jakarta.ws.rs-api.jar ../modules/jakarta.json.jar ../modules/jakarta.json.bind-api.jar ../modules/jakarta.websocket-api.jar ../modules/jakarta.enterprise.concurrent-api.jar ../modules/jakarta.batch-api.jar ../modules/jakarta.inject.jar</Class-Path>
+                            <Class-Path>../modules/jakarta.servlet-api.jar ../modules/endorsed/jakarta.annotation-api.jar ../modules/jakarta.ejb-api.jar ../modules/jakarta.transaction-api.jar ../modules/jakarta.enterprise.deploy-api.jar ../modules/jakarta.management.j2ee-api.jar ../modules/jakarta.resource-api.jar ../modules/jakarta.security.auth.message-api.jar ../modules/jakarta.authorization-api.jar ../modules/webservices-osgi.jar ../modules/jaxb-osgi.jar ../modules/endorsed/jakarta.xml.bind-api.jar ../modules/endorsed/webservices-api-osgi.jar ../modules/jakarta.xml.registry-api.jar ../modules/jakarta.mail.jar ../modules/jakarta.activation.jar ../modules/jakarta.faces.jar ../modules/jakarta.servlet.jsp-api.jar ../modules/jakarta.el.jar ../modules/jakarta.servlet.jsp.jstl-api.jar ../modules/jakarta.persistence.jar ../modules/jakarta.jms-api.jar ../modules/bean-validator.jar ../modules/cdi-api.jar ../../mq/lib/jaxm-api.jar ../modules/jakarta.ws.rs-api.jar ../modules/jakarta.json.jar ../modules/jakarta.json.bind-api.jar ../modules/jakarta.websocket-api.jar ../modules/jakarta.enterprise.concurrent-api.jar ../modules/jakarta.batch-api.jar ../modules/jakarta.inject.jar</Class-Path>
                             <GlassFish-ServerExcluded>true</GlassFish-ServerExcluded>
                         </manifestEntries>
                     </archive>
diff --git a/appserver/featuresets/glassfish/pom.xml b/appserver/featuresets/glassfish/pom.xml
index 14542eb..5ea7111 100644
--- a/appserver/featuresets/glassfish/pom.xml
+++ b/appserver/featuresets/glassfish/pom.xml
@@ -168,16 +168,6 @@
                 </exclusion>
             </exclusions>
         </dependency>
-        <dependency>
-            <groupId>jakarta.xml.rpc</groupId>
-            <artifactId>jakarta.xml.rpc-api</artifactId>
-            <exclusions>
-                <exclusion>
-                    <groupId>*</groupId>
-                    <artifactId>*</artifactId>
-                </exclusion>
-            </exclusions>
-        </dependency>
 
         <!-- glassfish-ejb -->
         <dependency>
diff --git a/appserver/pom.xml b/appserver/pom.xml
index 74f3b08..2fce59f 100644
--- a/appserver/pom.xml
+++ b/appserver/pom.xml
@@ -49,7 +49,6 @@
         <woodstock.version>4.0.2.16</woodstock.version>
         <javax.ejb-api.version>3.2.6</javax.ejb-api.version>
         <jakarta.interceptor-api.version>1.2.5</jakarta.interceptor-api.version>
-        <jakarta.xml.rpc-api.version>1.1.3</jakarta.xml.rpc-api.version>
         <javax.transaction-api.version>1.3.3</javax.transaction-api.version>
         <jakarta.faces-api.version>2.3.1</jakarta.faces-api.version>
         <cdi-api.version>2.0</cdi-api.version>
@@ -387,18 +386,6 @@
                         </spec>
                         <spec>
                             <artifact>
-                                <groupId>jakarta.xml.rpc</groupId>
-                                <artifactId>jakarta.xml.rpc-api</artifactId>
-                                <version>${jakarta.xml.rpc-api.version}</version>
-                            </artifact>
-                            <nonFinal>false</nonFinal>
-                            <jarType>api</jarType>
-                            <specVersion>1.1</specVersion>
-                            <specImplVersion>${jakarta.xml.rpc-api.version}</specImplVersion>
-                            <apiPackage>javax.xml.rpc</apiPackage>
-                        </spec>
-                        <spec>
-                            <artifact>
                                 <groupId>jakarta.enterprise.deploy</groupId>
                                 <artifactId>jakarta.enterprise.deploy-api</artifactId>
                                 <version>${javax.enterprise.deploy-api.version}</version>
@@ -501,11 +488,6 @@
                 <version>${javax.transaction.cdi-api.version}</version>
             </dependency>
             <dependency>
-                <groupId>jakarta.xml.rpc</groupId>
-                <artifactId>jakarta.xml.rpc-api</artifactId>
-                <version>${jakarta.xml.rpc-api.version}</version>
-            </dependency>
-            <dependency>
                 <groupId>jakarta.faces</groupId>
                 <artifactId>jakarta.faces-api</artifactId>
                 <version>${jakarta.faces-api.version}</version>
diff --git a/appserver/security/webservices.security/src/main/java/com/sun/enterprise/security/jmac/provider/BaseAuthConfig.java b/appserver/security/webservices.security/src/main/java/com/sun/enterprise/security/jmac/provider/BaseAuthConfig.java
index 1b8b9fb..a6d6440 100644
--- a/appserver/security/webservices.security/src/main/java/com/sun/enterprise/security/jmac/provider/BaseAuthConfig.java
+++ b/appserver/security/webservices.security/src/main/java/com/sun/enterprise/security/jmac/provider/BaseAuthConfig.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2018 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2020 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -40,8 +40,6 @@
 import com.sun.enterprise.deployment.runtime.common.ProtectionDescriptor;
 import com.sun.enterprise.security.webservices.LogUtils;
 
-import com.sun.xml.rpc.spi.runtime.StreamingHandler;
-
 import java.util.logging.Logger;
 import java.util.logging.Level;
 
@@ -338,74 +336,6 @@
 	return rvalue;
     }
 
-    private Object getExplicitContextForOpCode(StreamingHandler handler, 
-	int opcode) throws ClassNotFoundException, NoSuchMethodException {
-
-	Object rvalue = null;
-
-	synchronized(contextLock) {
-
-	    if (contextsForOpcodes_ == null && defaultContext_ == null) {
-
-		// one time initialization of the opcode to authContext array.
-
-		boolean onePolicyForAll = onePolicy_;
-
-		Method m = null;
-		for (int i = 0; i == 0 || m != null; i++) {
-		    if (i == 0) {
-			contextsForOpcodes_ = new ArrayList();
-		    }
-		    if (handler != null) {
-			m = handler.getMethodForOpcode(i);
-		    }
-		    if (m != null) {
-			Object o = getContextForMethod(m);
-			contextsForOpcodes_.add(o);
-
-			// if we find a method that is not covered by a method
-			// descriptor (i.e. has an implicit nullPolicy), 
-			// then we switch off onePolicyForAll (note that 
-			// ServerAuthConfigs with one policy being the
-			// null policy, are not constructed.
-
-			if (o == null) {
-			    onePolicyForAll = false;
-			}
-		    }
-		}
-		if (onePolicyForAll && contextsForOpcodes_.size() > 0) {
-		    defaultContext_ = contextsForOpcodes_.get(0);
-		}
-	    }
-	    if (defaultContext_ != null) {
-		rvalue = defaultContext_;
-		if(logger.isLoggable(Level.FINE)){
-		    logger.log(Level.FINE, "WSS: ForOpCode returning default_context: {0}", rvalue);
-		}
-	    }
-	}
-
-	if (rvalue == null) {
-	    if (opcode >=0 && opcode < contextsForOpcodes_.size()) {
-		rvalue = contextsForOpcodes_.get(opcode);
-	    } else if (opcode < 0) {
-		//we don't know the opcode, so lets try to see if
-		//there is a policy that applies to all opcodes.
-		rvalue = getContextForMethod(null);
-	    }
-	}
-	return rvalue;
-    }
-
-    protected Object getContextForOpCode(StreamingHandler handler, int opcode) 
-	throws ClassNotFoundException, NoSuchMethodException {
-	Object rvalue = getExplicitContextForOpCode(handler,opcode);
-	if (rvalue != null && rvalue instanceof ExplicitNull) {
-	    rvalue = null;
-	}
-	return rvalue;
-    }
     private static String getOpName(SOAPMessage message) {
 
 	String rvalue = null;
@@ -558,68 +488,6 @@
 	return rvalue;
     }
     
-    protected Object getContext(StreamingHandler handler,SOAPMessage message){
-
-	Object rvalue = null;
-
-	synchronized(contextLock) {
-	    if (defaultContext_ != null) { 
-		rvalue = defaultContext_;
-	    }
-	}
- 
-	if (rvalue == null) {
-
-	    if (handler == null) {
-
-		// lack of handler precludes mapping to opcode, so we will
-		// look for an opName based mapping.
-
-		rvalue = getContextForMessage(message);
-
-	    } else {
-
-		int opCode = handler.getOpcodeForRequestMessage(message);
-
-		if (opCode == -1) {
-
-		    // msg body is encrypted, and the best we can do is try 
-		    // to return a policy that applies to all opcodes.
-
-		    rvalue = getContextForMethod(null);
-
-		} else {
-		    
-		    try {
-			rvalue = getExplicitContextForOpCode(handler,opCode);
-		    
-			// if unable to get context by opcode 
-			// see if a context was defined for the opName.
-		    
-			if (rvalue == null) {
-
-			    rvalue = getContextForMessage(message);
-
-			}
-		    } catch (ClassNotFoundException cnfe) {
-			throw new RuntimeException(cnfe);
-		    } catch (NoSuchMethodException nsme) {
-			throw new RuntimeException(nsme);
-		    }
-		}
-	    }
-	}
-
-	if (rvalue != null && rvalue instanceof ExplicitNull) {
-	    rvalue = null;
-	}
-
-	if(logger.isLoggable(Level.FINE)){
-	    logger.log(Level.FINE, "WSS: getContext returning: {0}", rvalue);
-	}
-
-	return rvalue;
-    }
 
     // used by jaxws system handler delegates and handlers
     protected Object getContext(SOAPMessageContext soapMC) {
diff --git a/appserver/security/webservices.security/src/main/java/com/sun/enterprise/security/jmac/provider/ClientAuthConfig.java b/appserver/security/webservices.security/src/main/java/com/sun/enterprise/security/jmac/provider/ClientAuthConfig.java
index 2cecbf5..eab30df 100644
--- a/appserver/security/webservices.security/src/main/java/com/sun/enterprise/security/jmac/provider/ClientAuthConfig.java
+++ b/appserver/security/webservices.security/src/main/java/com/sun/enterprise/security/jmac/provider/ClientAuthConfig.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2018 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2020 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -23,8 +23,6 @@
 import com.sun.enterprise.deployment.runtime.common.MessageSecurityDescriptor;
 import com.sun.enterprise.deployment.runtime.common.MessageSecurityBindingDescriptor;
 
-import com.sun.xml.rpc.spi.runtime.StreamingHandler;
-
 import javax.xml.soap.SOAPMessage;
 
 /**
@@ -98,20 +96,9 @@
 	    (layer,provider,requestPolicy,responsePolicy,cbh);
     }
 
-    public ClientAuthContext 
-	getAuthContext(StreamingHandler handler, SOAPMessage message) {
-	return (ClientAuthContext) getContext(handler,message);
-    }
-
     public ClientAuthContext getAuthContext
 	(javax.xml.ws.handler.soap.SOAPMessageContext context) {
 	return (ClientAuthContext) getContext(context);
     }
 
-    public ClientAuthContext 
-	getAuthContextForOpCode(StreamingHandler handler, int opcode) throws
-	    ClassNotFoundException, NoSuchMethodException {
-	return (ClientAuthContext) getContextForOpCode(handler,opcode);
-    }
-
 }
diff --git a/appserver/security/webservices.security/src/main/java/com/sun/enterprise/security/jmac/provider/ServerAuthConfig.java b/appserver/security/webservices.security/src/main/java/com/sun/enterprise/security/jmac/provider/ServerAuthConfig.java
index 7b71aef..19e178d 100644
--- a/appserver/security/webservices.security/src/main/java/com/sun/enterprise/security/jmac/provider/ServerAuthConfig.java
+++ b/appserver/security/webservices.security/src/main/java/com/sun/enterprise/security/jmac/provider/ServerAuthConfig.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2018 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2020 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -23,10 +23,6 @@
 import com.sun.enterprise.deployment.runtime.common.MessageSecurityDescriptor;
 import com.sun.enterprise.deployment.runtime.common.MessageSecurityBindingDescriptor;
 
-//import com.sun.xml.rpc.spi.runtime.StreamingHandler;
-
-import com.sun.xml.rpc.spi.runtime.StreamingHandler;
-import javax.xml.soap.SOAPMessage;
 
 /**
  * This class is the client container's interface to the AuthConfig subsystem
@@ -99,20 +95,9 @@
 	    (layer,provider,requestPolicy,responsePolicy,cbh);
     }
 
-   public ServerAuthContext 
-	getAuthContext(StreamingHandler handler, SOAPMessage message) {
-	return (ServerAuthContext) getContext(handler,message);
-    }
-
     public ServerAuthContext getAuthContext
 	(javax.xml.ws.handler.soap.SOAPMessageContext context) {
 	return (ServerAuthContext) getContext(context);
     }
 
-   public ServerAuthContext 
-	getAuthContextForOpCode(StreamingHandler handler, int opcode) throws
-	    ClassNotFoundException, NoSuchMethodException {
-	return (ServerAuthContext) getContextForOpCode(handler,opcode);
-    }
-
 }
diff --git a/appserver/security/webservices.security/src/main/java/com/sun/enterprise/security/webservices/MessageLayerClientHandler.java b/appserver/security/webservices.security/src/main/java/com/sun/enterprise/security/webservices/MessageLayerClientHandler.java
deleted file mode 100644
index 3a8b3d5..0000000
--- a/appserver/security/webservices.security/src/main/java/com/sun/enterprise/security/webservices/MessageLayerClientHandler.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
- * Copyright (c) 1997, 2018 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-/*
- * ClientWSSHandler.java
- *
- * Created on June 1, 2004, 11:46 AM
- */
-
-package com.sun.enterprise.security.webservices;
-
-import com.sun.enterprise.security.SecurityServicesUtil;
-import javax.xml.rpc.handler.Handler;
-import javax.xml.rpc.handler.MessageContext;
-import javax.xml.rpc.handler.soap.SOAPMessageContext;
-import javax.xml.rpc.JAXRPCException;
-import javax.xml.namespace.QName;
-import javax.xml.soap.SOAPMessage;
-import java.util.logging.*;
-
-//security apis
-import com.sun.enterprise.security.jauth.*;
-import com.sun.enterprise.security.jmac.provider.ClientAuthConfig;
-
-/**
- * Client Side Handler to be invoked from the appclient
- * A similiar copy sans appserver specific logging mechanism should be made available
- * to standalone clients to use our
- * WSS infrastructure.
- * @author Harpreet Singh
- * @version
- * @since
- */
-public class MessageLayerClientHandler implements Handler {
-
-    private static Logger _logger= LogUtils.getLogger();
-
-    // key to ClientAuthConfig in HandlerInfo
-    public static final String CLIENT_AUTH_CONFIG = 
-	"com.sun.enterprise.security.jmac.provider.ClientAuthConfig";
-
-    // key to ClientAuthContext in SOAPMessageCOntext
-    private static final String CLIENT_AUTH_CONTEXT = 
-	"com.sun.enterprise.security.jauth.ClientAuthContext";
-
-    private static String errMsg =
-	"Client WSS Handler: MessageContext not of type SOAPMessageContext";
-
-    private ClientAuthConfig config_ = null;
-
-    private QName qname[] = null;
-
-    private boolean isAppclientContainer = false;
-
-    private QName serviceName = null;
-
-    /** Creates a new instance of MessageLayerClientHandler */
-    public MessageLayerClientHandler() {
-	if(SecurityServicesUtil.getInstance().isACC()){
-		isAppclientContainer = true;
-	} else{
-		isAppclientContainer = false;
-	}
-    }
-    
-    public boolean handleFault(MessageContext messageContext) {
-        // no need to do any special processing
-        if(_logger.isLoggable(Level.FINE)){
-            _logger.log(Level.FINE, "wss-auth-client: ClientHandler does not handle" +
-            " SOAP faults");
-        }
-        return true;
-    }
-    
-    public boolean handleRequest(MessageContext messageContext) {
-        if(!isSoapMessageContext(messageContext)){
-            // cannot process this, as this is not a soap message context
-            throw new JAXRPCException(errMsg);
-        }
-	if (config_ == null) {
-	    return true;
-	} 
-	  
-        // get the ClientAuthContext
-	SOAPMessageContext smc = (SOAPMessageContext) messageContext;
-	SOAPMessage request = smc.getMessage();
-	ClientAuthContext cAC = config_.getAuthContext(null,request);
-	if (cAC == null) {
-	    return true;
-	} 
-
-	smc.setProperty(CLIENT_AUTH_CONTEXT, cAC);
-	smc.setProperty(javax.xml.ws.handler.MessageContext.WSDL_SERVICE,
-            serviceName);
-
-        try{
-	    WebServiceSecurity.secureRequest(smc,cAC,isAppclientContainer);
-        } catch(Exception e){
-            if (_logger.isLoggable(Level.WARNING)){
-                _logger.log(Level.WARNING, LogUtils.ERROR_REQUEST_SECURING, e);
-            }
-            throw new JAXRPCException(e);
-        }
-        return true;
-    }
-    
-    public boolean handleResponse(MessageContext messageContext) {
-        boolean retValue;
-        if(!isSoapMessageContext(messageContext)){
-            // cannot process this, as this is not a soap message context
-            throw new JAXRPCException(errMsg);
-        }
-	if (config_ == null) {
-	    return true;
-	} 
-
-        // get the ClientAuthContext
-        SOAPMessageContext smc = (SOAPMessageContext) messageContext;
-	ClientAuthContext cAC = 
-	    (ClientAuthContext) smc.getProperty(CLIENT_AUTH_CONTEXT);
-	if (cAC == null) {
-	    return true;
-	} 
-
-        try{
-	    retValue = WebServiceSecurity.validateResponse(smc,cAC);
-        }catch(Exception e){
-            if (_logger.isLoggable(Level.WARNING)){
-                _logger.log(Level.WARNING, LogUtils.ERROR_RESPONSE_VALIDATION, e);
-            }
-            throw new JAXRPCException(e);
-        }
-        
-        return retValue;
-    }
-    
-    // if headers contains the list of understood headers, then we need to make
-    // sure that wsse is included; although if so, we need a way to make sure
-    // that the provider honors this commitment.
-    public javax.xml.namespace.QName[] getHeaders() {
-        return qname;
-    }
-    
-    public void destroy() {
-        qname = null;
-    }
-    
-    public void init(javax.xml.rpc.handler.HandlerInfo info) {
-        // 109 mandates saving qnames in init
-        qname = info.getHeaders();
-	config_ = (ClientAuthConfig) info.getHandlerConfig().get(CLIENT_AUTH_CONFIG);
-        serviceName = (QName)info.getHandlerConfig().get(javax.xml.ws.handler.MessageContext.WSDL_SERVICE);
-    }
-
-    /** 109 mandates that each MessageContext be checked to see if it is a
-     * a SOAPMessageContext and whether the handler processes it
-     */
-    private boolean isSoapMessageContext(MessageContext mc){
-        boolean retValue =
-        (mc instanceof SOAPMessageContext)? true: false;
-        if(!retValue && _logger.isLoggable(Level.WARNING)){
-            _logger.log(Level.WARNING, LogUtils.NOT_SOAP);
-        }
-        return retValue;
-    }
-
-}
diff --git a/appserver/security/webservices.security/src/main/java/com/sun/enterprise/security/webservices/SecurityServiceImpl.java b/appserver/security/webservices.security/src/main/java/com/sun/enterprise/security/webservices/SecurityServiceImpl.java
index 8021773..0f54a04 100644
--- a/appserver/security/webservices.security/src/main/java/com/sun/enterprise/security/webservices/SecurityServiceImpl.java
+++ b/appserver/security/webservices.security/src/main/java/com/sun/enterprise/security/webservices/SecurityServiceImpl.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2018 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2020 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -19,20 +19,14 @@
 import com.sun.enterprise.deployment.ServiceReferenceDescriptor;
 import com.sun.enterprise.deployment.WebServiceEndpoint;
 import com.sun.enterprise.deployment.runtime.common.MessageSecurityBindingDescriptor;
-import com.sun.enterprise.security.jauth.AuthException;
 import com.sun.enterprise.security.web.integration.WebPrincipal;
 import com.sun.web.security.RealmAdapter;
-import com.sun.xml.rpc.spi.runtime.SOAPMessageContext;
-import com.sun.xml.rpc.spi.runtime.SystemHandlerDelegate;
 import com.sun.xml.ws.assembler.ClientPipelineHook;
 import java.security.cert.X509Certificate;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
 import javax.servlet.http.HttpServletRequest;
-import javax.xml.namespace.QName;
-import javax.xml.rpc.handler.HandlerInfo;
-import org.glassfish.webservices.Ejb2RuntimeEndpointInfo;
 import org.glassfish.webservices.EjbRuntimeEndpointInfo;
 import org.glassfish.webservices.SecurityService;
 import org.glassfish.webservices.WebServiceContextImpl;
@@ -49,16 +43,11 @@
 import org.glassfish.webservices.monitoring.WebServiceEngineImpl;
 import com.sun.enterprise.security.ee.audit.AppServerAuditManager;
 import com.sun.enterprise.security.authorize.PolicyContextHandlerImpl;
-import com.sun.enterprise.security.jauth.ServerAuthContext;
-import com.sun.enterprise.security.jmac.provider.ClientAuthConfig;
 import com.sun.enterprise.security.jmac.provider.ServerAuthConfig;
 import com.sun.enterprise.web.WebModule;
-import com.sun.xml.rpc.spi.runtime.StreamingHandler;
 import java.lang.ref.WeakReference;
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
 import javax.inject.Inject;
 import javax.security.jacc.PolicyContext;
 import javax.xml.soap.SOAPMessage;
@@ -169,11 +158,7 @@
             } else {
                 sendAuthenticationEvents(true, hreq.getRequestURI(), webPrincipal);
             }
-            
-            if (epInfo instanceof Ejb2RuntimeEndpointInfo) {
-                // For JAXRPC based EJb endpoints the rest of the steps are not needed
-                return authenticated;
-            }
+
             //Setting if userPrincipal in WSCtxt applies for JAXWS endpoints only
             epInfo.prepareInvocation(false);
             WebServiceContextImpl ctxt = (WebServiceContextImpl) epInfo.getWebServiceContext();
@@ -238,88 +223,6 @@
     }
 
 
-    public SystemHandlerDelegate getSecurityHandler(WebServiceEndpoint endpoint) {
-
-        if (!endpoint.hasAuthMethod()) {
-            try {
-                ServerAuthConfig config = ServerAuthConfig.getConfig(com.sun.enterprise.security.jauth.AuthConfig.SOAP,
-                        endpoint.getMessageSecurityBinding(),
-                        null);
-                if (config != null) {
-                    return new ServletSystemHandlerDelegate(config, endpoint);
-                }
-            } catch (Exception e) {
-                _logger.log(Level.SEVERE, LogUtils.SERVLET_SEC_CONFIG_FAILURE, e);
-            }
-        }
-        return null;
-    }
-
-    public boolean validateRequest(Object serverAuthConfig, StreamingHandler implementor, SOAPMessageContext context) {
-        ServerAuthConfig authConfig = (ServerAuthConfig) serverAuthConfig;
-        if (authConfig != null) {
-            ServerAuthContext sAC = authConfig.getAuthContext((StreamingHandler) implementor, context.getMessage());
-            req.set(new WeakReference<SOAPMessage>(context.getMessage()));
-            if (sAC != null) {
-                try {
-                    return WebServiceSecurity.validateRequest(context, sAC);
-                } catch (AuthException ex) {
-                    _logger.log(Level.SEVERE, LogUtils.EXCEPTION_THROWN, ex);
-                    if (req.get() != null) {
-                        req.get().clear();
-                        req.set(null);
-                    }
-                    throw new RuntimeException(ex);
-                }
-            }
-        }
-        return true;
-    }
-
-    public void secureResponse(Object serverAuthConfig, StreamingHandler implementor,SOAPMessageContext msgContext) {
-        if (serverAuthConfig != null) {
-            ServerAuthConfig config = (ServerAuthConfig)serverAuthConfig;
-            SOAPMessage reqmsg = (req.get() != null) ? req.get().get() : msgContext.getMessage();
-            try{
-                ServerAuthContext sAC = config.getAuthContext(implementor, reqmsg);
-                if (sAC != null) {
-                    try {
-                        WebServiceSecurity.secureResponse(msgContext, sAC);
-                    } catch (AuthException ex) {
-                        _logger.log(Level.SEVERE, LogUtils.EXCEPTION_THROWN, ex);
-                        throw new RuntimeException(ex);
-                    }
-                }
-            }finally{
-                if(req.get() != null){
-                    req.get().clear();
-                    req.set(null);
-                }
-            }
-
-        }
-    }
-
-    public HandlerInfo getMessageSecurityHandler(MessageSecurityBindingDescriptor binding, QName serviceName) {
-        HandlerInfo rvalue = null;
-        try {
-            ClientAuthConfig config = ClientAuthConfig.getConfig(com.sun.enterprise.security.jauth.AuthConfig.SOAP, binding, null);
-            if (config != null) {
-                // get understood headers from auth module.
-                QName[] headers = config.getMechanisms();
-                Map properties = new HashMap();
-                properties.put(MessageLayerClientHandler.CLIENT_AUTH_CONFIG, config);
-                properties.put(javax.xml.ws.handler.MessageContext.WSDL_SERVICE, serviceName);
-                rvalue = new HandlerInfo(MessageLayerClientHandler.class, properties, headers);
-            }
-
-        } catch (Exception ex) {
-            _logger.log(Level.SEVERE, LogUtils.EXCEPTION_THROWN, ex);
-            throw new RuntimeException(ex);
-        }
-        return rvalue;
-    }
-
     @Override
     public ClientPipelineHook getClientPipelineHook(ServiceReferenceDescriptor ref) {
         return new ClientPipeCreator(ref);
diff --git a/appserver/security/webservices.security/src/main/java/com/sun/enterprise/security/webservices/ServletSystemHandlerDelegate.java b/appserver/security/webservices.security/src/main/java/com/sun/enterprise/security/webservices/ServletSystemHandlerDelegate.java
deleted file mode 100644
index 5054953..0000000
--- a/appserver/security/webservices.security/src/main/java/com/sun/enterprise/security/webservices/ServletSystemHandlerDelegate.java
+++ /dev/null
@@ -1,230 +0,0 @@
-/*
- * Copyright (c) 1997, 2018 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package com.sun.enterprise.security.webservices;
-
-import java.util.logging.*;
-import java.security.PrivilegedActionException;
-import java.security.PrivilegedExceptionAction;
-
-
-import javax.xml.soap.SOAPMessage;
-
-import javax.security.auth.Subject;
-
-import com.sun.enterprise.security.jauth.*;
-
-import com.sun.xml.rpc.spi.runtime.Implementor;
-import com.sun.xml.rpc.spi.runtime.SOAPMessageContext;
-import com.sun.xml.rpc.spi.runtime.StreamingHandler;
-import com.sun.xml.rpc.spi.runtime.SystemHandlerDelegate;
-import com.sun.xml.rpc.spi.runtime.Tie;
-
-//import com.sun.xml.rpc.server.http.MessageContextProperties;
-
-import com.sun.enterprise.security.SecurityContext;
-
-
-import com.sun.enterprise.deployment.WebServiceEndpoint;
-
-import com.sun.enterprise.security.jmac.provider.ServerAuthConfig;
-
-
-/**
- * The methods of this interface are invoked by the JAXRPCServletDelegate
- * on the path to web sevice endpoints deployed as servlets.
- *
- * NOTE: The methods of this interface may also be called on the client side of
- * jaxrpc invocations, although at this time, we have not decided from
- * where such invocations would be made.
- *
- * @author Ron Monzillo
- */
-
-public class ServletSystemHandlerDelegate implements SystemHandlerDelegate {
-
-    protected static final Logger _logger = LogUtils.getLogger();
-
-    private static final String IMPLEMENTOR = 
-	"com.sun.xml.rpc.server.http.Implementor";
-    private static final String SERVER_AUTH_CONTEXT = 
-	"com.sun.enterprise.security.jauth.ServerAuthContext";
-
-    ServerAuthConfig config_;
-    WebServiceEndpoint endpoint_;
-
-    public ServletSystemHandlerDelegate(ServerAuthConfig config, WebServiceEndpoint ep) {
-	config_ = config;
-        endpoint_ = ep;
-    }
-
-   /**
-    * The processRequest method is invoked with an object that 
-    * implements com.sun.xml.rpc.spi.runtime.SOAPMessageContext.
-    * <p>
-    * When this method is called by the JAXRPCServletDelegate
-    * (on the server side of jaxrpc servlet container invocation processing)
-    * it must be called just before the call to implementor.getTie().handle(),
-    * and at the time of the request message and the following properties 
-    * must have been set on the SOAPMessageContext.
-    * <p>
-    * com.sun.xml.rpc.server.http.MessageContextProperties.IMPLEMENTOR
-    * <br>
-    * This property must be set to the com.sun.xml.rpc.spi.runtime.Implementor 
-    * object corresponding to the target endpoint.
-    * <p>
-    * com.sun.xml.rpc.server.http.MessageContextProperties.HTTP_SERVLET_REQUEST
-    * <br>
-    * This property must be
-    * set to the javax.servlet.http.HttpServletRequest object containing the 
-    * JAXRPC invocation.
-    * <p>
-    * com.sun.xml.rpc.server.http.MessageContextProperties.HTTP_SERVLET_RESPONSE
-    * <br>
-    * This property must be
-    * set to the javax.servlet.http.HttpServletResponse object corresponding to
-    * the JAXRPC invocation.
-    * <p>
-    * com.sun.xml.rpc.server.MessageContextProperties.HTTP_SERVLET_CONTEXT
-    * <br>
-    * This property must be
-    * set to the javax.servlet.ServletContext object corresponding to web application
-    * in which the JAXRPC servlet is running.
-    * @param messageContext the SOAPMessageContext object containing the request
-    * message and the properties described above.
-    * @return true if processing by the delegate was such that the caller
-    * should continue with its normal message processing. Returns false if the
-    * processing by the delegate resulted in the messageContext containing a response
-    * message that should be returned without the caller proceding to its normal
-    * message processing. 
-    * @throws java.lang.RuntimeException when the processing by the delegate failed,
-    * without yielding a response message. In this case, the expectation is that
-    * the caller will return a HTTP layer response code reporting that an internal
-    * error occured.
-    */
-    public boolean processRequest(SOAPMessageContext messageContext) {
-
-	if(_logger.isLoggable(Level.FINE)){
-	    _logger.fine("ws.processRequest");
-	}
-
-        final SOAPMessageContext finalMC = messageContext;
-	Implementor implementor = (Implementor) messageContext.getProperty( IMPLEMENTOR );
-        final Tie tie = implementor.getTie();
-	StreamingHandler handler = (StreamingHandler) implementor.getTie();
-	SOAPMessage request = finalMC.getMessage();
-	final ServerAuthContext sAC = config_.getAuthContext(handler,request);
-
-        boolean status = true;
-	try {
-	    if (sAC != null) {
-		status = false;
-                // proceed to process message security
-                status = WebServiceSecurity.validateRequest(finalMC,sAC);
-
-		if (status) {
-		    messageContext.setProperty(SERVER_AUTH_CONTEXT, sAC);
-		}
-            } 
-	} catch (AuthException ae) {
-	    _logger.log(Level.SEVERE, LogUtils.ERROR_REQUEST_VALIDATION, ae);
-	    throw new RuntimeException(ae);
-	} finally {
-	    WebServiceSecurity.auditInvocation(messageContext, endpoint_, status); 
-        }
-
-        if (status) {
-
-	    // only do doAsPriv if SecurityManager in effect.
-
-	    if (System.getSecurityManager() != null) {
-
-		// on this branch, the endpoint invocation and the 
-		// processing of the response will be initiated from
-		// within the system handler delegate. delegate returns
-		// false so that dispatcher will not invoke the endpoint.
-
-		status = false;
-
-		try {
-
-		    Subject.doAsPrivileged
-			(SecurityContext.getCurrent().getSubject(),
-			 new PrivilegedExceptionAction() {
-			    public Object run() throws Exception {
-				tie.handle(finalMC);
-				processResponse(finalMC);
-				return null;
-			    }
-                     }, null);
-
-		} catch (PrivilegedActionException pae) {
-		    Throwable cause = pae.getCause();
-		    if (cause instanceof AuthException){
-			_logger.log(Level.SEVERE, LogUtils.ERROR_RESPONSE_SECURING, cause);
-		    }
-		    RuntimeException re = null;
-		    if (cause instanceof RuntimeException) {
-			re = (RuntimeException) cause;
-		    } else {
-			re = new RuntimeException(cause);
-		    }
-		    throw re;
-		}
-	    }
-        }
-	return status;
-    }
-
-   /**
-    * The processResponse method is invoked with an object that 
-    * implements com.sun.xml.rpc.spi.runtime.SOAPMessageContext.
-    * <p>
-    * When this method is called by the JAXRPCServletDelegate
-    * (on the server side of jaxrpc servlet container invocation processing)
-    * it must be called just just after the call to implementor.getTie().handle().
-    * In the special case where the handle method throws an exception, the
-    * processResponse message must not be called.
-    * <p>
-    * The SOAPMessageContext passed to the processRequest and handle messages is
-    * passed to the processResponse method.
-    * @throws java.lang.RuntimeException when the processing by the delegate failed,
-    * in which case the caller is expected to return an HTTP layer 
-    * response code reporting that an internal error occured.
-    */
-    public void processResponse(SOAPMessageContext messageContext) {
-
-	if(_logger.isLoggable(Level.FINE)){
-	    _logger.fine("ws.processResponse");
-	}
-
-	ServerAuthContext sAC = 
-	    (ServerAuthContext) messageContext.getProperty( SERVER_AUTH_CONTEXT );
-
-	if (sAC == null) {
-	    return;
-	}
-
-	try {
-	    WebServiceSecurity.secureResponse(messageContext,sAC);
-	} catch (AuthException ae) {
-            _logger.log(Level.SEVERE, LogUtils.ERROR_RESPONSE_SECURING, ae);
-	    throw new RuntimeException(ae);
-	}
-    }
-}
-
-    
diff --git a/appserver/security/webservices.security/src/main/java/com/sun/enterprise/security/webservices/WebServiceSecurity.java b/appserver/security/webservices.security/src/main/java/com/sun/enterprise/security/webservices/WebServiceSecurity.java
deleted file mode 100644
index 4d38d81..0000000
--- a/appserver/security/webservices.security/src/main/java/com/sun/enterprise/security/webservices/WebServiceSecurity.java
+++ /dev/null
@@ -1,296 +0,0 @@
-/*
- * Copyright (c) 1997, 2018 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-/*
- * WebServiceSecurity.java
- *
- * Created on April 9, 2004, 2:28 PM
- */
-
-package com.sun.enterprise.security.webservices;
-
-import java.util.HashMap;
-import java.util.Set;
-
-import com.sun.enterprise.security.jauth.*;
-import com.sun.enterprise.security.common.ClientSecurityContext;
-import com.sun.enterprise.security.SecurityContext;
-import com.sun.enterprise.security.ee.audit.AppServerAuditManager;
-    
-import java.security.Principal;
-import javax.security.auth.Subject;
-import javax.xml.soap.SOAPMessage;
-import javax.servlet.http.HttpServletRequest;
-
-import java.util.logging.*;
-
-import com.sun.enterprise.deployment.WebServiceEndpoint;
-import com.sun.enterprise.security.jmac.provider.SOAPAuthParam;
-import org.glassfish.internal.api.Globals;
-
-/**
- *
- * Load Container auth spi.
- * This is for JAXRPC only.
- * @author  Harpreet Singh
- */
-
-public class WebServiceSecurity {
-
-    private static Logger _logger = LogUtils.getLogger();
-
-    private static AppServerAuditManager auditManager = null;
-            
-    // keys to shared state (for things like session keys) in SOAPMessageCOntext
-    private static final String SHARED_CLIENT_STATE = 
-        "com.sun.enterprise.security.jauth.ClientHashMap";
-
-    private static final String SHARED_SERVER_STATE = 
-        "com.sun.enterprise.security.jauth.ServerHashMap";
-
-    static  {
-        if (Globals.getDefaultHabitat() != null) {
-            auditManager = Globals.get(AppServerAuditManager.class);
-        }
-    }
-    
-    // when called by jaxrpc SystemHandlerDelegate
-    public static boolean 
-	validateRequest(javax.xml.rpc.handler.soap.SOAPMessageContext context, 
-			ServerAuthContext sAC)
-        throws AuthException 
-    {
-	boolean rvalue = true;
-	SOAPAuthParam param = 
-	    new SOAPAuthParam(context.getMessage(), null);
-
-	// put sharedState in MessageContext for use by secureResponse
-	HashMap sharedState = new HashMap();
-	context.setProperty(SHARED_SERVER_STATE, sharedState);
-
-	try {
-	    rvalue = validateRequest(param, sharedState, sAC);
-	} catch(PendingException pe){
-            _logger.log(Level.FINE,
-			"Container-auth: wss: Error validating request  ",pe);
-	    context.setMessage(param.getResponse());
-	    rvalue = false;
-	} catch(FailureException fe){
-            _logger.log(Level.FINE,
-			"Container-auth: wss: Error validating request  ",fe);
-	    context.setMessage(param.getResponse());
-	    throw fe;
-        }
-	return rvalue;
-    }
-
-    private static boolean 
-	validateRequest(AuthParam param, HashMap sharedState, 
-			ServerAuthContext sAC)
-        throws AuthException 
-    {
-	boolean rvalue = true;
-
-        if(_logger.isLoggable(Level.FINE)) {
-            _logger.log(Level.FINE,
-            "Container Auth: ServerAuthContext.validateRequest");
-        }
-	
-	Subject subject = null;
-	boolean firstAuthentication = true;
-	SecurityContext sc = SecurityContext.getCurrent();
-	if (sc == null || sc.didServerGenerateCredentials()) {
-	    subject = new Subject();
-	} else {
-	    subject = sc.getSubject();
-	    firstAuthentication = false;
-	}
-
-	sAC.validateRequest((AuthParam)param, subject, sharedState);
-
-	if (rvalue && firstAuthentication) {
-	    Set principalSet = subject.getPrincipals();
-	    // must be at least one new principal to establish
-	    // non-default security contex
-	    if (principalSet != null && !principalSet.isEmpty()) {
-		// define and add initiator to Subject - note that this may add
-		// a second principal (of type PrincipalImpl) for initiator.
-		String initiator = ((Principal)principalSet.iterator().next()).
-		    getName();
-		SecurityContext newSC = new SecurityContext(initiator,subject);
-		SecurityContext.setCurrent(newSC);
-	    }
-	}
-
-        return rvalue;
-    }
-    
-    // when called by jaxrpc SystemHandlerDelegate
-    public static void 
-	secureResponse(javax.xml.rpc.handler.soap.SOAPMessageContext context, 
-		       ServerAuthContext sAC)
-        throws AuthException 
-    {
-	secureResponse(context.getMessage(),
-		       (HashMap) context.getProperty(SHARED_SERVER_STATE),
-		       sAC);
-    }
-
-    private static void 
-	secureResponse(SOAPMessage response, HashMap sharedState,
-		       ServerAuthContext sAC)
-        throws AuthException
-    {
-        if(_logger.isLoggable(Level.FINE)) {
-            _logger.log(Level.FINE,
-            "Container Auth: ServerAuthContext.secureResponse");
-        }
-
-	// subject may change if runAs identity differs from caller's.
-	// Therefore, session state is saved in sharedState not subject
-	SecurityContext sc = SecurityContext.getCurrent();
-	Subject subject = sc.getSubject();
-
-	SOAPAuthParam param = new SOAPAuthParam(null, response);
-
-        try{
-            sAC.secureResponse((AuthParam)param, subject, sharedState);
-        } finally {
-	    sAC.disposeSubject(subject,sharedState);
-	}
-
-        return;
-    }
-
-
-
-    // when called by jaxrpc Handler
-    public static void 
-	secureRequest(javax.xml.rpc.handler.soap.SOAPMessageContext context, 
-		      ClientAuthContext cAC, boolean isAppClient)
-        throws AuthException 
-    {
-	// put sharedState in MessageContext for use by validateResponse
-	HashMap sharedState = new HashMap();
-        sharedState.put(javax.xml.ws.handler.MessageContext.WSDL_SERVICE,
-            context.getProperty(javax.xml.ws.handler.MessageContext.WSDL_SERVICE));
-	context.setProperty(SHARED_CLIENT_STATE, sharedState);
-
-	secureRequest
-	    (context.getMessage(), sharedState, cAC, isAppClient);
-    }
-
-    private static void 
-	secureRequest(SOAPMessage request, HashMap sharedState,
-		      ClientAuthContext cAC, boolean isAppClient) 
-        throws AuthException 
-    {
-
-        if(_logger.isLoggable(Level.FINE)) {
-            _logger.log(Level.FINE,
-            "Container Auth: ClientAuthContext.secureRequest");
-        }
-
-	SOAPAuthParam param = new SOAPAuthParam(request, null);
-
-	Subject subject = null;
-	if (isAppClient) {
-	    ClientSecurityContext sc = ClientSecurityContext.getCurrent();
-	    if (sc != null) {
-		subject = sc.getSubject();
-	    }
-	} else {
-	    SecurityContext sc = SecurityContext.getCurrent();
-	    if (sc != null && !sc.didServerGenerateCredentials()) {
-		// make sure we don't use default unauthenticated subject, 
-		// so that module cannot change this important (constant) 
-		// subject.
-		subject = sc.getSubject();
-	    }
-	}
-	if (subject == null) subject = new Subject();
-	
-	cAC.secureRequest ( param, subject, sharedState);
-    }
-    
-    // when called by jaxrpc Handler
-    public static boolean 
-	validateResponse(javax.xml.rpc.handler.soap.SOAPMessageContext context,
-			 ClientAuthContext cAC)
-        throws AuthException 
-    {
-	return validateResponse
-	    (context.getMessage(),
-	     (HashMap) context.getProperty(SHARED_CLIENT_STATE), cAC);
-    }
-
-    private static boolean 
-	validateResponse(SOAPMessage response, HashMap sharedState, 
-			 ClientAuthContext cAC) 
-        throws AuthException 
-    {
-        boolean rvalue = true;
-
-	// get a subject to be filled in with the principals of the responder
-	Subject responderSubject = new Subject();
-
-	SOAPAuthParam param = new SOAPAuthParam(null, response);
-
-        try{
-            cAC.validateResponse( param, responderSubject, sharedState);
-        } catch(AuthException ae){
-            _logger.log(Level.SEVERE, LogUtils.ERROR_RESPONSE_VALIDATION, ae);
-	    rvalue = false;
-            throw ae;
-        } finally {
-	    cAC.disposeSubject(responderSubject,sharedState);
-	}
-        
-        return rvalue;
-    }
-
-    // when called by jaxrpc SystemHandlerDelegate
-    public static void auditInvocation
-    (javax.xml.rpc.handler.soap.SOAPMessageContext context, 
-    WebServiceEndpoint endpoint, boolean status) {
-
-	if ((auditManager != null) && auditManager.isAuditOn()) {
-
-	    // TODO: replace the string literal with the correct constant
-	    // MessageContextProperties.HTTP_SERVLET_REQUEST);
-
-	    HttpServletRequest req = (HttpServletRequest)context.getProperty
-		("com.sun.xml.rpc.server.http.HttpServletRequest");
-       
-	    String uri = null;
-
-	    if( req != null ) {
-		uri = req.getRequestURI();
-	    }
-	    
-	    String epName = null;
-
-	    if( endpoint != null ) {
-		epName = endpoint.getEndpointName();
-	    }
-
-	    auditManager.webServiceInvocation
-		( ((uri==null) ? "(no uri)" : uri), 
-		  ((epName==null) ? "(no endpoint)" : epName), 
-		  status);
-	}
-    }
-}
diff --git a/appserver/webservices/jsr109-impl/osgi.bundle b/appserver/webservices/jsr109-impl/osgi.bundle
index a4175e5..afa8b71 100644
--- a/appserver/webservices/jsr109-impl/osgi.bundle
+++ b/appserver/webservices/jsr109-impl/osgi.bundle
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2010, 2018 Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2010, 2020 Oracle and/or its affiliates. All rights reserved.
 #
 # This program and the accompanying materials are made available under the
 # terms of the Eclipse Public License v. 2.0, which is available at
@@ -15,7 +15,6 @@
 #
 
 -exportcontents: \
-                        com.sun.enterprise.webservice; \
                         org.glassfish.webservices; \
                         org.glassfish.webservices.config; \
                         org.glassfish.webservices.monitoring; version=${project.osgi.version}
diff --git a/appserver/webservices/jsr109-impl/pom.xml b/appserver/webservices/jsr109-impl/pom.xml
index 14c3563..86b8916 100755
--- a/appserver/webservices/jsr109-impl/pom.xml
+++ b/appserver/webservices/jsr109-impl/pom.xml
@@ -119,10 +119,6 @@
             <version>${project.version}</version>
         </dependency>
         <dependency>
-            <groupId>jakarta.xml.rpc</groupId>
-            <artifactId>jakarta.xml.rpc-api</artifactId>
-        </dependency>
-        <dependency>
             <groupId>org.glassfish.metro</groupId>
             <artifactId>webservices-osgi</artifactId>
         </dependency>
diff --git a/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/AdapterInvocationInfo.java b/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/AdapterInvocationInfo.java
index 4d9eb8e..c1cfb53 100644
--- a/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/AdapterInvocationInfo.java
+++ b/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/AdapterInvocationInfo.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2009, 2018 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, 2020 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -18,7 +18,6 @@
 
 import org.glassfish.api.invocation.ComponentInvocation;
 import com.sun.xml.ws.transport.http.servlet.ServletAdapter;
-import com.sun.xml.rpc.spi.runtime.Handler;
 
 /**
  * This class stores information for EjbRuntimeInfo
@@ -40,12 +39,6 @@
      */
     private  ServletAdapter adapter;
 
-    /**
-     * This has the JAXRPC handler stored for alter use
-     * @param handler
-     */
-    private Handler handler;
-
     public void setAdapter(ServletAdapter adapter) {
         this.adapter = adapter;
     }
@@ -54,10 +47,6 @@
         this.inv = inv;
     }
 
-    public void setHandler(Handler h) {
-        this.handler = h;
-    }
-
     public ServletAdapter getAdapter() {
         return adapter;
     }
@@ -66,7 +55,4 @@
         return inv;
     }
 
-    public Handler getHandler() {
-        return handler;
-    }
 }
diff --git a/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/Ejb2RuntimeEndpointInfo.java b/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/Ejb2RuntimeEndpointInfo.java
deleted file mode 100644
index e336063..0000000
--- a/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/Ejb2RuntimeEndpointInfo.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Copyright (c) 1997, 2018 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.glassfish.webservices;
-
-import java.rmi.Remote;
-
-import com.sun.enterprise.deployment.WebServiceEndpoint;
-import org.glassfish.ejb.api.EjbEndpointFacade;
-import org.glassfish.ejb.api.EJBInvocation;
-import org.glassfish.internal.api.Globals;
-import org.glassfish.api.invocation.ComponentInvocation;
-import com.sun.xml.rpc.spi.runtime.Handler;
-import com.sun.xml.rpc.spi.runtime.Tie;
-
-/**
- * Runtime dispatch information about one ejb web service
- * endpoint.  This class must support concurrent access,
- * since a single instance will be used for all web
- * service invocations through the same ejb endpoint.
- *
- * @author Kenneth Saks
- */
-public class Ejb2RuntimeEndpointInfo extends EjbRuntimeEndpointInfo {
-
-    private Class tieClass;
-
-    // Lazily instantiated and cached due to overhead
-    // of initialization.
-    private Tie tieInstance;
-
-    private Object serverAuthConfig;
-
-    public Ejb2RuntimeEndpointInfo(WebServiceEndpoint webServiceEndpoint,
-                                  EjbEndpointFacade ejbContainer,
-                                  Object servant, Class tie) {
-                                  
-        super(webServiceEndpoint, ejbContainer, servant);
-        tieClass = tie;
-        
-        if (Globals.getDefaultHabitat() != null) {
-            org.glassfish.webservices.SecurityService secServ = Globals.get(
-                    org.glassfish.webservices.SecurityService.class);
-            if (secServ != null) {
-                serverAuthConfig = secServ.mergeSOAPMessageSecurityPolicies(webServiceEndpoint.getMessageSecurityBinding());
-            }
-        }
-        
-    }
-
-    public AdapterInvocationInfo getHandlerImplementor()
-        throws Exception {
-
-        ComponentInvocation inv =  container.startInvocation();
-        AdapterInvocationInfo aInfo = new AdapterInvocationInfo();
-        aInfo.setInv(inv);
-        synchronized(this) {
-            if(tieClass == null) {
-                tieClass = Thread.currentThread().getContextClassLoader().loadClass(getEndpoint().getTieClassName());
-            }
-            if( tieInstance == null ) {
-                tieInstance = (Tie) tieClass.newInstance();
-                tieInstance.setTarget((Remote) webServiceEndpointServant);
-            }
-        }
-        if (inv instanceof EJBInvocation)
-            EJBInvocation.class.cast(inv).setWebServiceTie(tieInstance);
-        aInfo.setHandler((Handler)tieInstance);
-        return aInfo;
-    }
-
-    /**
-     * Called after attempt to handle message.  This is coded defensively
-     * so we attempt to clean up no matter how much progress we made in
-     * getImplementor.  One important thing is to complete the invocation
-     * manager preInvoke().
-     */
-    @Override
-    public void releaseImplementor(ComponentInvocation inv) {
-        container.endInvocation(inv);
-    }
-
-    @Override
-    public EjbMessageDispatcher getMessageDispatcher() {
-        // message dispatcher is stateless, no need to synchronize, worse
-        // case, we'll create too many.
-        if (messageDispatcher==null) {
-            messageDispatcher = new EjbWebServiceDispatcher();
-        }
-        return messageDispatcher;
-    }
-
-    public Object getServerAuthConfig() {
-     return serverAuthConfig;
-    }
-
-}
diff --git a/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/EjbContainerPostHandler.java b/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/EjbContainerPostHandler.java
deleted file mode 100644
index ddffdcd..0000000
--- a/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/EjbContainerPostHandler.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (c) 1997, 2018 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.glassfish.webservices;
-
-import java.lang.reflect.Method;
-
-import java.rmi.UnmarshalException;
-
-import javax.xml.namespace.QName;
-import javax.xml.rpc.handler.GenericHandler;
-import javax.xml.rpc.handler.MessageContext;
-
-import org.glassfish.api.invocation.InvocationManager;
-import org.glassfish.ejb.api.EJBInvocation;
-
-/**
- * This handler is inserted last in the handler chain for an
- * ejb web service endpoint.  It ensures that the application handlers
- * did not change anything in the soap message that would change the
- * dispatch method.
- *
- * @author Kenneth Saks
- */
-public class EjbContainerPostHandler extends GenericHandler {
-
-    private final WsUtil wsUtil = new WsUtil();
-
-    public EjbContainerPostHandler() {}
-
-    @Override
-    public QName[] getHeaders() {
-        return new QName[0];
-    }
-
-    @Override
-    public boolean handleRequest(MessageContext context) {
-        EJBInvocation inv = null;
-        try {
-            WebServiceContractImpl wscImpl = WebServiceContractImpl.getInstance();
-            InvocationManager invManager = wscImpl.getInvocationManager();
-            Object obj = invManager.getCurrentInvocation();
-            if (obj instanceof EJBInvocation) {
-                inv = EJBInvocation.class.cast(obj);
-                Method webServiceMethodInPreHandler = inv.getWebServiceMethod();
-                if (webServiceMethodInPreHandler != null) {
-                    // Now that application handlers have run, do another method
-                    // lookup and compare the results with the original one.  This
-                    // ensures that the application handlers have not changed
-                    // the message context in any way that would impact which
-                    // method is invoked.
-                    Method postHandlerMethod = wsUtil.getInvMethod(
-                            (com.sun.xml.rpc.spi.runtime.Tie) inv.getWebServiceTie(), context);
-                    if (!webServiceMethodInPreHandler.equals(postHandlerMethod)) {
-                        throw new UnmarshalException("Original method " + webServiceMethodInPreHandler
-                                + " does not match post-handler method ");
-                    }
-                }
-            }
-        } catch(Exception e) {
-            wsUtil.throwSOAPFaultException(e.getMessage(),
-                                           context);
-        }
-        return true;
-    }
-}
diff --git a/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/EjbContainerPreHandler.java b/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/EjbContainerPreHandler.java
deleted file mode 100644
index cde670a..0000000
--- a/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/EjbContainerPreHandler.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright (c) 1997, 2018 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.glassfish.webservices;
-
-import javax.xml.namespace.QName;
-
-import javax.xml.rpc.handler.GenericHandler;
-import javax.xml.rpc.handler.MessageContext;
-
-import java.util.logging.Logger;
-import java.lang.reflect.Method;
-import java.text.MessageFormat;
-
-import org.glassfish.api.invocation.InvocationManager;
-import org.glassfish.ejb.api.EJBInvocation;
-
-/**
- * This handler is inserted first in the handler chain for an
- * ejb web service endpoint.  It performs security authorization 
- * before any of the application handlers are invoked, as required
- * by JSR 109.
- *
- * @author Kenneth Saks
- */
-public class EjbContainerPreHandler extends GenericHandler {
-
-    private static final Logger logger = LogUtils.getLogger();
-    private final WsUtil wsUtil = new WsUtil();
-
-    public EjbContainerPreHandler() {}
-
-    @Override
-    public QName[] getHeaders() {
-        return new QName[0];
-    }
-
-    @Override
-    public boolean handleRequest(MessageContext context) {
-        EJBInvocation inv = null;
-        try {
-            WebServiceContractImpl wscImpl = WebServiceContractImpl.getInstance();
-            InvocationManager invManager = wscImpl.getInvocationManager();
-            Object obj = invManager.getCurrentInvocation();
-            if (obj instanceof EJBInvocation) {
-                inv = EJBInvocation.class.cast(obj);
-                Method method = wsUtil.getInvMethod(
-                        (com.sun.xml.rpc.spi.runtime.Tie) inv.getWebServiceTie(), context);
-                inv.setWebServiceMethod(method);
-                if (!inv.authorizeWebService(method)) {
-                    throw new Exception(format(logger.getResourceBundle().getString(LogUtils.CLIENT_UNAUTHORIZED),
-                            method.toString()));
-                }
-            }
-        } catch(Exception e) {
-            wsUtil.throwSOAPFaultException(e.getMessage(), context);
-        }
-        return true;
-    }
-
-    private String format(String key, String ... values){
-        return MessageFormat.format(key, (Object [])values);
-    }
-}
diff --git a/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/EjbRuntimeEndpointInfo.java b/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/EjbRuntimeEndpointInfo.java
index 4d2674e..cb2eb74 100644
--- a/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/EjbRuntimeEndpointInfo.java
+++ b/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/EjbRuntimeEndpointInfo.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2018 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2020 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
diff --git a/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/EjbWebServiceDispatcher.java b/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/EjbWebServiceDispatcher.java
deleted file mode 100644
index 199beae..0000000
--- a/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/EjbWebServiceDispatcher.java
+++ /dev/null
@@ -1,292 +0,0 @@
-/*
- * Copyright (c) 1997, 2018 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.glassfish.webservices;
-
-import java.io.InputStream;
-import java.io.IOException;
-import java.io.ByteArrayOutputStream;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.servlet.ServletContext;
-import javax.xml.soap.MimeHeaders;
-import javax.xml.soap.SOAPMessage;
-import javax.xml.soap.SOAPException;
-
-import javax.xml.namespace.QName;
-import com.sun.xml.messaging.saaj.util.ByteInputStream;
-import com.sun.xml.rpc.spi.JaxRpcObjectFactory;
-import com.sun.xml.rpc.spi.runtime.SOAPMessageContext;
-import com.sun.xml.rpc.spi.runtime.SOAPConstants;
-import com.sun.xml.rpc.spi.runtime.StreamingHandler;
-import java.text.MessageFormat;
-
-import org.glassfish.webservices.monitoring.*;
-
-import java.util.logging.Logger;
-import java.util.logging.Level;
-import org.glassfish.api.invocation.ComponentInvocation;
-import org.glassfish.internal.api.Globals;
-import org.glassfish.ejb.api.EJBInvocation;
-
-/**
- * Handles dispatching of ejb web service http invocations.
- *
- * @author Kenneth Saks
- */
-public class EjbWebServiceDispatcher implements EjbMessageDispatcher {
-
-    private static final Logger logger = LogUtils.getLogger();
-
-    private JaxRpcObjectFactory rpcFactory;
-    private final WsUtil wsUtil = new WsUtil();
-    private WebServiceEngineImpl wsEngine;
-
-    // @@@ This should be added to jaxrpc spi, probably within
-    // SOAPConstants.
-    private static final QName FAULT_CODE_CLIENT =
-        new QName(SOAPConstants.URI_ENVELOPE, "Client");
-
-    // @@@ Used to set http servlet response object so that TieBase
-    // will correctly flush response code for one-way operations.
-    // Should be added to SPI
-    private static final String HTTP_SERVLET_RESPONSE = 
-        "com.sun.xml.rpc.server.http.HttpServletResponse";
-
-    //the security service
-    org.glassfish.webservices.SecurityService  secServ;
-
-    public EjbWebServiceDispatcher() {
-        rpcFactory = JaxRpcObjectFactory.newInstance();
-        wsEngine = WebServiceEngineImpl.getInstance();
-        if (Globals.getDefaultHabitat() != null) {
-            secServ = Globals.get(org.glassfish.webservices.SecurityService.class);
-        }
-    }           
-
-    @Override
-    public void invoke(HttpServletRequest req, 
-                       HttpServletResponse resp,
-                       ServletContext ctxt,
-                       EjbRuntimeEndpointInfo endpointInfo) {
-
-        String method = req.getMethod();
-        if (logger.isLoggable(Level.FINE)) {
-            logger.log(Level.FINE, LogUtils.WEBSERVICE_DISPATCHER_INFO,
-                    new Object[] {req.getMethod(), req.getRequestURI(), req.getQueryString()});
-        }
-        try {
-            if( method.equals("POST") ) {
-                handlePost(req, resp, endpointInfo);
-            } else if( method.equals("GET") ) {
-                handleGet(req, resp, ctxt, endpointInfo);
-            } else {
-                String errorMessage = MessageFormat.format(
-                        logger.getResourceBundle().getString(LogUtils.UNSUPPORTED_METHOD_REQUEST),
-                        new Object[] {method, endpointInfo.getEndpoint().getEndpointName(),
-                            endpointInfo.getEndpointAddressUri()});
-                logger.log(Level.WARNING, errorMessage);
-                wsUtil.writeInvalidMethodType(resp, errorMessage);
-            }
-        } catch(Exception e) {
-            logger.log(Level.WARNING, LogUtils.EJB_ENDPOINT_EXCEPTION, e);
-        }
-    }
-
-    private void handlePost(HttpServletRequest req,
-                            HttpServletResponse resp,
-                            EjbRuntimeEndpointInfo endpointInfo)
-        throws IOException, SOAPException {
-        
-        JAXRPCEndpointImpl endpoint = null;               
-        String messageID = null;
-        SOAPMessageContext msgContext = null;
-        
-        try {
-            
-            MimeHeaders headers = wsUtil.getHeaders(req);
-            if (!wsUtil.hasTextXmlContentType(headers)) {
-                wsUtil.writeInvalidContentType(resp);
-                return;
-            }
-            
-            msgContext = rpcFactory.createSOAPMessageContext();
-            SOAPMessage message = createSOAPMessage(req, headers);
-                        
-    	    boolean wssSucceded = true;
-            
-            if (message != null) {                                
-                
-                msgContext.setMessage(message);
-
-                // get the endpoint info
-                endpoint = (JAXRPCEndpointImpl) endpointInfo.getEndpoint().getExtraAttribute(EndpointImpl.NAME);
-                
-                if (endpoint!=null) {
-                    // first global notification
-                    if (wsEngine.hasGlobalMessageListener()) {
-                        messageID = wsEngine.preProcessRequest(endpoint);
-                    }
-                } else {
-                    if (logger.isLoggable(Level.FINE)) {
-                        logger.log(Level.FINE, LogUtils.MISSING_MONITORING_INFO, req.getRequestURI());
-                    }
-                }                                   
-                
-                AdapterInvocationInfo aInfo = null;
-                
-                if (!(endpointInfo instanceof Ejb2RuntimeEndpointInfo)) {
-                    throw new IllegalArgumentException(endpointInfo + "is not instance of Ejb2RuntimeEndpointInfo.");
-                }
-
-                try {
-                    Ejb2RuntimeEndpointInfo endpointInfo2 = (Ejb2RuntimeEndpointInfo)endpointInfo;
-                    // Do ejb container pre-invocation and pre-handler
-                    // logic
-                    aInfo = endpointInfo2.getHandlerImplementor();
-
-                    // Set message context in invocation
-                    ComponentInvocation inv = aInfo.getInv();
-                    if (inv instanceof EJBInvocation)
-                        EJBInvocation.class.cast(inv).setMessageContext(msgContext);
-
-
-                    // Set http response object so one-way operations will
-                    // response before actual business method invocation.
-                    msgContext.setProperty(HTTP_SERVLET_RESPONSE, resp);
-                    if (secServ != null) {
-                        wssSucceded = secServ.validateRequest(endpointInfo2.getServerAuthConfig(),
-                                (StreamingHandler)aInfo.getHandler(), msgContext);
-                    }
-                    // Trace if necessary
-                    if (messageID!=null || (endpoint!=null && endpoint.hasListeners())) {
-                        // create the thread local
-                        ThreadLocalInfo threadLocalInfo = new ThreadLocalInfo(messageID, req);
-                        wsEngine.getThreadLocal().set(threadLocalInfo);
-                        if (endpoint != null) {
-                            endpoint.processRequest(msgContext);
-                        } else {
-                            if (logger.isLoggable(Level.FINE)) {
-                                logger.log(Level.FINE, LogUtils.MISSING_MONITORING_INFO, req.getRequestURI());
-                            }
-                        }
-                    }
-                    
-                    // Pass control back to jaxrpc runtime to invoke
-                    // any handlers and call the webservice method itself,
-                    // which will be flow back into the ejb container.
-                    if (wssSucceded) {
-                        aInfo.getHandler().handle(msgContext);
-                    }
-                } finally {
-                    // Always call release, even if an error happened
-                    // during getImplementor(), since some of the
-                    // preInvoke steps might have occurred.  It's ok
-                    // if implementor is null.
-                    if (aInfo != null) {
-                        endpointInfo.releaseImplementor(aInfo.getInv());
-                    }
-                }
-            } else {
-                String errorMsg = MessageFormat.format(
-                        logger.getResourceBundle().getString(LogUtils.NULL_MESSAGE),
-                        endpointInfo.getEndpoint().getEndpointName(), endpointInfo.getEndpointAddressUri());
-                    if (logger.isLoggable(Level.FINE)) {
-                        logger.fine(errorMsg);
-                    }
-                    msgContext.writeSimpleErrorResponse
-                    (FAULT_CODE_CLIENT, errorMsg);
-            }
-            if (messageID!=null || endpoint!=null) {
-                endpoint.processResponse(msgContext);
-            }
-            SOAPMessage reply = msgContext.getMessage();
-            if (secServ != null && wssSucceded) {
-                if (!(endpointInfo instanceof Ejb2RuntimeEndpointInfo)) {
-                    throw new IllegalArgumentException(endpointInfo + "is not instance of Ejb2RuntimeEndpointInfo.");
-                }
-
-                Ejb2RuntimeEndpointInfo endpointInfo2 = (Ejb2RuntimeEndpointInfo)endpointInfo;
-                secServ.secureResponse(endpointInfo2.getServerAuthConfig(),(StreamingHandler)endpointInfo2.getHandlerImplementor().getHandler(),msgContext);
-            }
-            
-            if (reply.saveRequired()) {
-                reply.saveChanges();
-            }
-            wsUtil.writeReply(resp, msgContext);
-        } catch (Throwable e) {
-            String errorMessage = MessageFormat.format(
-                    logger.getResourceBundle().getString(LogUtils.ERROR_ON_EJB),
-                    new Object[] {endpointInfo.getEndpoint().getEndpointName(),
-                        endpointInfo.getEndpointAddressUri(), e.getMessage()});
-            logger.log(Level.WARNING, errorMessage, e);
-            SOAPMessageContext errorMsgContext =
-                rpcFactory.createSOAPMessageContext();
-            errorMsgContext.writeSimpleErrorResponse
-                (SOAPConstants.FAULT_CODE_SERVER, errorMessage);
-            resp.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
-            if (messageID!=null || endpoint!=null) {
-                endpoint.processResponse(errorMsgContext);
-            }
-            wsUtil.writeReply(resp, errorMsgContext);
-        }
-
-        // final tracing notification
-        if (messageID!=null) {
-            HttpResponseInfoImpl response = new HttpResponseInfoImpl(resp);
-            wsEngine.postProcessResponse(messageID, response);
-        }
-    }
-
-    private void handleGet(HttpServletRequest req, 
-                           HttpServletResponse resp,
-                           ServletContext ctxt,
-                           EjbRuntimeEndpointInfo endpointInfo)
-        throws IOException
-    {
-       
-        wsUtil.handleGet(req, resp, endpointInfo.getEndpoint());           
-
-    }    
-
-    protected SOAPMessage createSOAPMessage(HttpServletRequest request,
-                                            MimeHeaders headers)
-        throws IOException {
-
-        InputStream is = request.getInputStream();
-        
-        byte[] bytes = readFully(is);
-        int length = request.getContentLength() == -1 ? bytes.length 
-            : request.getContentLength();
-        ByteInputStream in = new ByteInputStream(bytes, length);
-
-        SOAPMessageContext msgContext = rpcFactory.createSOAPMessageContext();
-        SOAPMessage message = msgContext.createMessage(headers, in);
-
-        return message;
-    }
-
-    protected byte[] readFully(InputStream istream) throws IOException {
-        ByteArrayOutputStream bout = new ByteArrayOutputStream();
-        byte[] buf = new byte[1024];
-        int num = 0;
-        while( (num = istream.read(buf)) != -1) {
-            bout.write(buf, 0, num);
-        }
-        byte[] ret = bout.toByteArray();
-        return ret;
-    }
-}
diff --git a/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/ImplementorCacheDelegateImpl.java b/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/ImplementorCacheDelegateImpl.java
deleted file mode 100644
index f3e529f..0000000
--- a/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/ImplementorCacheDelegateImpl.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- * Copyright (c) 1997, 2018 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.glassfish.webservices;
-
-import java.util.Hashtable;
-import java.util.Iterator;
-
-import java.lang.reflect.Proxy;
-import java.lang.reflect.InvocationHandler;
-
-import java.rmi.Remote;
-
-import javax.servlet.ServletConfig;
-import javax.servlet.ServletContext;
-
-import javax.xml.rpc.server.ServiceLifecycle;
-
-import org.glassfish.api.invocation.ComponentInvocation;
-import org.glassfish.api.invocation.InvocationManager;
-import org.glassfish.ejb.api.EJBInvocation;
-
-// JAXRPC-RI classes
-import com.sun.xml.rpc.spi.JaxRpcObjectFactory;
-import com.sun.xml.rpc.spi.runtime.Implementor;
-import com.sun.xml.rpc.spi.runtime.ImplementorCache;
-import com.sun.xml.rpc.spi.runtime.ImplementorCacheDelegate;
-import com.sun.xml.rpc.spi.runtime.RuntimeEndpointInfo;
-import com.sun.xml.rpc.spi.runtime.Tie;
-
-/**
- * This class extends the behavior of ImplementorCache in order to
- * interpose on lifecycle events for the creation and destruction of 
- * ties/servants for servlet web service endpoints.
- *
- * @author Kenneth Saks
- */
-public class ImplementorCacheDelegateImpl extends ImplementorCacheDelegate {
-
-    private Hashtable implementorCache_;
-    private ServletContext servletContext_;
-    private JaxRpcObjectFactory rpcFactory_;
-
-    public ImplementorCacheDelegateImpl(ServletConfig servletConfig) {
-        servletContext_ = servletConfig.getServletContext();
-        implementorCache_ = new Hashtable();
-        rpcFactory_ = JaxRpcObjectFactory.newInstance();
-    }
-
-    public Implementor getImplementorFor(RuntimeEndpointInfo targetEndpoint) {
-
-        Implementor implementor = null;
-        try {
-            synchronized(targetEndpoint) {
-                implementor = (Implementor) 
-                    implementorCache_.get(targetEndpoint);
-                if( implementor == null ) {
-                    implementor = createImplementor(targetEndpoint);
-                    implementorCache_.put(targetEndpoint, implementor);
-                }
-            }
-
-            WebServiceContractImpl wscImpl = WebServiceContractImpl.getInstance();
-            InvocationManager invManager = wscImpl.getInvocationManager();
-            ComponentInvocation inv = invManager.getCurrentInvocation();
-            if (inv instanceof EJBInvocation)
-                ((EJBInvocation)inv).setWebServiceTie(implementor.getTie());
-        } catch(Throwable t) {
-            RuntimeException re = new RuntimeException();
-            re.initCause(t);
-            throw re;
-        }
-
-        return implementor;
-    }
-
-    public void releaseImplementor(RuntimeEndpointInfo targetEndpoint, 
-                                   Implementor implementor) {
-        // do nothing
-    }
-
-    public void destroy() {
-        for (Iterator iter = implementorCache_.values().iterator(); 
-             iter.hasNext();) {
-            Implementor implementor = (Implementor) iter.next();
-            try {
-                implementor.destroy();
-            } catch(Throwable t) {
-                // @@@ log
-            }
-        }
-        implementorCache_.clear();
-    }
-
-    private Implementor createImplementor(RuntimeEndpointInfo targetEndpoint) 
-        throws Exception {
-
-        Tie tie = (Tie) targetEndpoint.getTieClass().newInstance();
-
-        Class seiClass  = targetEndpoint.getRemoteInterface();
-        Class implClass = targetEndpoint.getImplementationClass();
-
-        Remote servant  = null;
-        if( seiClass.isAssignableFrom(implClass) ) {
-            // if servlet endpoint impl is a subtype of SEI, use an
-            // instance as the servant.
-            servant = (Remote) implClass.newInstance();
-        } else {
-            // Create a dynamic proxy that implements SEI (and optionally
-            // ServiceLifecycle) and delegates to an instance of the 
-            // endpoint impl.
-            Object implInstance = implClass.newInstance();
-
-            InvocationHandler handler = 
-                new ServletImplInvocationHandler(implInstance);
-            boolean implementsLifecycle = 
-                ServiceLifecycle.class.isAssignableFrom(implClass);
-            Class[] proxyInterfaces = implementsLifecycle ?
-                new Class[] { seiClass, ServiceLifecycle.class } :
-                new Class[] { seiClass };
-
-            servant = (Remote) Proxy.newProxyInstance
-                (implClass.getClassLoader(), proxyInterfaces, handler);
-        }
-        tie.setTarget(servant);
-        
-        Implementor implementor = rpcFactory_.createImplementor(servletContext_, tie);
-        implementor.init();
-
-        return implementor;
-    }
-}
diff --git a/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/JAXRPCCodeGenFacadeImpl.java b/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/JAXRPCCodeGenFacadeImpl.java
deleted file mode 100644
index b38b498..0000000
--- a/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/JAXRPCCodeGenFacadeImpl.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright (c) 2006, 2018 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.glassfish.webservices;
-
-import org.glassfish.api.deployment.DeploymentContext;
-import org.glassfish.webservices.codegen.JaxRpcCodegenFactory;
-import org.glassfish.hk2.api.ServiceLocator;
-import org.glassfish.internal.api.JAXRPCCodeGenFacade;
-import org.jvnet.hk2.annotations.Service;
-
-/**
- * This class is responsible for generating all non portable
- * jax-rpc artifacts for a single .ear or standalone module
- * It will be used for webservice clients
- *
- * @author Bhakti Mehta
- */
-@Service
-public class JAXRPCCodeGenFacadeImpl implements JAXRPCCodeGenFacade {
-
-public void run(ServiceLocator habitat, DeploymentContext context, String cp, boolean processServiceReferences) throws Exception {
-    JaxRpcCodegenFactory.newInstance().getAdapter(processServiceReferences).run(habitat, context,cp);
-}
-
-}
diff --git a/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/JAXRPCServlet.java b/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/JAXRPCServlet.java
deleted file mode 100644
index 6eaaedd..0000000
--- a/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/JAXRPCServlet.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Copyright (c) 1997, 2018 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.glassfish.webservices;
-
-import javax.servlet.*;
-import javax.servlet.http.*;
-
-import com.sun.xml.rpc.spi.JaxRpcObjectFactory;
-import com.sun.xml.rpc.spi.runtime.ServletDelegate;
-import com.sun.xml.rpc.spi.runtime.ServletSecondDelegate;
-import org.glassfish.webservices.monitoring.*;
-import org.apache.catalina.Loader;
-
-
-/**
- * The JAX-RPC dispatcher servlet.
- *
- */
-public class JAXRPCServlet extends HttpServlet {
-
-    private volatile ServletDelegate delegate_;
-    private volatile ServletWebServiceDelegate myDelegate_=null;
-
-    public void init(ServletConfig servletConfig) throws ServletException {
-        try {
-            super.init(servletConfig);
-            JaxRpcObjectFactory rpcFactory = JaxRpcObjectFactory.newInstance();
-            delegate_ =
-                    (ServletDelegate) rpcFactory.createServletDelegate();
-            myDelegate_ = new ServletWebServiceDelegate(delegate_);
-            delegate_.setSecondDelegate(myDelegate_);
-            delegate_.init(servletConfig);
-        } catch (ServletException e) {
-            throw e;
-        } catch (Throwable e) {
-            throw new ServletException(e);
-        }
-    }
-
-    public void destroy() {
-        if (delegate_ != null) {
-            delegate_.destroy();
-        }
-        if (myDelegate_ != null) {
-            myDelegate_.destroy();
-        }
-    }
-
-    protected void doPost(HttpServletRequest request,
-                          HttpServletResponse response)
-        throws ServletException {
-        
-        WebServiceEngineImpl wsEngine_ = WebServiceEngineImpl.getInstance();
-
-        if ("Tester".equalsIgnoreCase(request.getQueryString())) {
-            Endpoint endpt = wsEngine_.getEndpoint(request.getServletPath());
-            if (endpt!=null && Boolean.parseBoolean(endpt.getDescriptor().getDebugging())) {
-                WebServiceTesterServlet.invoke(request, response,
-                        endpt.getDescriptor());
-                return;
-            }
-        }
-                
-        if (delegate_ != null) {
-            // check if we need to trace this...
-            String messageId=null;
-            if (wsEngine_.getGlobalMessageListener()!=null) {
-                Endpoint endpt = wsEngine_.getEndpoint(request.getServletPath());
-                messageId = wsEngine_.preProcessRequest(endpt);
-                if (messageId!=null) {
-                    ThreadLocalInfo config = new ThreadLocalInfo(messageId, request);
-                    wsEngine_.getThreadLocal().set(config);
-                }
-            }
-
-            delegate_.doPost(request, response);
-
-            if (messageId!=null) {
-                HttpResponseInfoImpl info = new HttpResponseInfoImpl(response);
-                wsEngine_.postProcessResponse(messageId, info);
-            }
-        }
-    }
-
-    protected void doGet(HttpServletRequest request, 
-                         HttpServletResponse response)
-        throws ServletException {
-        
-        // test for tester servlet invocation.
-        if ("Tester".equalsIgnoreCase(request.getQueryString())) {
-
-            Endpoint endpt = WebServiceEngineImpl.getInstance().getEndpoint(request.getServletPath());
-            if (endpt!=null && Boolean.parseBoolean(endpt.getDescriptor().getDebugging())) {
-                Loader loader = (Loader) endpt.getDescriptor().getBundleDescriptor().getExtraAttribute("WEBLOADER");
-                if (loader != null) {
-                    endpt.getDescriptor().getBundleDescriptor().setClassLoader(loader.getClassLoader());
-                    endpt.getDescriptor().getBundleDescriptor().removeExtraAttribute("WEBLOADER");
-                }
-                WebServiceTesterServlet.invoke(request, response,
-                        endpt.getDescriptor());
-                return;
-            }
-        }
-        if (delegate_ != null) {
-            delegate_.doGet(request, response);
-        }
-    }
-}
diff --git a/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/SecurityService.java b/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/SecurityService.java
index 52b39dc..1204cee 100644
--- a/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/SecurityService.java
+++ b/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/SecurityService.java
@@ -17,17 +17,11 @@
 package org.glassfish.webservices;
 
 import com.sun.enterprise.deployment.ServiceReferenceDescriptor;
-import com.sun.enterprise.deployment.WebServiceEndpoint;
 import com.sun.enterprise.deployment.runtime.common.MessageSecurityBindingDescriptor;
 import com.sun.enterprise.web.WebModule;
-import com.sun.xml.rpc.spi.runtime.SystemHandlerDelegate;
 import javax.servlet.http.HttpServletRequest;
-import com.sun.xml.rpc.spi.runtime.SOAPMessageContext;
-import com.sun.xml.rpc.spi.runtime.StreamingHandler;
 import com.sun.xml.ws.assembler.ClientPipelineHook;
 import java.security.Principal;
-import javax.xml.namespace.QName;
-import javax.xml.rpc.handler.HandlerInfo;
 import org.jvnet.hk2.annotations.Contract;
 
 /**
@@ -41,10 +35,6 @@
     public boolean doSecurity(HttpServletRequest hreq, EjbRuntimeEndpointInfo ejbEndpoint, String realmName, WebServiceContextImpl context);
     public void resetSecurityContext();
     public void resetPolicyContext();
-    public SystemHandlerDelegate getSecurityHandler(WebServiceEndpoint endpoint);
-    public boolean validateRequest(Object serverAuthConfig, StreamingHandler implementor, SOAPMessageContext context);
-    public void secureResponse(Object serverAuthConfig, StreamingHandler implementor, SOAPMessageContext context);
-    public HandlerInfo getMessageSecurityHandler(MessageSecurityBindingDescriptor binding, QName serviceName);
     public ClientPipelineHook getClientPipelineHook(ServiceReferenceDescriptor ref);
     public Principal getUserPrincipal(boolean isWeb);
     public boolean isUserInRole(WebModule webModule, Principal principal, String servletName, String role);
diff --git a/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/ServiceInvocationHandler.java b/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/ServiceInvocationHandler.java
deleted file mode 100644
index a40baa1..0000000
--- a/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/ServiceInvocationHandler.java
+++ /dev/null
@@ -1,584 +0,0 @@
-/*
- * Copyright (c) 1997, 2018 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.glassfish.webservices;
-
-
-import java.net.URL;
-
-import java.util.HashSet;
-import java.util.Set;
-import java.util.Map;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.lang.reflect.Method;
-import java.lang.reflect.Proxy;
-import java.lang.reflect.InvocationHandler;
-import java.lang.reflect.InvocationTargetException;
-
-import javax.xml.namespace.QName;
-import javax.xml.rpc.Service;
-import javax.xml.rpc.handler.HandlerInfo;
-import javax.xml.rpc.handler.HandlerRegistry;
-import javax.xml.rpc.Stub;
-import javax.xml.rpc.Call;
-
-
-import com.sun.enterprise.deployment.ServiceReferenceDescriptor;
-import com.sun.enterprise.deployment.ServiceRefPortInfo;
-import com.sun.enterprise.deployment.NameValuePairDescriptor;
-import com.sun.enterprise.deployment.runtime.common.MessageSecurityBindingDescriptor;
-import org.glassfish.internal.api.Globals;
-
-
-
-/**
- * InvocationHandler used to intercept calls to concrete JAXRPC 
- * Service implementation.  
- *
- * NOTE : This class makes no distinction between "partial" WSDL and
- * "full" WSDL.  If a service-ref's packaged WSDL is "partial", the
- * deployer is required to specify a wsdl-override in the runtime info
- * that points to a final WSDL.  In such a case, the behavior for each
- * method listed in the table in section 4.2.2.7 of the spec is the
- * same as Full WSDL.
- *
- * @author Kenneth Saks
- */
-public class ServiceInvocationHandler implements InvocationHandler {
-
-    private ServiceReferenceDescriptor serviceRef;
-
-    // real service instance
-    private Service serviceDelegate;
-
-    // used in full wsdl case for DII methods. Lazily instantiated.
-    private volatile Service configuredServiceDelegate;
-
-    private ClassLoader classLoader;
-
-    private Method getClientManagedPortMethod;
-
-    // location of full wsdl associated with service-ref
-    private URL wsdlLocation;
-
-    private boolean fullWsdl = false;
-    
-    private WsUtil wsUtil = new WsUtil();
-    private org.glassfish.webservices.SecurityService  secServ;
-
-    // Service method types
-    private static final int CREATE_CALL_NO_ARGS = 1;
-    private static final int CREATE_CALL_PORT = 2;
-    private static final int CREATE_CALL_OPERATION_QNAME = 3;
-    private static final int CREATE_CALL_OPERATION_STRING = 4;
-    private static final int GET_CALLS = 5;
-    private static final int GET_HANDLER_REGISTRY = 6;
-    private static final int GET_PORT_CONTAINER_MANAGED = 7;
-    private static final int GET_PORT_CLIENT_MANAGED = 8;
-    private static final int GET_PORTS = 9;
-    private static final int GET_SERVICE_NAME = 10;
-    private static final int GET_TYPE_MAPPING_REGISTRY = 11;
-    private static final int GET_WSDL_LOCATION = 12;
-    private static final int GENERATED_SERVICE_METHOD = 13;
-
-    private static Map serviceMethodTypes;
-    private static Set fullWsdlIllegalMethods;
-    private static Set noWsdlIllegalMethods;
-
-    static {
-        init();
-    }
-
-    public ServiceInvocationHandler(ServiceReferenceDescriptor descriptor,
-                                    Service delegate, ClassLoader loader)
-            throws Exception {
-
-        serviceRef = descriptor;
-        serviceDelegate = delegate;
-        classLoader = loader;
-
-        if( serviceRef.hasWsdlFile() ) {
-            wsdlLocation = wsUtil.privilegedGetServiceRefWsdl(serviceRef);
-            fullWsdl = true;
-        } 
-
-        getClientManagedPortMethod = javax.xml.rpc.Service.class.getMethod
-                ("getPort", new Class[] { QName.class, Class.class } );
-
-        if (Globals.getDefaultHabitat() != null) {
-            secServ = Globals.get(org.glassfish.webservices.SecurityService.class);
-        }
-        addMessageSecurityHandler(delegate);
-    }
-
-    public Object invoke(Object proxy, Method method, Object[] args)
-            throws Throwable {
-
-        // NOTE : be careful with "args" parameter.  It is null
-        //        if method signature has 0 arguments.
-
-        if( method.getDeclaringClass() == java.lang.Object.class )  {
-            return invokeJavaObjectMethod(this, method, args);
-        }
-
-        int methodType = getMethodType(method);
-
-        checkUnsupportedMethods(methodType);
-
-        Object returnValue = null;
-
-        try {
-
-            // Initialize method info for invocation based on arguments.
-            // Some/All of this might be overridden below.
-            Object serviceToInvoke = serviceDelegate;
-            Method methodToInvoke  = method;
-            int methodTypeToInvoke = methodType;
-            Object[] argsForInvoke = args;
-
-            switch(methodType) {
-
-                case GET_PORT_CONTAINER_MANAGED :
-                    Class serviceEndpointInterfaceClass = (Class) args[0];
-                    String serviceEndpointInterface =
-                            serviceEndpointInterfaceClass.getName();
-                    ServiceRefPortInfo portInfo =
-                            serviceRef.getPortInfo(serviceEndpointInterface);
-
-                    // If we have a port, use it to call getPort(QName, SEI) instead
-                    if( (portInfo != null) && portInfo.hasWsdlPort() ) {
-                        methodToInvoke = getClientManagedPortMethod;
-                        methodTypeToInvoke = GET_PORT_CLIENT_MANAGED;
-                        argsForInvoke  = new Object[] { portInfo.getWsdlPort(),
-                                args[0] };
-                    } else {
-                        // This means the deployer did not resolve the port to
-                        // which this SEI is mapped.  Just call getPort(SEI)
-                        // method on delegate. This is not guaranteed to work.
-                    }
-                    break;
-
-                case GET_WSDL_LOCATION :
-                    return wsdlLocation;
-
-                case CREATE_CALL_PORT :
-                case CREATE_CALL_OPERATION_QNAME :
-                case CREATE_CALL_OPERATION_STRING :
-                case GET_CALLS :
-                case GET_PORTS :
-
-                    serviceToInvoke = getConfiguredServiceDelegate();
-                    break;
-                default:
-                    break;
-            } // End switch (methodType)
-
-            returnValue = methodToInvoke.invoke(serviceToInvoke, argsForInvoke);
-
-            if( returnValue instanceof Stub ) {
-                Stub stub = (Stub) returnValue;
-                setStubProperties(stub, methodTypeToInvoke, methodToInvoke,
-                        argsForInvoke);
-            } else if( returnValue instanceof Call ) {
-                Call[] calls = new Call[1];
-                calls[0] = (Call) returnValue;
-                setCallProperties(calls, methodTypeToInvoke, argsForInvoke);
-            } else if( methodType == GET_CALLS ) {
-                Call[] calls = (Call[]) returnValue;
-                setCallProperties(calls, methodTypeToInvoke, argsForInvoke);
-            }
-
-        } catch(InvocationTargetException ite) {
-            throw ite.getCause();
-        }
-
-        return returnValue;
-    }
-
-    public HandlerInfo getMessageSecurityHandlerInfo(QName port) throws Exception
-    {
-        HandlerInfo rvalue = null;
-
-        MessageSecurityBindingDescriptor binding = null;
-        ServiceRefPortInfo portInfo = serviceRef.getPortInfoByPort(port);
-        if (portInfo != null) {
-            binding = portInfo.getMessageSecurityBinding();
-        }
-        if (secServ != null) {
-           rvalue = secServ.getMessageSecurityHandler(binding, serviceRef.getServiceName());
-        }
-        return rvalue;
-    }
-
-    private boolean addMessageSecurityHandler(Service service) throws Exception
-    {
-        HandlerRegistry registry = service.getHandlerRegistry();
-        Iterator ports = null;
-        try {
-            ports = service.getPorts();
-        } catch (Exception e) {
-            // FIXME: should make sure that the exception was thrown because
-            // the service is not fully defined; but for now just return.
-            ports = null;
-        }
-
-        while(ports != null && ports.hasNext()) {
-
-            QName nextPort = (QName) ports.next();
-
-            List handlerChain = registry.getHandlerChain(nextPort);
-
-            // append security handler to the end of every handler chain
-            // ASSUMPTION 1: that registry.getHandlerChain() never returns null.
-            // ASSUMPTION 2: that handlers from ServiceRef have already been added
-
-            HandlerInfo handlerInfo = getMessageSecurityHandlerInfo(nextPort);
-
-            if (handlerInfo != null) {
-                handlerChain.add(handlerInfo);
-            }
-        }
-
-        return ports == null ? false : true;
-    }
-
-    private Service getConfiguredServiceDelegate() throws Exception {
-        if (configuredServiceDelegate == null) {
-            // We need a ConfiguredService to handle these
-            // invocations, since the JAXRPC RI Generated Service impl
-            // does not.  Configured service is potentially
-            // a heavy-weight object so we lazily instantiate it to
-            // take advantage of the likelihood that
-            // GeneratedService service-refs won't be used for DII.
-            Service configuredService =
-                    wsUtil.createConfiguredService(serviceRef);
-            wsUtil.configureHandlerChain(serviceRef, configuredService,
-                    configuredService.getPorts(), classLoader);
-            configuredServiceDelegate = configuredService;
-
-            addMessageSecurityHandler(configuredService);
-        }
-        return configuredServiceDelegate;
-    }
-
-    private int getMethodType(Method method) {
-        Integer methodType = (Integer) serviceMethodTypes.get(method);
-        return (methodType != null) ?
-                methodType.intValue() : GENERATED_SERVICE_METHOD;
-    }
-
-    /**
-     * Convert invocation method to a constant for easier processing.
-     */
-    private static void init() {
-
-        serviceMethodTypes     = new HashMap();
-        fullWsdlIllegalMethods = new HashSet();
-        noWsdlIllegalMethods   = new HashSet();
-
-        try {
-
-            Class noParams[]   = new Class[0];
-            String createCall  = "createCall";
-            Class serviceClass = javax.xml.rpc.Service.class;
-
-            //
-            // Map Service method to method type.
-            //
-
-            Method createCallNoArgs =
-                    serviceClass.getDeclaredMethod(createCall, noParams);
-            serviceMethodTypes.put(createCallNoArgs,
-                    Integer.valueOf(CREATE_CALL_NO_ARGS));
-
-            Method createCallPort =
-                    serviceClass.getDeclaredMethod(createCall,
-                            new Class[] { QName.class });
-            serviceMethodTypes.put(createCallPort,
-                     Integer.valueOf(CREATE_CALL_PORT));
-
-            Method createCallOperationQName =
-                    serviceClass.getDeclaredMethod
-                            (createCall, new Class[] { QName.class, QName.class });
-            serviceMethodTypes.put(createCallOperationQName,
-                     Integer.valueOf(CREATE_CALL_OPERATION_QNAME));
-
-            Method createCallOperationString =
-                    serviceClass.getDeclaredMethod
-                            (createCall, new Class[] { QName.class, String.class });
-            serviceMethodTypes.put(createCallOperationString,
-                    Integer.valueOf(CREATE_CALL_OPERATION_STRING));
-
-            Method getCalls = serviceClass.getDeclaredMethod
-                    ("getCalls", new Class[] { QName.class });
-            serviceMethodTypes.put(getCalls,  Integer.valueOf(GET_CALLS));
-
-            Method getHandlerRegistry = serviceClass.getDeclaredMethod
-                    ("getHandlerRegistry", noParams);
-            serviceMethodTypes.put(getHandlerRegistry,
-                     Integer.valueOf(GET_HANDLER_REGISTRY));
-
-            Method getPortContainerManaged = serviceClass.getDeclaredMethod
-                    ("getPort", new Class[] { Class.class });
-            serviceMethodTypes.put(getPortContainerManaged,
-                    Integer.valueOf(GET_PORT_CONTAINER_MANAGED));
-
-            Method getPortClientManaged = serviceClass.getDeclaredMethod
-                    ("getPort", new Class[] { QName.class, Class.class });
-            serviceMethodTypes.put(getPortClientManaged,
-                    Integer.valueOf(GET_PORT_CLIENT_MANAGED));
-
-            Method getPorts = serviceClass.getDeclaredMethod
-                    ("getPorts", noParams);
-            serviceMethodTypes.put(getPorts, Integer.valueOf(GET_PORTS));
-
-            Method getServiceName = serviceClass.getDeclaredMethod
-                    ("getServiceName", noParams);
-            serviceMethodTypes.put(getServiceName,
-                     Integer.valueOf(GET_SERVICE_NAME));
-
-            Method getTypeMappingRegistry = serviceClass.getDeclaredMethod
-                    ("getTypeMappingRegistry", noParams);
-            serviceMethodTypes.put(getTypeMappingRegistry,
-                    Integer.valueOf(GET_TYPE_MAPPING_REGISTRY));
-
-            Method getWsdlLocation = serviceClass.getDeclaredMethod
-                    ("getWSDLDocumentLocation", noParams);
-            serviceMethodTypes.put(getWsdlLocation,
-                     Integer.valueOf(GET_WSDL_LOCATION));
-        } catch(NoSuchMethodException nsme) {}
-
-        // Implementation of table 4.2.2.7.  All "No WSDL" column cells
-        // with value Unspecified throw UnsupportedOperationException
-
-        fullWsdlIllegalMethods.add( GET_HANDLER_REGISTRY);
-        fullWsdlIllegalMethods.add(GET_TYPE_MAPPING_REGISTRY);
-
-        noWsdlIllegalMethods.add( CREATE_CALL_PORT);
-        noWsdlIllegalMethods.add( CREATE_CALL_OPERATION_QNAME);
-        noWsdlIllegalMethods.add(CREATE_CALL_OPERATION_STRING);
-        noWsdlIllegalMethods.add(GET_CALLS);
-        noWsdlIllegalMethods.add(GET_HANDLER_REGISTRY);
-        noWsdlIllegalMethods.add(GET_PORT_CONTAINER_MANAGED);
-        noWsdlIllegalMethods.add(GET_PORT_CLIENT_MANAGED);
-        noWsdlIllegalMethods.add(GET_PORTS);
-        noWsdlIllegalMethods.add(GET_SERVICE_NAME);
-        noWsdlIllegalMethods.add(GET_TYPE_MAPPING_REGISTRY);
-        noWsdlIllegalMethods.add(GET_WSDL_LOCATION);
-
-        // This case shouldn't happen since if service-ref has generated
-        // service and no WSDL it won't get past deployment, but it's here
-        // for completeness.
-        noWsdlIllegalMethods.add(Integer.valueOf(GENERATED_SERVICE_METHOD));
-    }
-
-    private void checkUnsupportedMethods(int methodType)
-            throws UnsupportedOperationException {
-
-        Set illegalMethods = fullWsdl ?
-                fullWsdlIllegalMethods : noWsdlIllegalMethods;
-
-        if( illegalMethods.contains( Integer.valueOf(methodType)) ) {
-            throw new UnsupportedOperationException();
-        }
-
-        return;
-    }
-
-    private void setStubProperties(Stub stub, int methodType, Method method,
-                                   Object[] args) {
-
-        // Port info lookup will be based on SEI or port.
-        QName port = null;
-        String serviceEndpointInterface = null;
-
-        switch(methodType) {
-            case GET_PORT_CONTAINER_MANAGED :
-
-                serviceEndpointInterface = ((Class) args[0]).getName();
-                break;
-
-            case GET_PORT_CLIENT_MANAGED :
-
-                port = (QName) args[0];
-                serviceEndpointInterface = ((Class) args[1]).getName();
-                break;
-
-            case GENERATED_SERVICE_METHOD :
-
-                // java.rmi.Remote get<Name_of_wsdl:port>()
-                String portLocalPart = method.getName().startsWith("get") ?
-                        method.getName().substring(3) : null;
-                if( portLocalPart != null ) {
-                    QName serviceName = serviceRef.getServiceName();
-                    port = new QName(serviceName.getNamespaceURI(), portLocalPart);
-                }
-                serviceEndpointInterface = method.getReturnType().getName();
-
-                break;
-
-            default :
-                return;
-        }
-
-        ServiceRefPortInfo portInfo = null;
-
-        // If port is known, it takes precedence in lookup.
-        if( port != null ) {
-            portInfo = serviceRef.getPortInfoByPort(port);
-        }
-        if( portInfo == null ) {
-            portInfo = serviceRef.getPortInfoBySEI(serviceEndpointInterface);
-        }
-
-        if( portInfo != null ) {
-            Set properties = portInfo.getStubProperties();
-
-            for(Iterator iter = properties.iterator(); iter.hasNext();) {
-                NameValuePairDescriptor next = (NameValuePairDescriptor)
-                        iter.next();
-
-                stub._setProperty(next.getName(), next.getValue());
-
-            }
-
-            // If this port has a resolved target endpoint address due to a
-            // port-component-link, set it on stub.  However, if the runtime
-            // info has an entry for target endpoint address, that takes 
-            // precedence.
-            if( portInfo.hasTargetEndpointAddress() ) {
-                if(!portInfo.hasStubProperty(Stub.ENDPOINT_ADDRESS_PROPERTY)) {
-                    stub._setProperty(Stub.ENDPOINT_ADDRESS_PROPERTY,
-                            portInfo.getTargetEndpointAddress());
-                }
-            }
-        }
-    }
-
-    private void setCallProperties(Call[] calls, int methodType, Object[] args){
-
-        Set callProperties = getPropertiesForCall(methodType, args);
-
-        if( callProperties != null ) {
-            for(int callIndex = 0; callIndex < calls.length; callIndex++) {
-                setCallProperties(calls[callIndex], callProperties);
-            }
-        }
-    }
-
-    private Set getPropertiesForCall(int methodType, Object args[]) {
-
-        Set callProperties = null;
-        switch(methodType) {
-
-            case CREATE_CALL_PORT :
-            case CREATE_CALL_OPERATION_QNAME :
-            case CREATE_CALL_OPERATION_STRING :
-            case GET_CALLS :
-
-                // Each of these methods has port as first argument.
-                QName port = (QName) args[0];
-
-                // Check if call properties are set at the port level.
-                ServiceRefPortInfo portInfo =
-                        serviceRef.getPortInfoByPort(port);
-                if( portInfo != null ) {
-                    callProperties = portInfo.getCallProperties();
-                }
-
-                break;
-
-            case CREATE_CALL_NO_ARGS :
-
-                callProperties = serviceRef.getCallProperties();
-                break;
-
-            default:
-                break;
-        }
-
-        return callProperties;
-    }
-
-    private void setCallProperties(Call call, Set callProperties) {
-        for(Iterator iter = callProperties.iterator(); iter.hasNext();) {
-            NameValuePairDescriptor next = (NameValuePairDescriptor)
-                    iter.next();
-            call.setProperty(next.getName(), next.getValue());
-        }
-    }
-
-    private Object invokeJavaObjectMethod(InvocationHandler handler,
-                                          Method method, Object[] args)
-            throws Throwable {
-
-        Object returnValue = null;
-
-        // Can only be one of : 
-        //     boolean java.lang.Object.equals(Object)
-        //     int     java.lang.Object.hashCode()
-        //     String  java.lang.Object.toString()
-        //
-        // Optimize by comparing as few characters as possible.
-
-        switch( method.getName().charAt(0) ) {
-            case 'e' :
-                Object other = Proxy.isProxyClass(args[0].getClass()) ?
-                        Proxy.getInvocationHandler(args[0]) : args[0];
-                returnValue = Boolean.valueOf(handler.equals(other));
-                break;
-            case 'h' :
-                returnValue = Integer.valueOf(handler.hashCode());
-                break;
-            case 't' :
-                returnValue = handler.toString();
-                break;
-            default :
-                throw new Throwable("Object method " + method.getName() +
-                        "not found");
-        }
-
-        return returnValue;
-    }
-
-    /* TODO remove me if none of the cts use this
-    private void setJBIProperties(Object stubOrCall, ServiceRefPortInfo portInfo) {
-        // Check if the target service is a JBI service, and get its QName
-        QName svcQName = serviceRef.getServiceName();
-        if ( svcQName == null )
-            return;
-
-        if ( stubOrCall instanceof Stub ) {
-            com.sun.xml.rpc.spi.runtime.StubBase stub =
-                    (com.sun.xml.rpc.spi.runtime.StubBase)stubOrCall;
-
-            try {
-                // This statement is getting executed only
-                //because jbi-enabled property on the stub is set to true
-                //TODO BM fix this later
-                 ServiceEngineUtil.setJBITransportFactory(portInfo, stub, true);
-
-            } catch(Throwable e) {
-                // Do nothing
-                //logger.severe("Exception raised while setting transport " +
-                //      "factory to NMR : " + e.getMessage());
-            }
-            return;
-        }
-    }*/
-}
diff --git a/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/ServletPostHandler.java b/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/ServletPostHandler.java
deleted file mode 100644
index 2a7da53..0000000
--- a/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/ServletPostHandler.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Copyright (c) 1997, 2018 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.glassfish.webservices;
-
-import com.sun.enterprise.deployment.WebComponentDescriptor;
-import java.lang.reflect.Method;
-
-import java.rmi.UnmarshalException;
-
-import javax.xml.namespace.QName;
-
-import javax.xml.rpc.handler.GenericHandler;
-import javax.xml.rpc.handler.MessageContext;
-
-/*import com.sun.enterprise.Switch;
-import com.sun.enterprise.ComponentInvocation;
-import com.sun.enterprise.InvocationManager;*/
-
-import java.util.logging.Logger;
-import java.util.logging.Level;
-
-import com.sun.enterprise.web.WebComponentInvocation;
-import org.glassfish.api.invocation.InvocationManager;
-
-/**
- * This handler is inserted last in the handler chain for an
- * servlet web service endpoint.  
- *
- * @author Kenneth Saks
- */
-public class ServletPostHandler extends GenericHandler {
-
-    private static final Logger logger = LogUtils.getLogger();
-    private final WsUtil wsUtil = new WsUtil();
-
-    public ServletPostHandler() {}
-
-    @Override
-    public QName[] getHeaders() {
-        return new QName[0];
-    }
-
-    @Override
-    public boolean handleRequest(MessageContext context) {
-        WebComponentInvocation inv = null;
-
-        try {
-            WebServiceContractImpl wscImpl = WebServiceContractImpl.getInstance();
-            InvocationManager invManager = wscImpl.getInvocationManager();
-            Object obj = invManager.getCurrentInvocation();
-            if (obj instanceof WebComponentInvocation) {
-                inv = WebComponentInvocation.class.cast(obj);
-                Method webServiceMethodInPreHandler = inv.getWebServiceMethod();
-                if (webServiceMethodInPreHandler != null) {
-                    // Now that application handlers have run, do another method
-                    // lookup and compare the results with the original one.  This
-                    // ensures that the application handlers have not changed
-                    // the message context in any way that would impact which
-                    // method is invoked.
-                    Method postHandlerMethod = wsUtil.getInvMethod(
-                            (com.sun.xml.rpc.spi.runtime.Tie) inv.getWebServiceTie(), context);
-                    if (!webServiceMethodInPreHandler.equals(postHandlerMethod)) {
-                        throw new UnmarshalException("Original method " + webServiceMethodInPreHandler
-                                + " does not match post-handler method ");
-                    }
-                }
-            }
-        } catch(Exception e) {
-            logger.log(Level.WARNING, LogUtils.POST_WEBHANDLER_ERROR, e.toString());
-            wsUtil.throwSOAPFaultException(e.getMessage(), context);
-        }
-        return true;
-    }
-}
diff --git a/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/ServletPreHandler.java b/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/ServletPreHandler.java
deleted file mode 100644
index e237eb0..0000000
--- a/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/ServletPreHandler.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright (c) 1997, 2018 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.glassfish.webservices;
-
-import javax.xml.namespace.QName;
-
-import javax.xml.rpc.handler.GenericHandler;
-import javax.xml.rpc.handler.MessageContext;
-
-import java.util.logging.Logger;
-import java.util.logging.Level;
-import org.glassfish.api.invocation.InvocationManager;
-
-import com.sun.enterprise.web.WebComponentInvocation;
-
-import com.sun.xml.rpc.server.http.Implementor;
-import com.sun.xml.rpc.server.http.MessageContextProperties;
-
-/**
- * This handler is inserted first in the handler chain for an
- * servlet web service endpoint.  
- *
- * @author Kenneth Saks
- */
-public class ServletPreHandler extends GenericHandler {
-
-    private static Logger logger = LogUtils.getLogger();
-    private final WsUtil wsUtil = new WsUtil();
-
-    public ServletPreHandler() {}
-
-    @Override
-    public QName[] getHeaders() {
-        return new QName[0];
-    }
-
-    @Override
-    public boolean handleRequest(MessageContext context) {
-        WebComponentInvocation inv = null;
-
-        try {
-            WebServiceContractImpl wscImpl = WebServiceContractImpl.getInstance();
-            InvocationManager invManager = wscImpl.getInvocationManager();
-            Object obj = invManager.getCurrentInvocation();
-            if (obj instanceof WebComponentInvocation) {
-                inv = WebComponentInvocation.class.cast(obj);
-                com.sun.xml.rpc.spi.runtime.Tie tie
-                        = (com.sun.xml.rpc.spi.runtime.Tie) inv.getWebServiceTie();
-                if (tie == null) {
-                    Implementor implementor = (Implementor) context.getProperty(MessageContextProperties.IMPLEMENTOR);
-                    tie = implementor.getTie();
-                    inv.setWebServiceTie(tie);
-                }
-                inv.setWebServiceMethod(wsUtil.getInvMethod(tie, context));
-            }
-
-        } catch(Exception e) {
-            logger.log(Level.WARNING, LogUtils.PRE_WEBHANDLER_ERROR, e.toString());
-            wsUtil.throwSOAPFaultException(e.getMessage(), context);
-        }
-        return true;
-    }
-}
diff --git a/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/ServletWebServiceDelegate.java b/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/ServletWebServiceDelegate.java
deleted file mode 100644
index bb36c10..0000000
--- a/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/ServletWebServiceDelegate.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/*
- * Copyright (c) 1997, 2018 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.glassfish.webservices;
-
-import com.sun.enterprise.container.common.spi.util.ComponentEnvManager;
-import com.sun.enterprise.deployment.JndiNameEnvironment;
-import com.sun.enterprise.deployment.WebServicesDescriptor;
-import com.sun.enterprise.deployment.WebServiceEndpoint;
-import com.sun.enterprise.deployment.WebBundleDescriptor;
-import com.sun.enterprise.deployment.WebComponentDescriptor;
-
-import org.glassfish.webservices.monitoring.JAXRPCEndpointImpl;
-
-//TBD
-//import com.sun.enterprise.security.jmac.provider.ServerAuthConfig;
-
-
-// JAX-RPC SPI
-import com.sun.xml.rpc.spi.JaxRpcObjectFactory;
-import com.sun.xml.rpc.spi.runtime.ImplementorCache;
-import com.sun.xml.rpc.spi.runtime.ImplementorCacheDelegate;
-import com.sun.xml.rpc.spi.runtime.RuntimeEndpointInfo;
-import com.sun.xml.rpc.spi.runtime.ServletDelegate;
-import com.sun.xml.rpc.spi.runtime.ServletSecondDelegate;
-import com.sun.xml.rpc.spi.runtime.SystemHandlerDelegate;
-import java.text.MessageFormat;
-
-import javax.servlet.*;
-import javax.servlet.http.*;
-import javax.xml.ws.WebServiceException;
-import java.util.*;
-import java.util.logging.Logger;
-import java.util.logging.Level;
-import org.glassfish.internal.api.Globals;
-import org.glassfish.webservices.monitoring.EndpointImpl;
-import org.glassfish.webservices.monitoring.WebServiceEngineImpl;
-
-/**
- * This class is delegated to by the container-provided servlet-class 
- * that is written into the web.xml at deployment time.  It overrides
- * the JAXRPC servlet delegate to register endpoint information and
- * intercept certain events.
- */
-public class ServletWebServiceDelegate extends ServletSecondDelegate {
-
-    private static final Logger logger = LogUtils.getLogger();
-    private WebServiceEndpoint endpoint_;
-
-    private ServletDelegate rpcDelegate_;
-
-    private JaxRpcObjectFactory rpcFactory_;
-
-    private WebServiceEngineImpl wsEngine_;
-    private JAXRPCEndpointImpl endpointImpl_;
-
-    private org.glassfish.webservices.SecurityService  secServ;
-
-    public ServletWebServiceDelegate (ServletDelegate firstDelegate) {
-        rpcDelegate_ = firstDelegate;
-        rpcFactory_ = JaxRpcObjectFactory.newInstance();
-        wsEngine_ = WebServiceEngineImpl.getInstance();
-        if (Globals.getDefaultHabitat() != null) {
-            secServ = Globals.get(org.glassfish.webservices.SecurityService.class);
-        }
-    }
-
-    @Override
-    public void postInit(ServletConfig servletConfig) throws ServletException {
-
-        String servletName = "unknown";
-
-        try {
-            WebServiceContractImpl wscImpl = WebServiceContractImpl.getInstance();
-            ComponentEnvManager compEnvManager = wscImpl.getComponentEnvManager();
-            JndiNameEnvironment jndiNameEnv = compEnvManager.getCurrentJndiNameEnvironment();
-            WebBundleDescriptor webBundle = null;
-            if (jndiNameEnv != null && jndiNameEnv instanceof WebBundleDescriptor){
-                webBundle = ((WebBundleDescriptor)jndiNameEnv);
-            } else {
-               throw new WebServiceException("Cannot intialize the JAXRPCServlet for " + jndiNameEnv);
-            }
-            ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
-            servletName = servletConfig.getServletName();
-            WebComponentDescriptor webComponent =
-                    webBundle.getWebComponentByCanonicalName(servletName);
-            if( webComponent != null ) {
-                WebServicesDescriptor webServices = webBundle.getWebServices();
-                Collection endpoints =
-                        webServices.getEndpointsImplementedBy(webComponent);
-                // Only 1 endpoint per servlet is supported, even though
-                // data structure implies otherwise. 
-                endpoint_ = (WebServiceEndpoint) endpoints.iterator().next();
-                registerEndpoint(classLoader);
-
-                // if a conventional authentication mechanism has NOT been configured
-                // for the endpoint create and install system handler for web services
-                // security
-                if (secServ != null) {
-                    SystemHandlerDelegate securityHandlerDelegate = secServ.getSecurityHandler(endpoint_);
-                    if (securityHandlerDelegate != null) {
-                        rpcDelegate_.setSystemHandlerDelegate(securityHandlerDelegate);
-
-                        // need to invoke the endpoint lifecylcle
-                        EndpointImpl obj = wsEngine_.createHandler(securityHandlerDelegate, endpoint_);
-                        if (obj instanceof JAXRPCEndpointImpl)
-                            endpointImpl_ = JAXRPCEndpointImpl.class.cast(obj);
-                        rpcDelegate_.setSystemHandlerDelegate(endpointImpl_);
-                    }
-                }
-
-            } else {
-                throw new ServletException(servletName + " not found");
-            }
-        } catch(Throwable t) {
-            String msg = MessageFormat.format(
-                    logger.getResourceBundle().getString(LogUtils.SERVLET_ENDPOINT_FAILURE),
-                    servletName);
-            logger.log(Level.WARNING, msg, t);
-            throw new ServletException(t);
-        }
-    }
-
-    public void destroy() {
-        wsEngine_.removeHandler(endpoint_);
-    }
-
-    @Override
-    public void doGet(HttpServletRequest request,
-                      HttpServletResponse response) throws ServletException {
-
-        // normal WSDL retrieval invocation
-        WsUtil wsUtil = new WsUtil();
-        try {
-            wsUtil.handleGet(request, response, endpoint_);
-        } catch(Exception e) {
-            String msg = MessageFormat.format(
-                    logger.getResourceBundle().getString(LogUtils.SERVLET_ENDPOINT_GET_ERROR),
-                    endpoint_.getEndpointName());
-            logger.log(Level.WARNING, msg, e);
-        }
-    }
-
-    public  void doPost(HttpServletRequest request,
-                        HttpServletResponse response) throws ServletException {
-
-        rpcDelegate_.doPost(request, response);
-
-    }
-
-    @Override
-    public void warnMissingContextInformation() {
-        // context info not used within j2ee integration, so override
-        // this method to prevent warning message
-    }
-
-    @Override
-    public ImplementorCache createImplementorCache(ServletConfig sc) {
-        ImplementorCache ic = rpcFactory_.createImplementorCache(sc);
-        ImplementorCacheDelegate delegate =
-                new ImplementorCacheDelegateImpl(sc);
-        ic.setDelegate(delegate);
-        return ic;
-    }
-
-    private void registerEndpoint(ClassLoader loader)
-            throws Exception {
-
-        //
-        // Convert J2EE deployment descriptor information into 
-        // JAXRPC endpoint data structure
-        //
-
-        RuntimeEndpointInfo endpointInfo =
-                rpcFactory_.createRuntimeEndpointInfo();
-
-        Class serviceEndpointInterfaceClass =
-                loader.loadClass(endpoint_.getServiceEndpointInterface());
-        Class implementationClass =
-                loader.loadClass(endpoint_.getServletImplClass());
-        String tieClassName = endpoint_.getTieClassName();
-        if(tieClassName != null) {
-            Class tieClass = loader.loadClass(tieClassName);
-            endpointInfo.setTieClass(tieClass);
-        }
-
-        endpointInfo.setRemoteInterface(serviceEndpointInterfaceClass);
-        endpointInfo.setImplementationClass(implementationClass);
-
-        endpointInfo.setName(endpoint_.getEndpointName());
-
-
-        // No need to set model file name or wsdl file, since we override
-        // the code that serves up the final WSDL.
-        //endpointInfo.setModelFileName()
-        //endpointInfo.setWSDLFileName()
-
-        endpointInfo.setDeployed(true);
-        endpointInfo.setPortName(endpoint_.getWsdlPort());
-
-        endpointInfo.setServiceName(endpoint_.getServiceName());
-
-        // For web components, this will be relative to the web app
-        // context root.  Make sure there is a leading slash.
-        String uri = endpoint_.getEndpointAddressUri();
-        uri = uri.startsWith("/") ? uri : "/" + uri;
-        endpointInfo.setUrlPattern(uri);
-
-        rpcDelegate_.registerEndpointUrlPattern(endpointInfo);
-    }
-}
diff --git a/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/SingleThreadJAXRPCServlet.java b/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/SingleThreadJAXRPCServlet.java
deleted file mode 100644
index 9aae2f1..0000000
--- a/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/SingleThreadJAXRPCServlet.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (c) 1997, 2018 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.glassfish.webservices;
-
-import javax.servlet.SingleThreadModel;
-
-/**
- * Single-threaded JAXRPC Servlet
- * @author Bhakti Mehta
- *
- */
-public class SingleThreadJAXRPCServlet extends JAXRPCServlet 
-    implements SingleThreadModel {
-
-}
-
diff --git a/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/WebServiceEjbEndpointRegistry.java b/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/WebServiceEjbEndpointRegistry.java
index bae4c66..d1c728a 100644
--- a/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/WebServiceEjbEndpointRegistry.java
+++ b/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/WebServiceEjbEndpointRegistry.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2018 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2020 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -75,7 +75,7 @@
                                   EjbEndpointFacade ejbContainer,
                                   Object servant, Class tieClass)  {
         String uri = null;
-        EjbRuntimeEndpointInfo endpoint = createEjbEndpointInfo(webserviceEndpoint, ejbContainer,servant,tieClass);
+        EjbRuntimeEndpointInfo endpoint = createEjbEndpointInfo(webserviceEndpoint, ejbContainer,servant);
         synchronized(webServiceEjbEndpoints) {
             String uriRaw = endpoint.getEndpointAddressUri();
             if (uriRaw != null ) {
@@ -95,15 +95,11 @@
 
         // notify monitoring layers that a new endpoint is being created.
         WebServiceEngineImpl engine = WebServiceEngineImpl.getInstance();
-        if (endpoint.getEndpoint().getWebService().getMappingFileUri()!=null) {
-            engine.createHandler((com.sun.xml.rpc.spi.runtime.SystemHandlerDelegate)null, endpoint.getEndpoint());
-        } else {
-            engine.createHandler(endpoint.getEndpoint());
-            try {
-                endpoint.initRuntimeInfo(adapterListMap.get(uri));
-            } catch (Exception e) {
-                logger.log(Level.WARNING,LogUtils.EJB_POSTPROCESSING_ERROR, e);
-            }
+        engine.createHandler(endpoint.getEndpoint());
+        try {
+            endpoint.initRuntimeInfo(adapterListMap.get(uri));
+        } catch (Exception e) {
+            logger.log(Level.WARNING,LogUtils.EJB_POSTPROCESSING_ERROR, e);
         }
     }
 
@@ -154,23 +150,16 @@
         engine.removeHandler(endpoint.getEndpoint());
 
     }
-    
+
     /**
      * Creates a new EjbRuntimeEndpointInfo instance depending on the type
      * and version of the web service implementation.
      * @param   
      */
-  public EjbRuntimeEndpointInfo createEjbEndpointInfo(WebServiceEndpoint webServiceEndpoint,
+    public EjbRuntimeEndpointInfo createEjbEndpointInfo(WebServiceEndpoint webServiceEndpoint,
                                   EjbEndpointFacade ejbContainer,
-                                  Object servant, Class tieClass) {
-        EjbRuntimeEndpointInfo info = null;
-        if (webServiceEndpoint.getWebService().hasMappingFile()) {
-            info = new Ejb2RuntimeEndpointInfo(webServiceEndpoint, ejbContainer, servant, tieClass);
-        } else {
-            info = new EjbRuntimeEndpointInfo(webServiceEndpoint, ejbContainer, servant);
-        }
-
-        return info;
+                                  Object servant) {
+        return new EjbRuntimeEndpointInfo(webServiceEndpoint, ejbContainer, servant);
     }
 
     public EjbRuntimeEndpointInfo getEjbWebServiceEndpoint(String uriRaw, String method, String query) {
diff --git a/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/WebServiceReferenceManagerImpl.java b/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/WebServiceReferenceManagerImpl.java
index 33674f4..0d05006 100644
--- a/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/WebServiceReferenceManagerImpl.java
+++ b/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/WebServiceReferenceManagerImpl.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2009, 2018 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, 2020 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -32,7 +32,6 @@
 import javax.naming.NamingException;
 import javax.naming.InitialContext;
 import javax.xml.namespace.QName;
-import javax.xml.rpc.ServiceFactory;
 import javax.xml.ws.soap.MTOMFeature;
 import javax.xml.ws.soap.AddressingFeature;
 import javax.xml.ws.WebServiceFeature;
@@ -99,18 +98,9 @@
 
             resolvePortComponentLinks(desc);
 
-            javax.xml.rpc.Service serviceDelegate = null;
             javax.xml.ws.Service jaxwsDelegate = null;
             Object injValue = null;
 
-            if( desc.hasGeneratedServiceInterface() || desc.hasWsdlFile() ) {
-
-                String serviceImplName  = desc.getServiceImplClassName();
-                if(serviceImplName != null) {
-                    Class serviceImplClass  = cl.loadClass(serviceImplName);
-                    serviceDelegate = (javax.xml.rpc.Service) serviceImplClass.newInstance();
-                } else {
-
                     // The target is probably a post JAXRPC-1.1- based service;
                     // If Service Interface class is set, check if it is indeed a subclass of Service
                     // initiateInstance should not be called if the user has given javax.xml.ws.Service itself
@@ -170,20 +160,7 @@
                                         desc.getServiceName());
                         jaxwsDelegate = new JAXWSServiceDelegate(desc, svc, cl);
                     }
-                }
-
-                if( desc.hasHandlers() ) {
-                    // We need the service's ports to configure the
-                    // handler chain (since service-ref handler chain can
-                    // optionally specify handler-port association)
-                    // so create a configured service and call getPorts
-
-                    javax.xml.rpc.Service configuredService =
-                            wsUtil.createConfiguredService(desc);
-                    Iterator ports = configuredService.getPorts();
-                    wsUtil.configureHandlerChain
-                            (desc, serviceDelegate, ports, cl);
-                }
+                
 
                 // check if this is a post 1.1 web service
                 if(javax.xml.ws.Service.class.isAssignableFrom(serviceInterfaceClass)) {
@@ -213,29 +190,7 @@
 
                 }
 
-            } else {
-                // Generic service interface / no WSDL
-                QName serviceName = desc.getServiceName();
-                if( serviceName == null ) {
-                    // ServiceFactory API requires a service-name.
-                    // However, 109 does not allow getServiceName() to be
-                    // called, so it's ok to use a dummy value.
-                    serviceName = new QName("urn:noservice", "servicename");
-                }
-                ServiceFactory serviceFac = ServiceFactory.newInstance();
-                serviceDelegate = serviceFac.createService(serviceName);
-            }
-
-            // Create a proxy for the service object.
-            // Get a proxy only in jaxrpc case because in jaxws the service class is not
-            // an interface any more
-            InvocationHandler handler = null;
-            if(serviceDelegate != null) {
-
-                handler = new ServiceInvocationHandler(desc, serviceDelegate, cl);
-                returnObj = Proxy.newProxyInstance
-                        (cl, new Class[] { serviceInterfaceClass }, handler);
-            } else if(jaxwsDelegate != null) {
+            if(jaxwsDelegate != null) {
                 returnObj = jaxwsDelegate;
             } else if(injValue != null) {
                 returnObj = injValue;
diff --git a/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/WebServicesDeployer.java b/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/WebServicesDeployer.java
index ca137e7..c1f3e38 100644
--- a/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/WebServicesDeployer.java
+++ b/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/WebServicesDeployer.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, 2018 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 2020 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -139,16 +139,7 @@
             Thread.currentThread().setContextClassLoader(newCl);
             WebServicesDescriptor wsDesc = bundle.getWebServices();
             for (WebService ws : wsDesc.getWebServices()) {
-                if ((new WsUtil()).isJAXWSbasedService(ws)){
                     setupJaxWSServiceForDeployment(dc, ws);
-                } else {
-                    JAXRPCCodeGenFacade facade= habitat.getService(JAXRPCCodeGenFacade.class);
-                    if (facade != null) {
-                        facade.run(habitat, dc, moduleCP, false);
-                    }  else {
-                        throw new DeploymentException(rb.getString(LogUtils.JAXRPC_CODEGEN_FAIL)) ;
-                    }
-                }
             }
             doWebServicesDeployment(app,dc);
             Thread.currentThread().setContextClassLoader(oldCl);
@@ -596,7 +587,7 @@
             // For JAXWS services, we rely on JAXWS RI to do WSL gen and publishing
             // For JAXRPC we do it here in 109
             //however it is needed for file publishing for jaxws
-            if(wsUtil.isJAXWSbasedService(next) && (!next.hasFilePublishing())) {
+            if(!next.hasFilePublishing()) {
                 for(WebServiceEndpoint wsep : next.getEndpoints()) {
                     URL finalWsdlURL = wsep.composeFinalWsdlUrl(wsUtil.getWebServerInfoForDAS().getWebServerRootURL(wsep.isSecure()));
                     Set<ServiceReferenceDescriptor> serviceRefs = new HashSet<ServiceReferenceDescriptor>();
@@ -694,26 +685,9 @@
 
             }
 
-            String servletImplClass = nextEndpoint.getServletImplClass();
-            try {
-                Class servletImplClazz  = cl.loadClass(servletImplClass);
-                String containerServlet;
-                if(wsutil.isJAXWSbasedService(nextEndpoint.getWebService())) {
-                    containerServlet = "org.glassfish.webservices.JAXWSServlet";
-                    addWSServletContextListener(webBunDesc);
-                } else {
-                    containerServlet =
-                    SingleThreadModel.class.isAssignableFrom(servletImplClazz) ?
-                    "org.glassfish.webservices.SingleThreadJAXRPCServlet" :
-                        "org.glassfish.webservices.JAXRPCServlet";
-                }
-                webComp.setWebComponentImplementation(containerServlet);
-
-            } catch(ClassNotFoundException cex) {
-                throw new DeploymentException( format(rb.getString(
-                        LogUtils.DEPLOYMENT_BACKEND_CANNOT_FIND_SERVLET),
-                        nextEndpoint.getEndpointName()));
-            }
+            String containerServlet = "org.glassfish.webservices.JAXWSServlet";
+            addWSServletContextListener(webBunDesc);
+            webComp.setWebComponentImplementation(containerServlet);
 
             /**
              * Now trying to figure the address from <code>com.sun.enterprise.webservice.WsUtil.java</code>
diff --git a/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/WsCompile.java b/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/WsCompile.java
deleted file mode 100644
index 11c8bc5..0000000
--- a/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/WsCompile.java
+++ /dev/null
@@ -1,351 +0,0 @@
-/*
- * Copyright (c) 1997, 2018 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.glassfish.webservices;
-
-
-import java.util.Map;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-
-import java.util.Iterator;
-import java.util.List;
-
-
-import javax.xml.namespace.QName;
-
-//JAX-RPC SPI
-import com.sun.xml.rpc.spi.JaxRpcObjectFactory;
-import com.sun.xml.rpc.spi.tools.CompileTool;
-import com.sun.xml.rpc.spi.tools.CompileToolDelegate;
-import com.sun.xml.rpc.spi.tools.HandlerChainInfo;
-import com.sun.xml.rpc.spi.tools.HandlerInfo;
-import com.sun.xml.rpc.spi.tools.Configuration;
-import com.sun.xml.rpc.spi.tools.ModelInfo;
-import com.sun.xml.rpc.spi.model.Model;
-import com.sun.xml.rpc.spi.model.Service;
-import com.sun.xml.rpc.spi.model.Port;
-import com.sun.xml.rpc.spi.model.ModelProperties;
-
-import com.sun.enterprise.deployment.WebService;
-import com.sun.enterprise.deployment.WebServiceEndpoint;
-import com.sun.enterprise.deployment.ServiceReferenceDescriptor;
-import com.sun.enterprise.deployment.WebServiceHandler;
-import com.sun.enterprise.deployment.NameValuePairDescriptor;
-
-/**
- * This implementation of WsCompile should be used only internally 
- * at deployment time (or j2eec).  Not meant to be overridden.
- *
- * @author Kenneth Saks
- */
-public final class WsCompile extends CompileToolDelegate {
-
-    private Collection generatedFiles;
-    private WebService webService;
-    private ServiceReferenceDescriptor serviceRef;
-    private WsUtil wsUtil = new WsUtil();
-    private CompileTool wscompile;
-    private JaxRpcObjectFactory rpcFactory;
-
-    // if set, used to override standard configuration
-    private ModelInfo modelInfo;
-
-    // true if wscompile encountered an error.
-    private boolean error = false;
-
-    public WsCompile(CompileTool compileTool, WebService webServiceDesc) {
-        wscompile = compileTool;
-        webService = webServiceDesc;
-        rpcFactory = JaxRpcObjectFactory.newInstance();
-    }
-
-    public WsCompile(CompileTool compileTool, 
-                     ServiceReferenceDescriptor serviceRefDesc) {
-        wscompile = compileTool;
-        serviceRef = serviceRefDesc;
-        rpcFactory = JaxRpcObjectFactory.newInstance();
-    }
-
-    public void setModelInfo(ModelInfo info) {
-        modelInfo = info;
-    }
-
-    public CompileTool getCompileTool() {
-        return wscompile;
-    }
-
-    /**
-     * com.sun.xml.rpc.spi.tools.wscompile.CompileToolDelegate overrides.
-     */
-
-    public Configuration createConfiguration() {
-        Configuration configuration = null;
-        if( modelInfo != null ) {
-            configuration = 
-		rpcFactory.createConfiguration(wscompile.getEnvironment());
-            configuration.setModelInfo(modelInfo);
-        } 
-        //else, leave it to the jaxrpc implementation to 
-        //create Configuration
-
-        return configuration;
-    }
-
-    public void preOnError() {
-        error = true;
-    }
-
-    public void postRegisterProcessorActions() {
-
-        if( !error) {
-
-            if (webService != null) {
-                setupServiceHandlerChain();
-            } 
-
-            // NOTE : Client handler chains are configured at runtime.
-        }
-    }
-
-    public void postRun() {
-        generatedFiles = new HashSet();
-
-        if( !error ) {
-            for(Iterator iter = wscompile.getEnvironment().getGeneratedFiles();
-                iter.hasNext(); ) {
-                generatedFiles.add( iter.next() );
-            }
-            if( webService != null ) {
-                doServicePostProcessing();
-            } else if( serviceRef != null ) {
-                doClientPostProcessing();
-            }
-        }
-    }
-
-    //
-    // WsCompile methods.
-    //
-
-    public Collection getGeneratedFiles() {
-        return generatedFiles;
-    }
-
-    private void setupServiceHandlerChain() {
-
-        Model model = wscompile.getProcessor().getModel();
-
-        Collection endpoints = webService.getEndpoints();
-        for(Iterator eIter = endpoints.iterator(); eIter.hasNext();) {
-            WebServiceEndpoint nextEndpoint = (WebServiceEndpoint) eIter.next();
-
-            if( !nextEndpoint.hasHandlers() ) {
-                continue;
-            }
-
-            Port port = wsUtil.getPortFromModel(model, 
-                                                nextEndpoint.getWsdlPort());
-            if( port == null ) {
-                throw new IllegalStateException("Model port for endpoint " + 
-                                                nextEndpoint.getEndpointName() +
-                                                " not found");
-            }
-            
-            List handlerChain = nextEndpoint.getHandlers();
-            HandlerChainInfo modelHandlerChain = 
-                port.getServerHCI();
-            List handlerInfoList = new ArrayList();
-
-            // Insert an container handler as the first element.
-            // This is needed to perform method authorization checks.
-            HandlerInfo preHandler = rpcFactory.createHandlerInfo();
-            String handlerClassName = nextEndpoint.implementedByEjbComponent() ?
-                "org.glassfish.webservices.EjbContainerPreHandler" :
-                "org.glassfish.webservices.ServletPreHandler";
-            preHandler.setHandlerClassName(handlerClassName);
-            handlerInfoList.add(preHandler);
-
-            // Collect all roles defined on each handler and set them on
-            // handler chain. NOTE : There is a bit of a mismatch here between 
-            // 109 and JAXRPC.  JAXRPC only defines roles at the handler chain
-            // level, whereas 109 descriptors put roles at the handler level.
-            Collection soapRoles = new HashSet();            
-
-            for(Iterator hIter = handlerChain.iterator(); hIter.hasNext();) {
-                WebServiceHandler nextHandler = 
-                    (WebServiceHandler) hIter.next();
-                HandlerInfo handlerInfo = createHandlerInfo(nextHandler);
-                handlerInfoList.add(handlerInfo);
-                soapRoles.addAll(nextHandler.getSoapRoles());
-            }
-
-            // Insert a container handler as the last element in the chain.
-            HandlerInfo postHandler = rpcFactory.createHandlerInfo();
-            handlerClassName = nextEndpoint.implementedByEjbComponent() ?
-                "org.glassfish.webservices.EjbContainerPostHandler" :
-                "org.glassfish.webservices.ServletPostHandler";
-            postHandler.setHandlerClassName(handlerClassName);
-            handlerInfoList.add(postHandler);
-
-            // @@@ should probably use addHandler api instead once
-            // == bug is fixed.
-            modelHandlerChain.setHandlersList(handlerInfoList);
-
-            for(Iterator roleIter = soapRoles.iterator(); roleIter.hasNext();) {
-                modelHandlerChain.addRole((String) roleIter.next());
-            }
-        }
-    }
-
-    private HandlerInfo createHandlerInfo(WebServiceHandler handler) {
-        HandlerInfo handlerInfo = rpcFactory.createHandlerInfo();
-        
-        handlerInfo.setHandlerClassName(handler.getHandlerClass());
-        for(Iterator iter = handler.getSoapHeaders().iterator(); 
-            iter.hasNext();) {
-            QName next = (QName) iter.next();
-            handlerInfo.addHeaderName(next);
-        }
-
-        Map properties = handlerInfo.getProperties();
-        for(Iterator iter = handler.getInitParams().iterator(); 
-            iter.hasNext();) {
-            NameValuePairDescriptor next = (NameValuePairDescriptor) 
-                iter.next();
-            properties.put(next.getName(), next.getValue());
-        }
-
-        return handlerInfo;
-    }
-
-    private void doServicePostProcessing() {
-
-        Model model = wscompile.getProcessor().getModel();
-
-        Collection endpoints = webService.getEndpoints();
-
-        for(Iterator iter = endpoints.iterator(); iter.hasNext(); ) {
-            WebServiceEndpoint next = (WebServiceEndpoint) iter.next();
-            Service service = wsUtil.getServiceForPort(model, 
-                                                       next.getWsdlPort());
-            if( service == null ) {
-                service = (Service) model.getServices().next();
-
-                System.out.println("Warning : Can't find Service for Endpoint '"
-                                   + next.getEndpointName() + "' Port '" +
-                                   next.getWsdlPort() + "'");
-
-                System.out.println("Defaulting to "+ service.getName());
-            }
-
-            QName serviceName = service.getName();
-
-            next.setServiceNamespaceUri(serviceName.getNamespaceURI());
-            next.setServiceLocalPart(serviceName.getLocalPart());
-
-            Port port = wsUtil.getPortFromModel(model, next.getWsdlPort());
-            if( port == null ) {
-                String msg = "Can't find model port for endpoint " 
-                    + next.getEndpointName() + " with wsdl-port " + 
-                    next.getWsdlPort();
-                throw new IllegalStateException(msg);
-            }
-
-            // If port has a tie class name property, use it.  Otherwise,
-            // use naming convention to derive tie class name.  If there
-            // are multiple ports per SEI(binding), then the property then
-            // the TIE_CLASS_NAME property will be available.  In that case,
-            // a separate tie and stub are generated per port.  
-            String tieClassName = (String)
-                port.getProperty(ModelProperties.PROPERTY_TIE_CLASS_NAME);
-            if( tieClassName == null ) {
-                tieClassName = next.getServiceEndpointInterface() + "_Tie";
-            }
-            next.setTieClassName(tieClassName);
-
-            if( next.implementedByWebComponent() ) {
-                wsUtil.updateServletEndpointRuntime(next);
-            } else {
-                wsUtil.validateEjbEndpoint(next);
-            }
-
-            String endpointAddressUri = next.getEndpointAddressUri();
-            if( endpointAddressUri == null ) {
-                String msg = "Endpoint address uri must be set for endpoint " +
-                    next.getEndpointName();
-                throw new IllegalStateException(msg);
-            } else if( endpointAddressUri.indexOf("*") >= 0 ) {
-                String msg = "Endpoint address uri " + endpointAddressUri + 
-                    " for endpoint " + next.getEndpointName() + 
-                    " is invalid. It must not contain the '*' character";
-                throw new IllegalStateException(msg);
-            } else if( endpointAddressUri.endsWith("/") ) {
-                String msg = "Endpoint address uri " + endpointAddressUri + 
-                    " for endpoint " + next.getEndpointName() + 
-                    " is invalid. It must not end with '/'";
-                throw new IllegalStateException(msg);
-            }
-        }
-    }
-
-    private void doClientPostProcessing() {
-        Model model = wscompile.getProcessor().getModel();
-
-        Iterator serviceIter = model.getServices();
-        Service service = null;
-
-        if( serviceRef.hasServiceName() ) {
-            while( serviceIter.hasNext() ) {
-                Service next = (Service) serviceIter.next();
-                if( next.getName().equals(serviceRef.getServiceName()) ) {
-                    service = next;
-                    break;
-                }
-            }
-            if( service == null ) {
-                throw new IllegalStateException
-                    ("Service " + serviceRef.getServiceName() + 
-                     " for service-ref " + serviceRef.getName() + " not found");
-            }
-        } else {
-            if( serviceIter.hasNext() ) {
-                service = (Service) serviceIter.next();
-                if( serviceIter.hasNext() ) {
-                    throw new IllegalStateException
-                        ("service ref " + serviceRef.getName() + " must specify"
-                         + " service name since its wsdl declares multiple"
-                         + " services");
-                }
-                QName sName = service.getName();
-                serviceRef.setServiceNamespaceUri(sName.getNamespaceURI());
-                serviceRef.setServiceLocalPart(sName.getLocalPart());
-            } else {
-                throw new IllegalStateException
-                    ("service ref " + serviceRef.getName() + " WSDL must " +
-                     "define at least one Service");
-            }
-        }
-
-        // Use naming convention to derive Generated Service 
-        // implementation class name.  
-        String serviceImpl = service.getJavaIntf().getName() + "_Impl";
-        serviceRef.setServiceImplClassName(serviceImpl);
-
-    }
-
-}
diff --git a/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/WsUtil.java b/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/WsUtil.java
index 1d59a43..94a1ac1 100644
--- a/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/WsUtil.java
+++ b/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/WsUtil.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2018 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2020 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -34,20 +34,6 @@
 
 import javax.servlet.http.*;
 import javax.xml.namespace.QName;
-import javax.xml.rpc.handler.MessageContext;
-import javax.xml.rpc.ServiceFactory;
-import javax.xml.rpc.handler.soap.SOAPMessageContext;
-import javax.xml.rpc.soap.SOAPFaultException;
-import javax.xml.rpc.handler.HandlerInfo;
-import javax.xml.rpc.handler.HandlerRegistry;
-import com.sun.xml.rpc.spi.JaxRpcObjectFactory;
-import com.sun.xml.rpc.spi.model.Model;
-import com.sun.xml.rpc.spi.model.ModelProperties;
-import com.sun.xml.rpc.spi.model.Port;
-import com.sun.xml.rpc.spi.model.Service;
-import com.sun.xml.rpc.spi.runtime.SOAPConstants;
-import com.sun.xml.rpc.spi.runtime.StreamingHandler;
-import com.sun.xml.rpc.spi.runtime.Tie;
 
 
 import java.util.*;
@@ -122,20 +108,11 @@
         config = WebServiceContractImpl.getInstance().getConfig();
     }
 
-    // @@@ These are jaxrpc-implementation specific MessageContextProperties
-    // that should be added to jaxrpc spi
-    private static final String ONE_WAY_OPERATION =
-        "com.sun.xml.rpc.server.OneWayOperation";
-    private static final String CLIENT_BAD_REQUEST =
-        "com.sun.xml.rpc.server.http.ClientBadRequest";
-    
     private static final String SECURITY_POLICY_NAMESPACE_URI = 
             "http://schemas.xmlsoap.org/ws/2005/07/securitypolicy";
 
     private static final Logger logger = LogUtils.getLogger();
 
-    private JaxRpcObjectFactory rpcFactory;
-
 
     /**
      * Serve up the FINAL wsdl associated with this web service.
@@ -604,30 +581,6 @@
         return;
     }
 
-    public HandlerInfo createHandlerInfo(WebServiceHandler handler,
-                                         ClassLoader loader) 
-        throws Exception {
-
-        QName[] headers = new QName[handler.getSoapHeaders().size()];
-        int i = 0;
-        for(Iterator iter = handler.getSoapHeaders().iterator();
-            iter.hasNext();) {
-            headers[i] = (QName) iter.next();
-            i++;
-        }
-
-        Map properties = new HashMap();
-        for(Iterator iter = handler.getInitParams().iterator(); 
-            iter.hasNext();) {
-            NameValuePairDescriptor next = (NameValuePairDescriptor) 
-                iter.next();
-            properties.put(next.getName(), next.getValue());
-        }
-
-        Class handlerClass = loader.loadClass(handler.getHandlerClass());
-        return new HandlerInfo(handlerClass, properties, headers);
-    }
-
    /**
      * Accessing wsdl URL might involve file system access, so wrap
      * operation in a doPrivileged block.
@@ -691,188 +644,6 @@
         return wsdlFileURL;
     }
 
-    public boolean isJAXWSbasedService(WebService ws) {
-
-        if(ws.isJaxWSBased() != null) {
-            //already verified
-            return ws.isJaxWSBased();
-        }
-
-        boolean jaxwsEndPtFound = false;
-        boolean jaxrpcEndPtFound = false;
-
-        String declaredType = ws.getType();
-        if(declaredType != null) {
-            if(declaredType.equals("JAXWS")) {
-                jaxwsEndPtFound = true;
-            } else if(declaredType.equals("JAXRPC")) {
-                jaxrpcEndPtFound = true;
-            } else {
-                logger.log(Level.SEVERE, LogUtils.WS_TYPE_ERROR, new Object[] {ws.getDescription(), declaredType});
-            }
-        }
-        //Verify that all the endpoints are of the same type 
-        for (WebServiceEndpoint endpoint : ws.getEndpoints()) {
-            if (endpoint.getLinkName() == null) {
-                String msg = MessageFormat.format(
-                        logger.getResourceBundle().getString(LogUtils.UNRESOLVED_LINK),
-                        new Object[] {endpoint.getEndpointName(), endpoint.getLinkName()});
-                    logger.log(Level.SEVERE, msg);
-                    throw new RuntimeException(msg);
-            }
-            String implClassName = null;
-            if (endpoint.implementedByEjbComponent()) {
-                if (endpoint.getEjbComponentImpl() != null) {
-                    implClassName = endpoint.getEjbComponentImpl().getEjbClassName();
-                }
-            } else {
-                if (endpoint.getWebComponentImpl() != null) {
-                    implClassName = endpoint.getWebComponentImpl().getWebComponentImplementation();
-                }
-            }
-            if (implClassName == null || "".equals(implClassName.trim())) {
-                String msg = MessageFormat.format(
-                        logger.getResourceBundle().getString(LogUtils.MISSING_IMPLEMENTATION_CLASS),
-                        endpoint.getEndpointName());
-                logger.log(Level.SEVERE, msg);
-                throw new RuntimeException(msg);
-            }
-            Class implClass;
-            try {
-                implClass = Thread.currentThread().getContextClassLoader().loadClass(implClassName);
-            } catch(Exception e) {
-                String msg = MessageFormat.format(
-                        logger.getResourceBundle().getString(LogUtils.CANNOT_LOAD_IMPLCLASS),
-                        implClassName);
-                logger.log(Level.SEVERE, msg);
-                throw new RuntimeException(msg);
-            }
-            if (implClass!=null) {
-                if(implClass.getAnnotation(javax.xml.ws.WebServiceProvider.class) != null) {
-                    // if we already found a jaxrpcendpoint, flag error since we do not support jaxws+jaxrpc endpoint
-                    // in the same service
-                    if(jaxrpcEndPtFound) {
-                        logger.log(Level.SEVERE, LogUtils.JAXWS_JAXRPC_ERROR, implClassName);
-                        continue;
-                    }
-                    //This is a JAXWS endpoint with @WebServiceProvider
-                    //Do not run wsgen for this endpoint
-                    jaxwsEndPtFound = true;
-                    continue;
-                }
-                if(implClass.getAnnotation(javax.jws.WebService.class) != null) {
-                    // if we already found a jaxrpcendpoint, flag error since we do not support jaxws+jaxrpc endpoint
-                    // in the same service
-                    if(jaxrpcEndPtFound) {
-                        logger.log(Level.SEVERE, LogUtils.JAXWS_JAXRPC_ERROR, implClassName);
-                        continue;
-                    }
-                    // This is a JAXWS endpoint with @WebService;
-                    jaxwsEndPtFound = true;
-                    continue;
-                }
-                if (JAXWSServlet.class.isAssignableFrom(implClass)) {
-                     // if we already found a jaxrpcendpoint, flag error since we do not support jaxws+jaxrpc endpoint
-                    // in the same service
-                    if(jaxrpcEndPtFound) {
-                        logger.log(Level.SEVERE, LogUtils.JAXWS_JAXRPC_ERROR, implClassName);
-                        continue;
-                    }
-                    // This is a JAXWS endpoint with @WebService;
-                    jaxwsEndPtFound = true;
-                    continue;
-                } else {
-                    // this is a jaxrpc endpoint
-                    // if we already found a jaxws endpoint, flag error since we do not support jaxws+jaxrpc endpoint
-                    // in the same service
-                    if(jaxwsEndPtFound) {
-                        logger.log(Level.SEVERE, LogUtils.JAXWS_JAXRPC_ERROR, implClassName);
-                        continue;
-                    }
-                    // Set spec version to 1.1 to indicate later the wscompile should be run
-                    // We do this here so that jaxrpc endpoint having J2EE1.4 or JavaEE5
-                    // descriptors will work properly
-                    jaxrpcEndPtFound = true;
-                    ws.getWebServicesDescriptor().setSpecVersion("1.1");
-                }
-            }
-        }
-
-        if(jaxwsEndPtFound) {
-            ws.setJaxWSBased(true);
-            ws.setType("JAX-WS");
-        } else {
-            ws.setJaxWSBased(false);
-            ws.setType("JAX-RPC");
-        }
-        return jaxwsEndPtFound;
-    }
-
-    public javax.xml.rpc.Service createConfiguredService
-        (ServiceReferenceDescriptor desc) throws Exception {
-        
-        final ServiceReferenceDescriptor serviceRef = desc;
-        javax.xml.rpc.Service service = null;
-        try {
-
-            // Configured service can be created with any kind of URL.
-            // Since resolving it might require file system access,
-            // do operation in a doPrivivileged block.  JAXRPC RI should
-            // probably have the doPrivileged as well.
-
-            final URL wsdlFileURL = privilegedGetServiceRefWsdl(serviceRef);
-            final QName serviceName = serviceRef.getServiceName();
-            final ServiceFactory serviceFactory = ServiceFactory.newInstance();
-
-            service = (javax.xml.rpc.Service) 
-                java.security.AccessController.doPrivileged
-                (new java.security.PrivilegedExceptionAction() {
-                        public java.lang.Object run() throws Exception {
-                            return serviceFactory.createService
-                                (wsdlFileURL, serviceName);
-                        }
-                    });
-
-        } catch(PrivilegedActionException pae) {
-            logger.log(Level.WARNING, LogUtils.EXCEPTION_THROWN, pae);
-            Exception e = new Exception();
-            e.initCause(pae.getCause());
-            throw e;
-        }
-
-        return service;
-    }
-
-    public void configureHandlerChain(ServiceReferenceDescriptor serviceRef,
-                                      javax.xml.rpc.Service service, 
-                                      Iterator ports, ClassLoader loader)
-        throws Exception {
-
-        if( !serviceRef.hasHandlers() ) {
-            return;
-        }
-        
-        HandlerRegistry registry = service.getHandlerRegistry();
-        
-        while(ports.hasNext()) {
-            QName nextPort = (QName) ports.next();
-
-            List handlerChain = registry.getHandlerChain(nextPort);
-
-            for(Iterator iter = serviceRef.getHandlers().iterator();
-                iter.hasNext();) {
-                WebServiceHandler nextHandler = (WebServiceHandler) iter.next();
-                Collection portNames = nextHandler.getPortNames();
-                if( portNames.isEmpty() || 
-                    portNames.contains(nextPort.getLocalPart()) ) {
-                    HandlerInfo handlerInfo = 
-                        createHandlerInfo(nextHandler, loader);
-                    handlerChain.add(handlerInfo);
-                }
-            }
-        }
-    }
-
     /**
      * Create an xslt template for transforming the packaged webservice
      * WSDL to a final WSDL.
@@ -1030,34 +801,6 @@
         return templates;
     }
 
-    /**
-     * @return Set of service endpoint interface class names supported by
-     * a generated service interface.
-     *
-     * @return Collection of String class names
-     */
-    public Collection getSEIsFromGeneratedService
-        (Class generatedServiceInterface) throws Exception {
-
-        Collection seis = new HashSet();
-
-        Method[] declaredMethods =
-            generatedServiceInterface.getDeclaredMethods();
-
-        // Use naming convention from jaxrpc spec to derive SEI class name.
-        for(int i = 0; i < declaredMethods.length; i++) {
-            Method next = declaredMethods[i];
-            Class returnType = next.getReturnType();
-            if( next.getName().startsWith("get") &&
-                (next.getDeclaringClass() != javax.xml.rpc.Service.class) &&
-                java.rmi.Remote.class.isAssignableFrom(returnType) ) {
-                seis.add(returnType.getName());
-            }
-        }
-
-        return seis;
-    }
-
    /* *//**
      * Called from client side deployment object on receipt of final
      * wsdl from server.  
@@ -1100,205 +843,7 @@
         }
         return finalWsdlFile;
     }
-
-    *//**
-     * Find a Port object within the JAXRPC Model.
-     */
-    public Port getPortFromModel(Model model, QName portName) {
-        
-        for(Iterator serviceIter = model.getServices(); serviceIter.hasNext();){
-            Service next = (Service) serviceIter.next();
-            for(Iterator portIter = next.getPorts(); portIter.hasNext();) {
-                Port nextPort = (Port) portIter.next();
-                if( portsEqual(nextPort, portName) ) {
-                    return nextPort;
-                }
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Find a Service in which a particular port is defined.  Assumes port
-     * QName is unique within a WSDL.
-     */
-    public Service getServiceForPort(Model model, QName thePortName) {
-
-        for(Iterator serviceIter = model.getServices(); 
-            serviceIter.hasNext();) {
-            Service nextService = (Service) serviceIter.next();
-            for(Iterator portIter = nextService.getPorts(); 
-                portIter.hasNext();) {
-                
-                Port nextPort = (Port) portIter.next();
-                if( portsEqual(nextPort, thePortName) ) {
-                    return nextService;
-                }
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Logic for matching a port qname with a Port object from 
-     * the JAXRPC-RI Model.
-     */
-    public boolean portsEqual(Port port, QName candidatePortName) {
-
-        boolean equal = false;
-
-        // Better to use Port object's WSDL_PORT property for port
-        // QName than Port.getName().  If that returns null, use
-        // Port.getName().
-        QName portPropertyName = (QName) port.getProperty
-            (ModelProperties.PROPERTY_WSDL_PORT_NAME);
-
-        if( portPropertyName != null ) {
-            equal = candidatePortName.equals(portPropertyName);
-        } else {
-            equal = candidatePortName.equals(port.getName());
-        }
-
-        return equal;
-    }
-
-    // Return collection of Port objects
-    public Collection getAllPorts(Model model) {
-        Collection ports = new HashSet();
-        for(Iterator serviceIter = model.getServices(); 
-            serviceIter.hasNext();) {
-            Service next = (Service) serviceIter.next();
-            ports.addAll(next.getPortsList());
-        }
-        return ports;
-    }
-
-    /**
-     *@return a method object representing the target of a web service 
-     * invocation
-     */
-    public Method getInvMethod(Tie webServiceTie, MessageContext context) 
-        throws Exception {
-
-        // Use tie to get Method from SOAP message inv.webServiceTie
-
-        SOAPMessageContext soapMsgContext = (SOAPMessageContext) context;
-        SOAPMessage message = soapMsgContext.getMessage();
-
-        if (!(webServiceTie instanceof StreamingHandler)) {
-            throw new IllegalArgumentException(webServiceTie + "is not instance of StreamingHandler.");
-        }
-
-        StreamingHandler streamingHandler = (StreamingHandler) webServiceTie;
-        int opcode = streamingHandler.getOpcodeForRequestMessage(message);
-        return streamingHandler.getMethodForOpcode(opcode);
-    }
-
-    /**
-     * Convenience method for throwing a SOAP fault exception.  
-     */
-    public void throwSOAPFaultException(String faultString, MessageContext msgContext) {
-        
-        SOAPMessage soapMessage = 
-                ((SOAPMessageContext)msgContext).getMessage();
-        throwSOAPFaultException(faultString, soapMessage);
-        
-    }
-    
-    public void throwSOAPFaultException(String faultString,
-                                        SOAPMessage soapMessage) 
-        throws SOAPFaultException {
-
-        SOAPFaultException sfe = null;
-
-        try {
-
-            SOAPPart sp = soapMessage.getSOAPPart();
-            SOAPEnvelope se = sp.getEnvelope();
-
-            // Consume the request
-            SOAPBody sb = se.getBody();
-
-            // Access the child elements of body
-            Iterator iter = sb.getChildElements();
-
-            // Response should only include the fault, so remove
-            // any request body nodes.
-            if (iter.hasNext()) {
-                SOAPBodyElement requestBody = (SOAPBodyElement)iter.next();
-                // detach this node from the tree
-                requestBody.detachNode();
-            }
-
-
-            SOAPFault soapFault = sb.addFault();
-
-            se.setEncodingStyle(SOAPConstants.URI_ENCODING);
-
-            String faultActor = "http://schemas.xmlsoap.org/soap/actor/next";
-            QName faultCode = SOAPConstants.FAULT_CODE_SERVER;
-
-            soapFault.setFaultCode("env:" + faultCode.getLocalPart());
-            soapFault.setFaultString(faultString);
-            soapFault.setFaultActor(faultActor);
-
-            sfe = new SOAPFaultException(faultCode, faultActor, faultString,
-                                         null);
-        } catch(SOAPException se) {
-            if (logger.isLoggable(Level.FINE)) {
-                logger.log(Level.FINE, LogUtils.EXCEPTION_THROWN, se);
-            }
-        }
-
-        if( sfe != null ) {
-            throw sfe;
-        }
-    }
-
-
-    void writeReply(HttpServletResponse response, 
-       com.sun.xml.rpc.spi.runtime.SOAPMessageContext messageContext) 
-        throws IOException, SOAPException
-    {
-
-        // In case of a one-way operation, send no reply or fault.
-        if (isMessageContextPropertySet(messageContext, ONE_WAY_OPERATION)) {
-            return;
-        }
-          
-        SOAPMessage reply = messageContext.getMessage();
-        int statusCode = 0;
-        if (messageContext.isFailure()) {
-            
-            if (isMessageContextPropertySet(messageContext,   
-                                            CLIENT_BAD_REQUEST)) {
-                response.setStatus(HttpServletResponse.SC_BAD_REQUEST); 
-                setContentTypeAndFlush(response);
-                return;
-                
-            } else {
-              response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
-            }
-            
-        } else {           
-            response.setStatus(HttpServletResponse.SC_OK);
-        }
-        
-        OutputStream os = response.getOutputStream();
-        String[] headers = reply.getMimeHeaders().getHeader("Content-Type");
-        if (headers != null && headers.length > 0) {
-            response.setContentType(headers[0]);
-        } else {
-            response.setContentType("text/xml");
-        }
-
-        putHeaders(reply.getMimeHeaders(), response);
-        
-        reply.writeTo(os);
-        os.flush();
-              
-    }
+ */
 
     private static void putHeaders(MimeHeaders headers, 
                                    HttpServletResponse response) {
@@ -1432,21 +977,6 @@
         return false;
     }
 
-    boolean isMessageContextPropertySet
-        (com.sun.xml.rpc.spi.runtime.SOAPMessageContext messageContext, 
-         String property){
-        
-        Object prop =  messageContext.getProperty(property);
-        if (prop != null) {
-            if ( (prop instanceof String) &&
-                 ((String)prop).equalsIgnoreCase("true") ) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
     MimeHeaders getHeaders(HttpServletRequest request) {
         Enumeration e = request.getHeaderNames();
         MimeHeaders headers = new MimeHeaders();
diff --git a/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/codegen/Codegen.java b/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/codegen/Codegen.java
deleted file mode 100644
index 0909213..0000000
--- a/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/codegen/Codegen.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (c) 1997, 2018 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.glassfish.webservices.codegen;
-
-import java.util.Iterator;
-import org.glassfish.api.deployment.DeploymentContext;
-import org.glassfish.hk2.api.ServiceLocator;
-
-/**
- * This interface defines all behaviours of any codegen implementation
- *
- * @author  Jerome Dochez
- */
-public interface Codegen {
-    
-    /**
-     * perform the codegen with the context provided
-     */
-    public void run(ServiceLocator habitat, DeploymentContext context, String moduleClassPath) throws Exception;
-
-    /**
-     * @return the list of source files generated by this 
-     * generator
-     */
-    public Iterator getListOfSourceFiles();
-    
-    /**
-     * @return the list of binary files generated by this 
-     * generator
-     */
-    public Iterator getListOfBinaryFiles();
-    
-}
diff --git a/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/codegen/JaxRpcCodegenAdapter.java b/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/codegen/JaxRpcCodegenAdapter.java
deleted file mode 100644
index 73c6402..0000000
--- a/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/codegen/JaxRpcCodegenAdapter.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (c) 1997, 2018 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.glassfish.webservices.codegen;
-
-/**
- *
- * @author  Jerome Dochez
- */
-public interface JaxRpcCodegenAdapter extends Codegen {
-    
-    public void done();
-}
diff --git a/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/codegen/JaxRpcCodegenFactory.java b/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/codegen/JaxRpcCodegenFactory.java
deleted file mode 100644
index c35bbf4..0000000
--- a/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/codegen/JaxRpcCodegenFactory.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (c) 1997, 2018 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.glassfish.webservices.codegen;
-
-/**
- *
- * @author  Jerome Dochez
- */
-public class JaxRpcCodegenFactory {
-    
-    private volatile static JaxRpcCodegenFactory registeredFactory;
-    
-    /** Creates a new instance of WSCompileFactory */
-    private JaxRpcCodegenFactory() {
-    }
-    
-    public static JaxRpcCodegenFactory newInstance() {
-        
-        //  for now, there is only one around, later, we may have
-        // to look into some property file to find out which
-        // jaxrpc implementation we want to use.
-        if (registeredFactory==null) {
-            registeredFactory = new JaxRpcCodegenFactory();
-        }
-        return registeredFactory;
-    }
-    
-    public JaxRpcCodegenAdapter getAdapter(boolean processServiceReferences) {
-        return new JaxRpcRICodegen(processServiceReferences);
-    }
-}
diff --git a/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/codegen/JaxRpcRICodegen.java b/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/codegen/JaxRpcRICodegen.java
deleted file mode 100644
index d838a04..0000000
--- a/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/codegen/JaxRpcRICodegen.java
+++ /dev/null
@@ -1,869 +0,0 @@
-/*
- * Copyright (c) 1997, 2018 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.glassfish.webservices.codegen;
-
-import com.sun.enterprise.deployment.util.DOLUtils;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-import java.io.File;
-import java.io.InputStream;
-import java.io.IOException;
-import java.net.URL;
-import java.net.URI;
-import java.util.logging.Logger;
-import java.util.logging.Level;
-
-import com.sun.enterprise.util.LocalStringManagerImpl;
-
-
-// DOL imports
-import org.glassfish.api.deployment.DeploymentContext;
-import org.glassfish.deployment.common.Descriptor;
-import org.glassfish.loader.util.ASClassLoaderUtil;
-import com.sun.enterprise.deploy.shared.FileArchive;
-import com.sun.enterprise.deployment.io.JaxrpcMappingDeploymentDescriptorFile;
-import com.sun.enterprise.deployment.JaxrpcMappingDescriptor.Mapping;
-import com.sun.enterprise.deployment.util.ApplicationVisitor;
-import com.sun.enterprise.deployment.util.AppClientVisitor;
-import com.sun.enterprise.deployment.util.EjbBundleVisitor;
-import com.sun.enterprise.deployment.util.ModuleContentLinker;
-import com.sun.enterprise.deployment.*;
-import org.glassfish.deployment.common.InstalledLibrariesResolver;
-import org.glassfish.deployment.common.ClientArtifactsManager;
-import org.glassfish.hk2.api.ServiceLocator;
-
-import com.sun.enterprise.loader.ASURLClassLoader;
-
-// TODO : Neds quivalent
-//import com.sun.enterprise.deployment.backend.Deployer;
-
-import javax.xml.rpc.Stub;
-
-// web service impl imports
-import org.glassfish.webservices.WsUtil;
-import org.glassfish.webservices.WsCompile;
-
-import org.glassfish.web.deployment.util.WebBundleVisitor;
-import org.glassfish.web.deployment.util.WebServerInfo;
-
-//JAX-RPC SPI
-import com.sun.xml.rpc.spi.JaxRpcObjectFactory;
-import com.sun.xml.rpc.spi.tools.CompileTool;
-import com.sun.xml.rpc.spi.tools.GeneratedFileInfo;
-import com.sun.xml.rpc.spi.tools.GeneratorConstants;
-import com.sun.xml.rpc.spi.tools.J2EEModelInfo;
-import com.sun.xml.rpc.spi.tools.ModelFileModelInfo;
-import com.sun.xml.rpc.spi.tools.ModelInfo;
-import com.sun.xml.rpc.spi.tools.NamespaceMappingInfo;
-import com.sun.xml.rpc.spi.tools.NamespaceMappingRegistryInfo;
-import com.sun.xml.rpc.spi.tools.NoMetadataModelInfo;
-import org.glassfish.webservices.LogUtils;
-
-/**
- * This class is responsible for generating all non portable 
- * jax-rpc artifacts for a single .ear or standalone module.
- *
- * @author  Jerome Dochez
- */
-public class JaxRpcRICodegen extends ModuleContentLinker
-        implements JaxRpcCodegenAdapter, ApplicationVisitor, EjbBundleVisitor, WebBundleVisitor, AppClientVisitor  
-{
-    protected DeploymentContext context = null;
-    protected ServiceLocator habitat = null;
-    protected String moduleClassPath = null;
-
-    // list of generated files
-    ArrayList<String> files = new ArrayList<String>();
-
-    private JaxRpcObjectFactory rpcFactory;
-
-    private static final Logger logger = WsUtil.getDefaultLogger();
-
-    // total number of times wscompile is invoked for the .ear or the
-    // standalone module.
-    private int wscompileInvocationCount = 0;
-
-    // resources...
-    private static LocalStringManagerImpl localStrings =
-            new LocalStringManagerImpl(JaxRpcRICodegen.class);
-
-    private CompileTool wscompileForAccept = null;
-    private CompileTool wscompileForWebServices = null;
-
-    //is this invocation for processing service references or services?
-    private boolean processServiceReferences = false;
-
-    private boolean hasWebServiceClients = false;
-
-    /** Creates a new instance of JaxRpcRICodegen */
-    public JaxRpcRICodegen(boolean processServiceReferences) {
-        rpcFactory = JaxRpcObjectFactory.newInstance();
-        this.processServiceReferences = processServiceReferences;
-    }
-
-    @Override
-    public void run(ServiceLocator habitat, DeploymentContext context, String cp) throws Exception {
-        rootLocation_ = new FileArchive();
-        BundleDescriptor bundle = DOLUtils.getCurrentBundleForContext(context);
-        if (bundle.hasWebServiceClients() && (bundle instanceof ApplicationClientDescriptor)) {
-            hasWebServiceClients = true;
-        }
-        if(bundle.isStandalone()) {
-            rootLocation_.open(context.getSourceDir().toURI());
-        } else {
-            rootLocation_.open(context.getSource().getParentArchive().getURI());
-        }
-        this.context = context;
-        this.habitat = habitat;
-        this.moduleClassPath = cp;
-        Application application = context.getModuleMetaData(Application.class);
-        application.visit((ApplicationVisitor) this);
-    }
-
-    /**
-     * Visits a webs service reference
-     */
-    @Override
-    public void accept(ServiceReferenceDescriptor serviceRef)  {
-
-        if(!processServiceReferences) {
-           return;
-        }
-        boolean codegenRequired = false;
-
-        URL wsdlOverride = null;
-        boolean wsdlOverriden = false;
-        boolean jaxwsClient = false;
-        super.accept(serviceRef);
-        try {
-            ClassLoader clr = serviceRef.getBundleDescriptor().getClassLoader();
-
-            if ( serviceRef.getServiceInterface() != null ) {
-                Class serviceInterface = clr.loadClass(serviceRef.getServiceInterface());
-
-                if (javax.xml.ws.Service.class.isAssignableFrom(serviceInterface)) {
-                    jaxwsClient = true;
-                }
-            }
-
-            // Resolve port component links to target endpoint address.
-            // We can't assume web service client is running in same VM
-            // as endpoint in the intra-app case because of app clients.
-            //
-            // Also set port-qname based on linked port's qname if not
-            // already set.
-            for(Iterator ports = serviceRef.getPortsInfo().iterator(); ports.hasNext();) {
-                ServiceRefPortInfo portInfo = (ServiceRefPortInfo) ports.next();
-
-                if( portInfo.isLinkedToPortComponent() ) {
-                    WebServiceEndpoint linkedPortComponent = portInfo.getPortComponentLink();
-
-                    if (linkedPortComponent==null) {
-                        throw new Exception(localStrings.getLocalString(
-                                "enterprise.webservice.componentlinkunresolved",
-                                "The port-component-link {0} cannot be resolved",
-                                new Object[] {portInfo.getPortComponentLinkName()}));
-                    }
-                    WsUtil wsUtil = new WsUtil();
-                    WebServerInfo wsi = wsUtil.getWebServerInfoForDAS();
-                    URL rootURL = wsi.getWebServerRootURL(linkedPortComponent.isSecure());
-                    URL actualAddress = linkedPortComponent.composeEndpointAddress(rootURL);
-                    if(jaxwsClient) {
-                        portInfo.addStubProperty(javax.xml.ws.BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
-                                actualAddress.toExternalForm());
-                    } else {
-                        portInfo.addStubProperty(Stub.ENDPOINT_ADDRESS_PROPERTY, actualAddress.toExternalForm());
-                    }
-                    if (serviceRef.getBundleDescriptor().getModuleType().equals(DOLUtils.carType())) {
-                        wsdlOverride = serviceRef.getWsdlOverride();
-                        if (wsdlOverride!=null) {
-                            wsdlOverriden = true;
-                            serviceRef.setWsdlOverride(linkedPortComponent.getWebService().getWsdlFileUrl());
-                        }
-                    }
-                }
-            }
-
-            // If this is a post JAXRPC-1.1 based web service, then no need for code gen etc etc
-            if(jaxwsClient) {
-                return;
-            }
-
-            if( serviceRef.hasGeneratedServiceInterface() ) {
-
-                if( serviceRef.hasWsdlFile() && serviceRef.hasMappingFile() ) {
-                    codegenRequired = true;
-                } else {
-                    throw new Exception
-                            ("Deployment error for service-ref " + serviceRef.getName()
-                                    + ".\nService references with generated service " +
-                                    "interface must include WSDL and mapping information.");
-                }
-
-            } else {
-
-                if( serviceRef.hasWsdlFile() ) {
-                    if( serviceRef.hasMappingFile() ) {
-                        codegenRequired = true;
-                    } else {
-                        throw new Exception
-                                ("Deployment error for service-ref " + serviceRef.getName()
-                                        + ".\nService references with wsdl must also have " +
-                                        "mapping information.");
-                    }
-                }
-            }
-
-            if( codegenRequired ) {
-                ModelInfo modelInfo = createModelInfo(serviceRef);
-
-                /*
-                 * If clients exist, force regeneration so that the
-                 * ClientArtifactsManager is populated. Issue 10612.
-                 */
-                String args[] = createJaxrpcCompileArgs(
-                    false, hasWebServiceClients);
-
-                CompileTool wscompile =
-                        rpcFactory.createCompileTool(System.out, "wscompile");
-                wscompileForAccept = wscompile;
-                WsCompile delegate =
-                        new WsCompile(wscompile, serviceRef);
-                delegate.setModelInfo(modelInfo);
-                wscompile.setDelegate(delegate);
-
-                jaxrpc(args, delegate, serviceRef, files);
-                if (hasWebServiceClients)   {
-                    addArtifactsForAppClient();
-                }
-            }
-            if (wsdlOverriden) {
-                serviceRef.setWsdlOverride(wsdlOverride);
-            }
-        } catch(IllegalStateException e) {
-            //do nothing
-           logger.info("Attempting to add artifacts for appClient after artifacts were generated" +
-                   " "+e.getMessage());
-
-        }  catch(Exception e) {
-            RuntimeException re = new RuntimeException(e.getMessage());
-            re.initCause(e);
-            throw re;
-        }
-    }
-
-    private void addArtifactsForAppClient(){
-        ClientArtifactsManager cArtifactsManager = ClientArtifactsManager.get(context);
-        for (int i = 0; i < files.size(); i ++) {
-            URI baseURI = context.getScratchDir("ejb").toURI();
-            File file = new File(files.get(i));
-            URI artifact = baseURI.relativize(file.toURI());
-            //Fix for issue 9734
-            if (!cArtifactsManager.contains(baseURI,artifact) ){
-               cArtifactsManager.add(baseURI, artifact);
-            }
-        }
-    }
-
-    /**
-     * visits a web service definition
-     * @param webService
-     */
-    @Override
-    public void accept(WebService webService) {
-        if(processServiceReferences) {
-           return;
-        }
-
-        if (!webServiceInContext(webService)) {
-            return;
-        }
-        super.accept(webService);
-        try {
-            if((new WsUtil()).isJAXWSbasedService(webService)) {
-                WsUtil wsUtil = new WsUtil();
-                Collection<WebServiceEndpoint> endpoints = webService.getEndpoints();
-                for(WebServiceEndpoint ep : endpoints) {
-                    if( ep.implementedByWebComponent() ) {
-                        wsUtil.updateServletEndpointRuntime(ep);
-                    } else {
-                        wsUtil.validateEjbEndpoint(ep);
-                    }
-                }
-                //wsImport(webService,  files);
-            } else {
-                jaxrpcWebService(webService, files);
-            }
-        } catch(Exception e) {
-            RuntimeException ge =new RuntimeException(e.getMessage());
-            ge.initCause(e);
-            throw ge;
-        }
-    }
-
-    @Override
-    public Iterator getListOfBinaryFiles() {
-        return files.iterator();
-    }
-
-    @Override
-    public Iterator getListOfSourceFiles() {
-        // for now I do not maintain those
-        return null;
-    }
-
-    /**
-     *Releases resources used during the code gen and compilation.
-     */
-    @Override
-    public void done() {
-//        done(CompileTool) is now invoked after each compilation is complete
-//        from inside the jaxrpc method.  Otherwise, multiple uses of jaxrpc could
-//        cause continued file locking on Windows since only the last one was 
-//        recorded in the wscompileForxxx variables.
-//        
-//        done(wscompileForAccept);
-//        done(wscompileForWebServices);
-    }
-
-    /**
-     *Navigates to the URLClassLoader used by the jaxrpc compilation and 
-     *releases it.
-     *@param wscompile the CompileTool whose loader is to be released
-     */
-    private void done(CompileTool wscompile) {
-        /*
-         *Follow the object graph to the loader: 
-         *basically CompileTool -> ProcessorEnvironment -> the URLClassLoader.
-         */
-        if (wscompile != null && wscompile instanceof com.sun.xml.rpc.tools.wscompile.CompileTool) {
-            com.sun.xml.rpc.tools.wscompile.CompileTool compileTool = (com.sun.xml.rpc.tools.wscompile.CompileTool) wscompile;
-            com.sun.xml.rpc.spi.tools.ProcessorEnvironment env = compileTool.getEnvironment();
-            if (env != null && env instanceof com.sun.xml.rpc.processor.util.ProcessorEnvironment) {
-                com.sun.xml.rpc.processor.util.ProcessorEnvironment typedEnv = (com.sun.xml.rpc.processor.util.ProcessorEnvironment) env;
-                java.net.URLClassLoader urlCL = typedEnv.getClassLoader();
-                try {
-                    urlCL.close();
-                } catch (IOException e) {
-                    // ignore it
-                }
-            }
-        }
-    }
-
-    private JaxrpcMappingDescriptor getJaxrpcMappingInfo(URL mappingFileUrl,
-                                                         Descriptor desc)
-            throws Exception {
-        JaxrpcMappingDescriptor mappingDesc = null;
-
-        InputStream is = null;
-        try {
-            is = mappingFileUrl.openStream();
-            JaxrpcMappingDeploymentDescriptorFile jaxrpcDD =
-                    new JaxrpcMappingDeploymentDescriptorFile();
-
-            // useful for validation errors...
-            if (desc instanceof ServiceReferenceDescriptor) {
-                ServiceReferenceDescriptor srd = (ServiceReferenceDescriptor) desc;
-                jaxrpcDD.setDeploymentDescriptorPath(srd.getMappingFileUri());
-                jaxrpcDD.setErrorReportingString(srd.getBundleDescriptor().getModuleDescriptor().getArchiveUri());
-            }
-            if (desc instanceof WebService) {
-                WebService ws = (WebService) desc;
-                jaxrpcDD.setDeploymentDescriptorPath(ws.getMappingFileUri());
-                jaxrpcDD.setErrorReportingString(ws.getBundleDescriptor().getModuleDescriptor().getArchiveUri());
-            }
-            //jaxrpcDD.setXMLValidationLevel(Deployer.getValidationLevel());
-            jaxrpcDD.setXMLValidationLevel("none");
-            Object obj = jaxrpcDD.read(is);
-            if (obj instanceof JaxrpcMappingDescriptor)
-                mappingDesc = JaxrpcMappingDescriptor.class.cast(obj);
-        } finally {
-            if( is != null ) {
-                is.close();
-            }
-        }
-
-        return mappingDesc;
-    }
-
-    private boolean isJaxrpcRIModelFile(URL mappingFileUrl) {
-        boolean isModel = false;
-        InputStream is  = null;
-        try {
-            is = mappingFileUrl.openStream();
-            isModel = rpcFactory.createXMLModelFileFilter().isModelFile(is);
-        } catch(Throwable t) {
-        } finally {
-            if( is != null ) {
-                try {
-                    is.close();
-                } catch(Exception e) {}
-            }
-        }
-        return isModel;
-    }
-
-    private ModelInfo createModelInfo(WebService webService)
-            throws Exception {
-
-        ModelInfo modelInfo = null;
-        URL mappingFileUrl = webService.getMappingFile().toURL();
-        modelInfo = createModelFileModelInfo(mappingFileUrl);
-        if( isJaxrpcRIModelFile(mappingFileUrl) ) {
-            debug("000. JaxrpcRIModelFile.");
-            modelInfo = createModelFileModelInfo(mappingFileUrl);
-        } else {
-            JaxrpcMappingDescriptor mappingDesc =
-                    getJaxrpcMappingInfo(mappingFileUrl, webService);
-            if( mappingDesc.isSimpleMapping() ) {
-                debug("111. SimpleMapping.");
-                modelInfo = createNoMetadataModelInfo(webService, mappingDesc);
-            } else {
-                debug("222. FullMapping .");
-                modelInfo = createFullMappingModelInfo(webService);
-            }
-        }
-
-        return modelInfo;
-    }
-
-    private ModelInfo createModelInfo(ServiceReferenceDescriptor serviceRef)
-            throws Exception {
-
-        ModelInfo modelInfo = null;
-        URL mappingFileUrl = serviceRef.getMappingFile().toURL();
-        if( isJaxrpcRIModelFile(mappingFileUrl) ) {
-            modelInfo = createModelFileModelInfo(mappingFileUrl);
-        } else {
-            JaxrpcMappingDescriptor mappingDesc =
-                    getJaxrpcMappingInfo(mappingFileUrl, serviceRef);
-            if( mappingDesc.isSimpleMapping() &&
-                    serviceRef.hasGeneratedServiceInterface() ) {
-                // model info for this modeler requires generated service 
-                // interface name.
-                modelInfo = createNoMetadataModelInfo(serviceRef, mappingDesc);
-            } else {
-                modelInfo = createFullMappingModelInfo(serviceRef);
-            }
-        }
-
-        return modelInfo;
-    }
-
-    private ModelFileModelInfo createModelFileModelInfo(URL modelFileUrl)
-            throws Exception {
-
-        ModelFileModelInfo modelInfo = rpcFactory.createModelFileModelInfo();
-        modelInfo.setLocation(modelFileUrl.toExternalForm());
-
-        return modelInfo;
-    }
-
-    private J2EEModelInfo createFullMappingModelInfo(WebService webService)
-            throws Exception {
-
-        URL mappingFileUrl = webService.getMappingFile().toURL();
-        URL wsdlFileUrl = webService.getWsdlFileUrl();
-
-        return createFullMappingModelInfo(mappingFileUrl, wsdlFileUrl);
-    }
-
-    private J2EEModelInfo createFullMappingModelInfo
-            (ServiceReferenceDescriptor serviceRef) throws Exception {
-
-        URL mappingFileUrl = serviceRef.getMappingFile().toURL();
-        URL wsdlFileUrl = serviceRef.hasWsdlOverride() ?
-                serviceRef.getWsdlOverride() : serviceRef.getWsdlFileUrl();
-        return createFullMappingModelInfo(mappingFileUrl, wsdlFileUrl);
-    }
-
-    private J2EEModelInfo createFullMappingModelInfo
-            (URL mappingFile, URL wsdlFile) throws Exception {
-
-        J2EEModelInfo modelInfo = rpcFactory.createJ2EEModelInfo(mappingFile);
-        modelInfo.setLocation(wsdlFile.toExternalForm());
-        // java package name not used
-        modelInfo.setJavaPackageName("package_ignored");
-        return modelInfo;
-
-    }
-
-    private NoMetadataModelInfo createNoMetadataModelInfo
-            (WebService webService, JaxrpcMappingDescriptor mappingDesc)
-            throws Exception {
-
-        NoMetadataModelInfo modelInfo = rpcFactory.createNoMetadataModelInfo();
-        URL wsdlFileUrl = webService.getWsdlFileUrl();
-
-        Collection endpoints = webService.getEndpoints();
-        if( endpoints.size() != 1 ) {
-            throw new Exception
-                    ("Deployment code generation error for webservice " +
-                            webService.getName() + ". " +
-                            " jaxrpc-mapping-file is required if web service has " +
-                            "multiple endpoints");
-        }
-
-        WebServiceEndpoint endpoint = (WebServiceEndpoint)
-                endpoints.iterator().next();
-
-        modelInfo.setLocation(wsdlFileUrl.toExternalForm());
-        modelInfo.setInterfaceName(endpoint.getServiceEndpointInterface());
-        modelInfo.setPortName(endpoint.getWsdlPort());
-
-        addNamespaceMappingRegistry(modelInfo, mappingDesc);
-
-        return modelInfo;
-    }
-
-    private void addNamespaceMappingRegistry
-            (NoMetadataModelInfo modelInfo, JaxrpcMappingDescriptor mappingDesc) {
-
-        NamespaceMappingRegistryInfo namespaceRegistry =
-                rpcFactory.createNamespaceMappingRegistryInfo();
-
-        modelInfo.setNamespaceMappingRegistry(namespaceRegistry);
-
-        Collection mappings = mappingDesc.getMappings();
-        for(Iterator iter = mappings.iterator(); iter.hasNext();) {
-            Mapping next = (Mapping) iter.next();
-            NamespaceMappingInfo namespaceInfo =
-                    rpcFactory.createNamespaceMappingInfo(next.getNamespaceUri(),
-                            next.getPackage());
-            namespaceRegistry.addMapping(namespaceInfo);
-        }
-    }
-
-    private NoMetadataModelInfo createNoMetadataModelInfo
-            (ServiceReferenceDescriptor serviceRef,
-             JaxrpcMappingDescriptor mappingDesc) throws Exception {
-
-        NoMetadataModelInfo modelInfo = rpcFactory.createNoMetadataModelInfo();
-        URL wsdlFile = serviceRef.hasWsdlOverride() ?
-                serviceRef.getWsdlOverride() : serviceRef.getWsdlFileUrl();
-        modelInfo.setLocation(wsdlFile.toExternalForm());
-
-        // Service endpoint interface is required.  Parse generated
-        // service interface for it since we can't count on SEI
-        // having been listed in standard deployment information.
-        WsUtil wsUtil = new WsUtil();
-        String serviceInterfaceName = serviceRef.getServiceInterface();
-
-        ClassLoader cl = context.getModuleMetaData(Application.class).getClassLoader();
-        if (cl instanceof ASURLClassLoader) {
-            String modClassPath = ASClassLoaderUtil.getModuleClassPath(habitat, context);
-            List<URL> moduleList = ASClassLoaderUtil.getURLsFromClasspath(modClassPath, File.pathSeparator, null);
-            for (Iterator<URL> itr=moduleList.iterator();itr.hasNext();) {
-                ((ASURLClassLoader) cl).appendURL(itr.next());
-            }
-        }
-
-        Class serviceInterface = cl.loadClass(serviceInterfaceName);
-        Collection seis = wsUtil.getSEIsFromGeneratedService(serviceInterface);
-
-        if( seis.size() == 0 ) {
-            throw new Exception("Invalid Generated Service Interface "
-                    + serviceInterfaceName + " . ");
-        } else if( seis.size() > 1 ) {
-            throw new Exception("Deployment error : If no " +
-                    "jaxrpc-mapping file is provided, " +
-                    "Generated Service Interface must have"
-                    +" only 1 Service Endpoint Interface");
-        }
-
-        String serviceEndpointInterface = (String) seis.iterator().next();
-        modelInfo.setInterfaceName(serviceEndpointInterface);
-
-        addNamespaceMappingRegistry(modelInfo, mappingDesc);
-
-        return modelInfo;
-    }
-
-    private boolean keepJaxrpcGeneratedFile(String fileType, Descriptor desc) {
-        boolean keep = true;
-        if( (fileType.equals(GeneratorConstants.FILE_TYPE_WSDL) ||
-                fileType.equals(GeneratorConstants.FILE_TYPE_REMOTE_INTERFACE)) ) {
-            keep = false;
-        } else if( fileType.equals(GeneratorConstants.FILE_TYPE_SERVICE ) ) {
-            // Only keep the service interface if this is a service reference
-            // with generic service interface.  In this case, the interface
-            // is generated during deployment instead of being packaged in
-            // the module.
-            keep = (desc instanceof ServiceReferenceDescriptor) &&
-                    ((ServiceReferenceDescriptor)desc).hasGenericServiceInterface();
-        }
-
-        return keep;
-    }
-
-    // dummy file for jax-rpc wscompile bug
-    File dummyConfigFile=null;
-
-    private String[] createJaxrpcCompileArgs(boolean generateTies,
-        boolean forceRegen) throws IOException {
-        
-        int numJaxrpcArgs = 11;
-        if (logger.isLoggable(Level.FINE) ) {
-            numJaxrpcArgs = 16;
-        }
-        if (forceRegen) {
-            numJaxrpcArgs--;
-        }
-
-        // If we need to run wscompile more than once per .ear or
-        // standalone module, use the -infix option to reduce the
-        // chances that generated non-portable jaxrpc artifacts will clash
-        // with generated artifacts from other service-refs and endpoints
-        // loaded by the same classloader at runtime.   
-        wscompileInvocationCount++;
-        String infix = null;
-
-        if( wscompileInvocationCount > 1 ) {
-            numJaxrpcArgs++;
-            infix = wscompileInvocationCount + "";
-        }
-
-        String[] jaxrpcArgs = new String[numJaxrpcArgs];
-        int jaxrpcCnt = 0;
-
-        if( dummyConfigFile == null ) {
-            dummyConfigFile = File.createTempFile("dummy_wscompile_config",
-                    "config");
-            dummyConfigFile.deleteOnExit();
-        }
-
-        // wscompile doesn't support the -extdirs option, so the best we
-        // can do is prepend the ext dir jar files to the classpath.
-        String optionalDependencyClassPath =
-                InstalledLibrariesResolver.getExtDirFilesAsClasspath();
-        if(optionalDependencyClassPath.length() > 0) {
-            moduleClassPath = optionalDependencyClassPath +
-                    File.pathSeparatorChar + moduleClassPath;
-        }
-        
-        // Could also check if getSourceDir() ends in 'war,' but
-        // this is a little more general.
-        String moduleBasePath = context.getSourceDir().getAbsolutePath();
-        String moduleWebInfPath = moduleBasePath +
-            File.separatorChar + "WEB-INF" +
-            File.separatorChar + "classes";
-        File moduleWebInfFile = new File(moduleWebInfPath);
-        if (moduleWebInfFile.exists()) {
-            moduleClassPath = moduleWebInfPath +
-                File.pathSeparatorChar + moduleClassPath;
-        } else {
-            moduleClassPath = moduleBasePath +
-                File.pathSeparatorChar + moduleClassPath;
-        }
-        
-        if (!context.getScratchDir("ejb").mkdirs() && logger.isLoggable(Level.FINE)) {
-            logger.log(Level.FINE, LogUtils.DIR_EXISTS, context.getScratchDir("ejb"));
-        }
-
-        jaxrpcArgs[jaxrpcCnt++] = generateTies ? "-gen:server" : "-gen:client";
-
-        // Prevent wscompile from regenerating portable classes that are
-        // already packaged within the deployed application.
-        if (!forceRegen) {
-            jaxrpcArgs[jaxrpcCnt++] = "-f:donotoverride";
-        }
-
-        if( infix != null ) {
-            jaxrpcArgs[jaxrpcCnt++] = "-f:infix:" + infix;
-        }
-
-        jaxrpcArgs[jaxrpcCnt++] = "-classpath";
-        jaxrpcArgs[jaxrpcCnt++] = moduleClassPath;
-
-        if (logger.isLoggable(Level.FINE)) {
-            long timeStamp = System.currentTimeMillis();
-            jaxrpcArgs[jaxrpcCnt++] = "-Xdebugmodel:" +
-                    context.getScratchDir("ejb") + File.separator + "debugModel.txt." +
-                    timeStamp;
-            jaxrpcArgs[jaxrpcCnt++] = "-Xprintstacktrace";
-            jaxrpcArgs[jaxrpcCnt++] = "-model";
-            jaxrpcArgs[jaxrpcCnt++] =
-                    context.getScratchDir("ejb") + File.separator + "debugModel.model" +
-                            timeStamp;
-            jaxrpcArgs[jaxrpcCnt++] = "-verbose";
-        }
-
-        jaxrpcArgs[jaxrpcCnt++] = "-s";
-        jaxrpcArgs[jaxrpcCnt++] = context.getScratchDir("ejb").getAbsolutePath();
-        jaxrpcArgs[jaxrpcCnt++] = "-d";
-        jaxrpcArgs[jaxrpcCnt++] = context.getScratchDir("ejb").getAbsolutePath();
-        jaxrpcArgs[jaxrpcCnt++] = "-keep";
-        jaxrpcArgs[jaxrpcCnt++] = "-g";
-
-        // config file is not used, but it must be an existing file or it
-        // will not pass CompileTool argument validation.
-        jaxrpcArgs[jaxrpcCnt++] = dummyConfigFile.getPath();
-
-        if ( logger.isLoggable(Level.FINE)) {
-            for ( int i = 0; i < jaxrpcArgs.length; i++ ) {
-                logger.fine(jaxrpcArgs[i]);
-            }
-        }
-
-        return jaxrpcArgs;
-    }
-
-    private void jaxrpc(String[] args, WsCompile wsCompile, Descriptor desc,
-                        ArrayList<String> files)
-            throws Exception {
-
-        try {
-            if (logger.isLoggable(Level.FINE)) {
-                debug("---> ARGS = ");
-                for (int i = 0; i < args.length; i++) {
-                    logger.fine(args[i] + "; ");
-                }
-            }
-            boolean compiled = wsCompile.getCompileTool().run(args);
-            done(wsCompile.getCompileTool());
-            if( compiled ) {
-                Iterator generatedFiles =
-                        wsCompile.getGeneratedFiles().iterator();
-
-                while(generatedFiles.hasNext()) {
-                    GeneratedFileInfo next = (GeneratedFileInfo)
-                            generatedFiles.next();
-                    String fileType = next.getType();
-                    File file = next.getFile();
-                    String origPath = file.getPath();
-                    if( origPath.endsWith(".java") ) {
-                        int javaIndex = origPath.lastIndexOf(".java");
-                        String newPath = origPath.substring(0, javaIndex) +
-                                ".class";
-                        if( keepJaxrpcGeneratedFile(fileType, desc) ) {
-                            files.add(newPath);
-                        }
-                    }
-                }
-            } else {
-                throw new Exception("jaxrpc compilation exception");
-            }
-        } catch (Throwable t) {
-            Exception ge =
-                    new Exception(t.getMessage());
-            ge.initCause(t);
-            throw ge;
-        }
-    }
-
-    private void jaxrpcWebService(WebService webService, ArrayList<String> files)
-            throws Exception {
-
-        if((webService.getWsdlFileUrl() == null) ||
-                (webService.getMappingFileUri() == null)) {
-            throw new Exception(localStrings.getLocalString(
-                    "enterprise.webservice.jaxrpcFilesNotFound",
-                    "Service {0} seems to be a JAXRPC based web service but without "+
-                            "the mandatory WSDL and Mapping file. Deployment cannot proceed",
-                    new Object[] {webService.getName()}));
-        }
-        ModelInfo modelInfo = createModelInfo(webService);
-        String args[] = createJaxrpcCompileArgs(true, false);
-
-        CompileTool wscompile =
-                rpcFactory.createCompileTool(System.out, "wscompile");
-        wscompileForWebServices = wscompile;
-        WsCompile delegate = new WsCompile(wscompile, webService);
-        delegate.setModelInfo(modelInfo);
-        wscompile.setDelegate(delegate);
-
-        jaxrpc(args, delegate, webService, files);
-    }
-
-    private void debug(String msg) {
-        if (logger.isLoggable(Level.FINE) ) {
-            logger.fine("[JaxRpcRICodegen] --> " + msg);
-        }
-    }
-
-    /*
-     * The run() method calls visit() on the entire application.
-     * If this is being called in the context of a submodule within
-     * the application, then accept(WebService) will be called
-     * for every web service in the app, not just in the current
-     * module. We want to ignore the unrelated web services --
-     * they will be handled when their module is loaded.
-     */
-    private boolean webServiceInContext(WebService webService) {
-        BundleDescriptor contextBundleDescriptor =
-            context.getModuleMetaData(BundleDescriptor.class);
-        String moduleId = contextBundleDescriptor.getModuleID();
-        return moduleId.equals(webService.getBundleDescriptor().getModuleID());
-    }
-
-    public void accept (BundleDescriptor descriptor) {
-        if (descriptor instanceof Application) {
-            Application application = (Application)descriptor;
-            for (BundleDescriptor ebd : application.getBundleDescriptorsOfType(DOLUtils.ejbType())) {
-                ebd.visit(getSubDescriptorVisitor(ebd));
-            }
-
-            for (BundleDescriptor wbd : application.getBundleDescriptorsOfType(DOLUtils.warType())) {
-                if (wbd != null) {
-                    wbd.visit(getSubDescriptorVisitor(wbd));
-                }
-            }
-
-            for (BundleDescriptor acd : application.getBundleDescriptorsOfType(DOLUtils.carType())) {
-                acd.visit(getSubDescriptorVisitor(acd));
-            }
-        } else {
-            super.accept(descriptor);
-        }
-    }
-
-
-    /**
-     * visit an application object
-     * @param the application descriptor
-     */
-    public void accept(Application application) {
-    }
-
-    /**
-     * visits an ejb bundle descriptor
-     * @param an ejb bundle descriptor
-     */
-    public void accept(EjbBundleDescriptor bundleDescriptor) {
-    }
-
-
-    /**
-     * visits a appclient descriptor
-     * @param appclientdescriptor
-     * get the visitor for its sub descriptor
-     * @param sub descriptor to return visitor for
-     */
-    public void accept(ApplicationClientDescriptor appclientdescriptor) {
-    }
-
-    /**
-     * visit a web bundle descriptor
-     *
-     * @param the web bundle descriptor
-     */
-    public void accept(WebBundleDescriptor descriptor) {
-    }
-}
diff --git a/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/monitoring/GlobalMessageListener.java b/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/monitoring/GlobalMessageListener.java
index 294446f..105d655 100644
--- a/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/monitoring/GlobalMessageListener.java
+++ b/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/monitoring/GlobalMessageListener.java
@@ -40,22 +40,6 @@
     public String preProcessRequest(Endpoint endpoint);
 
     /**
-     * Callback when a 1.X web service request is about the be delivered to the
-     * Web Service Implementation Bean.
-     * @param mid message ID returned by preProcessRequest call
-     * @param ctx the jaxrpc message trace, transport dependent
-     */
-    public void processRequest(String mid, com.sun.xml.rpc.spi.runtime.SOAPMessageContext ctx, TransportInfo info);
-
-    /**
-     * Callback when a 1.X web service response was returned by the Web Service
-     * Implementation Bean
-     * @param mid message ID returned by the preProcessRequest call
-     * @param ctx jaxrpc message trace, transport dependent.
-     */
-    public void processResponse(String mid, com.sun.xml.rpc.spi.runtime.SOAPMessageContext ctx);
-   
-    /**
      * Callback when a 2.X web service request is about the be delivered to the
      * Web Service Implementation Bean.
      * @param mid message ID returned by preProcessRequest call
diff --git a/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/monitoring/JAXRPCEndpointImpl.java b/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/monitoring/JAXRPCEndpointImpl.java
deleted file mode 100644
index 5eacedf..0000000
--- a/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/monitoring/JAXRPCEndpointImpl.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * Copyright (c) 1997, 2018 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-/*
- * JAXRPCEndpointImpl.java
- */
-
-package org.glassfish.webservices.monitoring;
-
-import com.sun.xml.rpc.spi.runtime.SOAPMessageContext;
-import com.sun.xml.rpc.spi.runtime.SystemHandlerDelegate;
-import java.util.logging.Level;
-import org.glassfish.webservices.LogUtils;
-
-/**
- * Implementation of the JAXRPC endpoint interface and JAXRPC System Handler Delegate
- *
- * @author Jerome Dochez
- */
-public class JAXRPCEndpointImpl extends EndpointImpl implements SystemHandlerDelegate {
-    
-    SystemHandlerDelegate parent = null;
-    
-    /** Creates a new instance of EndpointImpl */
-    JAXRPCEndpointImpl(String endpointSelector, EndpointType type) {
-        super(endpointSelector, type);
-    }
-    
-    public boolean processRequest(SOAPMessageContext messageContext) {
-
-	boolean status = true;
-
-        if (parent!=null) {
-            status = parent.processRequest(messageContext);
-        }
-
-        // let's get our thread local context
-        WebServiceEngineImpl wsEngine = WebServiceEngineImpl.getInstance();
-        try {
-            if (!listeners.isEmpty() || wsEngine.hasGlobalMessageListener()) {
-                
-                // someone is listening
-                ThreadLocalInfo config = 
-                        (ThreadLocalInfo) wsEngine.getThreadLocal().get();
-
-                // do we have a global listener ?
-                if (config!=null && config.getMessageId()!=null) {
-                    HttpRequestInfoImpl info = new HttpRequestInfoImpl(config.getRequest());
-                    wsEngine.processRequest(config.getMessageId(), messageContext, info);
-                } 
-                
-                // any local listeners ?
-                if (!listeners.isEmpty()) {
-                    if (config==null) {
-                        config = new ThreadLocalInfo(null, null);
-                    }
-                    // create the message trace and save it to our thread local
-                    MessageTraceImpl request = new MessageTraceImpl();
-                    request.setEndpoint(this);
-                    request.setMessageContext(messageContext);
-                    if (config.getRequest()!=null) {
-                        request.setTransportInfo(new HttpRequestInfoImpl(config.getRequest()));
-                    }
-                    
-                    config.setRequestMessageTrace(request);
-                }
-                
-            }
-	    } catch(Throwable t) {
-                WebServiceEngineImpl.sLogger.log(Level.WARNING, LogUtils.EXCEPTION_TRACING_REQUEST, t.getMessage());
-	        RuntimeException re;
-            if (t instanceof RuntimeException) {
-		        re = (RuntimeException) t;
-	        } else {
-		        re = new RuntimeException(t);
-	        }
-	        throw re;
-        }        
-        return status;
-    }
-
-    public void processResponse(SOAPMessageContext messageContext) {   
-
-        // let's get our thread local context
-        WebServiceEngineImpl wsEngine = WebServiceEngineImpl.getInstance();
-        try {
-            
-            if (wsEngine.hasGlobalMessageListener() || !listeners.isEmpty()) {
-                
-                // someone is listening
-                ThreadLocalInfo config = 
-                        (ThreadLocalInfo) wsEngine.getThreadLocal().get();
-
-                if (config!=null) {                    
-                    // do we have a global listener ?
-                    if (config.getMessageId()!=null) {
-                        wsEngine.processResponse(config.getMessageId(),  messageContext);
-                    }
-
-                    // local listeners
-                    if (!listeners.isEmpty()) {
-                        MessageTraceImpl response = new MessageTraceImpl();
-                        response.setEndpoint(this);
-                        response.setMessageContext(messageContext);
-                        for (MessageListener listener : listeners) {                    
-                            listener.invocationProcessed(config.getRequestMessageTrace(), response);
-                        }   
-                    }
-                }
-            }
-            // cleanup
-            wsEngine.getThreadLocal().remove();
-            
-	        // do security after tracing
-	        if (parent!=null) {
-		    parent.processResponse(messageContext);
-	            }
-        
-        } catch(Throwable t) {
-            WebServiceEngineImpl.sLogger.log(Level.WARNING, LogUtils.EXCEPTION_TRACING_RESPONSE, t.getMessage());
-	        RuntimeException re;
-	        if (t instanceof RuntimeException) {
-		        re = (RuntimeException) t;
-	        } else {
-		        re = new RuntimeException(t);
-	        }
-	        throw re;
-        }                 
-    }
-    
-    public void setParent(SystemHandlerDelegate parent) {
-        this.parent = parent;
-    }        
-}
diff --git a/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/monitoring/MessageTraceImpl.java b/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/monitoring/MessageTraceImpl.java
index 88774eb..d12a421 100644
--- a/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/monitoring/MessageTraceImpl.java
+++ b/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/monitoring/MessageTraceImpl.java
@@ -80,17 +80,6 @@
         return source;
     }
     
-    public void setMessageContext(com.sun.xml.rpc.spi.runtime.SOAPMessageContext soapMessageCtx) {
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        try {
-            soapMessageCtx.getMessage().writeTo(baos);
-        } catch(Exception e) {
-            WebServiceEngineImpl.sLogger.log(Level.WARNING, LogUtils.CANNOT_LOG_SOAPMSG, e.getMessage());
-        }
-
-        soapMessage = baos.toString();
-    }    
-    
     public void setMessageContext(SOAPMessageContext soapMessageCtx) {
         ByteArrayOutputStream baos = new ByteArrayOutputStream();        
         try {
diff --git a/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/monitoring/WebServiceEngineImpl.java b/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/monitoring/WebServiceEngineImpl.java
index a3fda66..796c04f 100644
--- a/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/monitoring/WebServiceEngineImpl.java
+++ b/appserver/webservices/jsr109-impl/src/main/java/org/glassfish/webservices/monitoring/WebServiceEngineImpl.java
@@ -85,15 +85,6 @@
         return newEndpoint;
     }
     
-    public EndpointImpl createHandler(com.sun.xml.rpc.spi.runtime.SystemHandlerDelegate parent,
-        WebServiceEndpoint endpointDesc)  {
-
-        EndpointImpl newEndpoint = createHandler(endpointDesc);
-        if (newEndpoint instanceof JAXRPCEndpointImpl)
-            JAXRPCEndpointImpl.class.cast(newEndpoint).setParent(parent);
-        return newEndpoint;
-    }
-
     @Override
     public Endpoint getEndpoint(String uri) {    
         return endpoints.get(uri);
@@ -174,15 +165,7 @@
                 endpointType = EndpointType.SERVLET_ENDPOINT;
             }
 
-            EndpointImpl newEndpoint;
-            // At this point, we can depend on presence of mapping file to distinguish between JAXRPC and JAXWS
-            // service
-            if(endpoint.getWebService().hasMappingFile()) {
-                newEndpoint = new JAXRPCEndpointImpl(endpointURL, endpointType);
-            } else {
-                newEndpoint = new JAXWSEndpointImpl(endpointURL, endpointType);
-            }
-
+            EndpointImpl newEndpoint = new JAXWSEndpointImpl(endpointURL, endpointType);
             newEndpoint.setDescriptor(endpoint);
             return newEndpoint;
         
@@ -206,35 +189,6 @@
         return globalMessageListener.preProcessRequest(endpoint);
     }
     
-    /**
-     * Callback when a web service request is received on
-     * the endpoint.
-     * @param messageID returned by preProcessRequest call
-     * @param context the jaxrpc message trace, transport dependent.
-     */
-    public void processRequest(String messageID, com.sun.xml.rpc.spi.runtime.SOAPMessageContext context,
-            TransportInfo info) {
-
-        if (globalMessageListener==null)
-            return;
-
-        globalMessageListener.processRequest(messageID, context, info);
-    }
-
-    /**
-     * Callback when a web service response is received on the
-     * endpoint.
-     * @param messageID returned by the preProcessRequest call
-     * @param context jaxrpc message context
-     */
-    public void processResponse(String messageID, com.sun.xml.rpc.spi.runtime.SOAPMessageContext context) {
-
-        if (globalMessageListener==null)
-            return;
-
-        globalMessageListener.processResponse(messageID, context);
-    }
-    
     /** 
      * Callback when a 2.0 web service request is received on 
      * the endpoint.
diff --git a/appserver/webservices/webservices-scripts/src/main/resources/glassfish/bin/schemagen b/appserver/webservices/webservices-scripts/src/main/resources/glassfish/bin/schemagen
index bdfa457..28e00a1 100644
--- a/appserver/webservices/webservices-scripts/src/main/resources/glassfish/bin/schemagen
+++ b/appserver/webservices/webservices-scripts/src/main/resources/glassfish/bin/schemagen
@@ -1,6 +1,6 @@
 #!/bin/sh
 #
-# Copyright (c) 1997, 2018 Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 1997, 2020 Oracle and/or its affiliates. All rights reserved.
 #
 # This program and the accompanying materials are made available under the
 # terms of the Eclipse Public License v. 2.0, which is available at
@@ -30,4 +30,4 @@
     JAVA=${AS_JAVA}/bin/java
 fi
 
-exec "$JAVA" -Djava.endorsed.dirs="$AS_INSTALL_LIB/endorsed" -cp "$AS_INSTALL_LIB/webservices-osgi.jar:$AS_INSTALL_LIB/jakarta.xml.rpc-api.jar:$AS_INSTALL_LIB/jaxb-osgi.jar" com.sun.tools.jxc.SchemaGeneratorFacade "$@"
+exec "$JAVA" -Djava.endorsed.dirs="$AS_INSTALL_LIB/endorsed" -cp "$AS_INSTALL_LIB/webservices-osgi.jar:$AS_INSTALL_LIB/jaxb-osgi.jar" com.sun.tools.jxc.SchemaGeneratorFacade "$@"
diff --git a/appserver/webservices/webservices-scripts/src/main/resources/glassfish/bin/schemagen.bat b/appserver/webservices/webservices-scripts/src/main/resources/glassfish/bin/schemagen.bat
index 5d60325..9f85e0e 100644
--- a/appserver/webservices/webservices-scripts/src/main/resources/glassfish/bin/schemagen.bat
+++ b/appserver/webservices/webservices-scripts/src/main/resources/glassfish/bin/schemagen.bat
@@ -1,7 +1,7 @@
 @echo off
 
 REM
-REM  Copyright (c) 2018 Oracle and/or its affiliates. All rights reserved.
+REM  Copyright (c) 2018, 2020 Oracle and/or its affiliates. All rights reserved.
 REM
 REM  This program and the accompanying materials are made available under the
 REM  terms of the Eclipse Public License v. 2.0, which is available at
@@ -33,4 +33,4 @@
 set JAVA=java
 
 :run
-%JAVA% -Djava.endorsed.dirs="%~dp0..\modules\endorsed" -cp "%~dp0..\modules\webservices-osgi.jar;%~dp0..\modules\jakarta.xml.rpc-api.jar;%~dp0..\modules\jaxb-osgi.jar" com.sun.tools.jxc.SchemaGeneratorFacade %*
+%JAVA% -Djava.endorsed.dirs="%~dp0..\modules\endorsed" -cp "%~dp0..\modules\webservices-osgi.jar;%~dp0..\modules\jaxb-osgi.jar" com.sun.tools.jxc.SchemaGeneratorFacade %*
diff --git a/appserver/webservices/webservices-scripts/src/main/resources/glassfish/bin/wscompile b/appserver/webservices/webservices-scripts/src/main/resources/glassfish/bin/wscompile
deleted file mode 100644
index 46a3525..0000000
--- a/appserver/webservices/webservices-scripts/src/main/resources/glassfish/bin/wscompile
+++ /dev/null
@@ -1,34 +0,0 @@
-#!/bin/sh
-#
-# Copyright (c) 1997, 2018 Oracle and/or its affiliates. All rights reserved.
-#
-# This program and the accompanying materials are made available under the
-# terms of the Eclipse Public License v. 2.0, which is available at
-# http://www.eclipse.org/legal/epl-2.0.
-#
-# This Source Code may also be made available under the following Secondary
-# Licenses when the conditions for such availability set forth in the
-# Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
-# version 2 with the GNU Classpath Exception, which is available at
-# https://www.gnu.org/software/classpath/license.html.
-#
-# SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
-#
-
-AS_INSTALL=`dirname "$0"`/..
-
-case "`uname`" in
-  CYGWIN*) AS_INSTALL=`cygpath --windows $AS_INSTALL`
-esac
-
-AS_INSTALL_LIB="$AS_INSTALL/modules"
-JAVAX_MAIL_JAR=$AS_INSTALL_LIB/jakarta.mail.jar
-. "${AS_INSTALL}/config/asenv.conf"
-JAVA=java
-
-#Depends upon Java from ../config/asenv.conf
-if [ ${AS_JAVA} ]; then
-    JAVA=${AS_JAVA}/bin/java
-fi
-
-exec "$JAVA" $WSCOMPILE_OPTS -Djava.endorsed.dirs="$AS_INSTALL_LIB/endorsed" -cp "$AS_INSTALL_LIB/webservices-osgi.jar:$AS_INSTALL_LIB/jakarta.xml.rpc-api.jar:$AS_INSTALL_LIB/jaxb-osgi.jar:$JAVAX_MAIL_JAR:$JAVA_HOME/lib/tools.jar:$AS_INSTALL_LIB/aixporting-repackaged.jar" com.sun.xml.rpc.tools.wscompile.Main "$@"
diff --git a/appserver/webservices/webservices-scripts/src/main/resources/glassfish/bin/wscompile.bat b/appserver/webservices/webservices-scripts/src/main/resources/glassfish/bin/wscompile.bat
deleted file mode 100644
index a24cff4..0000000
--- a/appserver/webservices/webservices-scripts/src/main/resources/glassfish/bin/wscompile.bat
+++ /dev/null
@@ -1,36 +0,0 @@
-@echo off
-
-REM
-REM  Copyright (c) 2018 Oracle and/or its affiliates. All rights reserved.
-REM
-REM  This program and the accompanying materials are made available under the
-REM  terms of the Eclipse Public License v. 2.0, which is available at
-REM  http://www.eclipse.org/legal/epl-2.0.
-REM
-REM  This Source Code may also be made available under the following Secondary
-REM  Licenses when the conditions for such availability set forth in the
-REM  Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
-REM  version 2 with the GNU Classpath Exception, which is available at
-REM  https://www.gnu.org/software/classpath/license.html.
-REM
-REM  SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
-REM
-
-
-VERIFY OTHER 2>nul
-setlocal ENABLEEXTENSIONS
-if ERRORLEVEL 0 goto ok
-echo "Unable to enable extensions"
-exit /B 1
-
-:ok
-call "%~dp0..\config\asenv.bat"
-if "%AS_JAVA%x" == "x" goto UsePath
-set JAVA="%AS_JAVA%\bin\java"
-goto run
-
-:UsePath
-set JAVA=java
-
-:run
-%JAVA% %WSCOMPILE_OPTS% -Djava.endorsed.dirs="%~dp0..\modules\endorsed" -cp "%~dp0..\modules\webservices-osgi.jar;%~dp0..\modules\jakarta.xml.rpc-api.jar;%~dp0..\modules\jaxb-osgi.jar;%~dp0..\modules\jakarta.mail.jar;%JAVA_HOME%/lib/tools.jar" com.sun.xml.rpc.tools.wscompile.Main %*
diff --git a/appserver/webservices/webservices-scripts/src/main/resources/glassfish/bin/wsdeploy b/appserver/webservices/webservices-scripts/src/main/resources/glassfish/bin/wsdeploy
deleted file mode 100644
index 144fe72..0000000
--- a/appserver/webservices/webservices-scripts/src/main/resources/glassfish/bin/wsdeploy
+++ /dev/null
@@ -1,34 +0,0 @@
-#!/bin/sh
-#
-# Copyright (c) 1997, 2018 Oracle and/or its affiliates. All rights reserved.
-#
-# This program and the accompanying materials are made available under the
-# terms of the Eclipse Public License v. 2.0, which is available at
-# http://www.eclipse.org/legal/epl-2.0.
-#
-# This Source Code may also be made available under the following Secondary
-# Licenses when the conditions for such availability set forth in the
-# Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
-# version 2 with the GNU Classpath Exception, which is available at
-# https://www.gnu.org/software/classpath/license.html.
-#
-# SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
-#
-
-AS_INSTALL=`dirname "$0"`/..
-
-case "`uname`" in
-  CYGWIN*) AS_INSTALL=`cygpath --windows $AS_INSTALL`
-esac
-
-AS_INSTALL_LIB="$AS_INSTALL/modules"
-JAVAX_MAIL_JAR=$AS_INSTALL_LIB/jakarta.mail.jar
-. "${AS_INSTALL}/config/asenv.conf"
-JAVA=java
-
-#Depends upon Java from ../config/asenv.conf
-if [ ${AS_JAVA} ]; then
-    JAVA=${AS_JAVA}/bin/java
-fi
-
-exec "$JAVA" -Djava.endorsed.dirs="$AS_INSTALL_LIB/endorsed" -cp "$AS_INSTALL_LIB/webservices-osgi.jar:$AS_INSTALL_LIB/jakarta.xml.rpc-api.jar:$AS_INSTALL_LIB/jaxb-osgi.jar:$JAVAX_MAIL_JAR:$JAVA_HOME/lib/tools.jar" com.sun.xml.rpc.tools.wsdeploy.Main "$@"
diff --git a/appserver/webservices/webservices-scripts/src/main/resources/glassfish/bin/wsdeploy.bat b/appserver/webservices/webservices-scripts/src/main/resources/glassfish/bin/wsdeploy.bat
deleted file mode 100644
index 6112d13..0000000
--- a/appserver/webservices/webservices-scripts/src/main/resources/glassfish/bin/wsdeploy.bat
+++ /dev/null
@@ -1,36 +0,0 @@
-@echo off
-
-REM
-REM  Copyright (c) 2018 Oracle and/or its affiliates. All rights reserved.
-REM
-REM  This program and the accompanying materials are made available under the
-REM  terms of the Eclipse Public License v. 2.0, which is available at
-REM  http://www.eclipse.org/legal/epl-2.0.
-REM
-REM  This Source Code may also be made available under the following Secondary
-REM  Licenses when the conditions for such availability set forth in the
-REM  Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
-REM  version 2 with the GNU Classpath Exception, which is available at
-REM  https://www.gnu.org/software/classpath/license.html.
-REM
-REM  SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
-REM
-
-
-VERIFY OTHER 2>nul
-setlocal ENABLEEXTENSIONS
-if ERRORLEVEL 0 goto ok
-echo "Unable to enable extensions"
-exit /B 1
-
-:ok
-call "%~dp0..\config\asenv.bat"
-if "%AS_JAVA%x" == "x" goto UsePath
-set JAVA="%AS_JAVA%\bin\java"
-goto run
-
-:UsePath
-set JAVA=java
-
-:run
-%JAVA% -Djava.endorsed.dirs="%~dp0..\modules\endorsed" -cp "%~dp0..\modules\webservices-osgi.jar;%~dp0..\modules\jakarta.xml.rpc-api.jar;%~dp0..\modules\jaxb-osgi.jar;%~dp0..\modules\jakarta.mail.jar;%JAVA_HOME%/lib/tools.jar" com.sun.xml.rpc.tools.wsdeploy.Main %*
diff --git a/appserver/webservices/webservices-scripts/src/main/resources/glassfish/bin/wsgen b/appserver/webservices/webservices-scripts/src/main/resources/glassfish/bin/wsgen
index 9eaff1b..b9aad0a 100644
--- a/appserver/webservices/webservices-scripts/src/main/resources/glassfish/bin/wsgen
+++ b/appserver/webservices/webservices-scripts/src/main/resources/glassfish/bin/wsgen
@@ -1,6 +1,6 @@
 #!/bin/sh
 #
-# Copyright (c) 1997, 2018 Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 1997, 2020 Oracle and/or its affiliates. All rights reserved.
 #
 # This program and the accompanying materials are made available under the
 # terms of the Eclipse Public License v. 2.0, which is available at
@@ -30,4 +30,4 @@
     JAVA=${AS_JAVA}/bin/java
 fi
 
-exec "$JAVA" $WSGEN_OPTS -Djava.endorsed.dirs="$AS_INSTALL_LIB/endorsed" -cp "$AS_INSTALL_LIB/webservices-osgi.jar:$AS_INSTALL_LIB/jakarta.xml.rpc-api.jar:$AS_INSTALL_LIB/jaxb-osgi.jar" com.sun.tools.ws.WsGen "$@"
+exec "$JAVA" $WSGEN_OPTS -Djava.endorsed.dirs="$AS_INSTALL_LIB/endorsed" -cp "$AS_INSTALL_LIB/webservices-osgi.jar:$AS_INSTALL_LIB/jaxb-osgi.jar" com.sun.tools.ws.WsGen "$@"
diff --git a/appserver/webservices/webservices-scripts/src/main/resources/glassfish/bin/wsgen.bat b/appserver/webservices/webservices-scripts/src/main/resources/glassfish/bin/wsgen.bat
index 4fdb31f..e7da256 100644
--- a/appserver/webservices/webservices-scripts/src/main/resources/glassfish/bin/wsgen.bat
+++ b/appserver/webservices/webservices-scripts/src/main/resources/glassfish/bin/wsgen.bat
@@ -1,7 +1,7 @@
 @echo off
 
 REM
-REM  Copyright (c) 2018 Oracle and/or its affiliates. All rights reserved.
+REM  Copyright (c) 2018, 2020 Oracle and/or its affiliates. All rights reserved.
 REM
 REM  This program and the accompanying materials are made available under the
 REM  terms of the Eclipse Public License v. 2.0, which is available at
@@ -33,4 +33,4 @@
 set JAVA=java
 
 :run
-%JAVA% %WSGEN_OPTS% -Djava.endorsed.dirs="%~dp0..\modules\endorsed" -cp "%~dp0..\modules\webservices-osgi.jar;%~dp0..\modules\jakarta.xml.rpc-api.jar;%~dp0..\modules\jaxb-osgi.jar" com.sun.tools.ws.WsGen %*
+%JAVA% %WSGEN_OPTS% -Djava.endorsed.dirs="%~dp0..\modules\endorsed" -cp "%~dp0..\modules\webservices-osgi.jar;%~dp0..\modules\jaxb-osgi.jar" com.sun.tools.ws.WsGen %*
diff --git a/appserver/webservices/webservices-scripts/src/main/resources/glassfish/bin/wsimport b/appserver/webservices/webservices-scripts/src/main/resources/glassfish/bin/wsimport
index 95410ea..ada6b23 100644
--- a/appserver/webservices/webservices-scripts/src/main/resources/glassfish/bin/wsimport
+++ b/appserver/webservices/webservices-scripts/src/main/resources/glassfish/bin/wsimport
@@ -1,6 +1,6 @@
 #!/bin/sh
 #
-# Copyright (c) 1997, 2018 Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 1997, 2020 Oracle and/or its affiliates. All rights reserved.
 #
 # This program and the accompanying materials are made available under the
 # terms of the Eclipse Public License v. 2.0, which is available at
@@ -30,4 +30,4 @@
     JAVA=${AS_JAVA}/bin/java
 fi
 
-exec "$JAVA" $WSIMPORT_OPTS -Djava.endorsed.dirs="$AS_INSTALL_LIB/endorsed" -cp "$AS_INSTALL_LIB/webservices-osgi.jar:$AS_INSTALL_LIB/jakarta.xml.rpc-api.jar:$AS_INSTALL_LIB/jaxb-osgi.jar" com.sun.tools.ws.WsImport "$@"
+exec "$JAVA" $WSIMPORT_OPTS -Djava.endorsed.dirs="$AS_INSTALL_LIB/endorsed" -cp "$AS_INSTALL_LIB/webservices-osgi.jar:$AS_INSTALL_LIB/jaxb-osgi.jar" com.sun.tools.ws.WsImport "$@"
diff --git a/appserver/webservices/webservices-scripts/src/main/resources/glassfish/bin/wsimport.bat b/appserver/webservices/webservices-scripts/src/main/resources/glassfish/bin/wsimport.bat
index 0c4d4a2..dd9e6c5 100644
--- a/appserver/webservices/webservices-scripts/src/main/resources/glassfish/bin/wsimport.bat
+++ b/appserver/webservices/webservices-scripts/src/main/resources/glassfish/bin/wsimport.bat
@@ -1,7 +1,7 @@
 @echo off
 
 REM
-REM  Copyright (c) 2018 Oracle and/or its affiliates. All rights reserved.
+REM  Copyright (c) 2018, 2020 Oracle and/or its affiliates. All rights reserved.
 REM
 REM  This program and the accompanying materials are made available under the
 REM  terms of the Eclipse Public License v. 2.0, which is available at
@@ -33,4 +33,4 @@
 set JAVA=java
 
 :run
-%JAVA% %WSIMPORT_OPTS% -Djava.endorsed.dirs="%~dp0..\modules\endorsed" -cp "%~dp0..\modules\webservices-osgi.jar;%~dp0..\modules\jakarta.xml.rpc-api.jar;%~dp0..\modules\jaxb-osgi.jar" com.sun.tools.ws.WsImport %*
+%JAVA% %WSIMPORT_OPTS% -Djava.endorsed.dirs="%~dp0..\modules\endorsed" -cp "%~dp0..\modules\webservices-osgi.jar;%~dp0..\modules\jaxb-osgi.jar" com.sun.tools.ws.WsImport %*
diff --git a/appserver/webservices/webservices-scripts/src/main/resources/glassfish/bin/xjc b/appserver/webservices/webservices-scripts/src/main/resources/glassfish/bin/xjc
index 147561b..8330b77 100644
--- a/appserver/webservices/webservices-scripts/src/main/resources/glassfish/bin/xjc
+++ b/appserver/webservices/webservices-scripts/src/main/resources/glassfish/bin/xjc
@@ -1,6 +1,6 @@
 #!/bin/sh
 #
-# Copyright (c) 1997, 2018 Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 1997, 2020 Oracle and/or its affiliates. All rights reserved.
 #
 # This program and the accompanying materials are made available under the
 # terms of the Eclipse Public License v. 2.0, which is available at
@@ -30,4 +30,4 @@
     JAVA=${AS_JAVA}/bin/java
 fi
 
-exec "$JAVA" -Djava.endorsed.dirs="$AS_INSTALL_LIB/endorsed" -cp "$AS_INSTALL_LIB/webservices-osgi.jar:$AS_INSTALL_LIB/jakarta.xml.rpc-api.jar:$AS_INSTALL_LIB/jaxb-osgi.jar" com.sun.tools.xjc.Driver "$@"
+exec "$JAVA" -Djava.endorsed.dirs="$AS_INSTALL_LIB/endorsed" -cp "$AS_INSTALL_LIB/webservices-osgi.jar:$AS_INSTALL_LIB/jaxb-osgi.jar" com.sun.tools.xjc.Driver "$@"
diff --git a/appserver/webservices/webservices-scripts/src/main/resources/glassfish/bin/xjc.bat b/appserver/webservices/webservices-scripts/src/main/resources/glassfish/bin/xjc.bat
index 022a436..589af17 100644
--- a/appserver/webservices/webservices-scripts/src/main/resources/glassfish/bin/xjc.bat
+++ b/appserver/webservices/webservices-scripts/src/main/resources/glassfish/bin/xjc.bat
@@ -1,7 +1,7 @@
 @echo off
 
 REM
-REM  Copyright (c) 2018 Oracle and/or its affiliates. All rights reserved.
+REM  Copyright (c) 2018, 2020 Oracle and/or its affiliates. All rights reserved.
 REM
 REM  This program and the accompanying materials are made available under the
 REM  terms of the Eclipse Public License v. 2.0, which is available at
@@ -33,4 +33,4 @@
 set JAVA=java
 
 :run
-%JAVA% -Djava.endorsed.dirs="%~dp0..\modules\endorsed" -cp "%~dp0..\modules\webservices-osgi.jar;%~dp0..\modules\jakarta.xml.rpc-api.jar;%~dp0..\modules\jaxb-osgi.jar" com.sun.tools.xjc.Driver %*
+%JAVA% -Djava.endorsed.dirs="%~dp0..\modules\endorsed" -cp "%~dp0..\modules\webservices-osgi.jar;%~dp0..\modules\jaxb-osgi.jar" com.sun.tools.xjc.Driver %*
