diff --git a/appserver/featuresets/debug/pom.xml b/appserver/featuresets/debug/pom.xml
index 03e577a..fd8c813 100644
--- a/appserver/featuresets/debug/pom.xml
+++ b/appserver/featuresets/debug/pom.xml
@@ -62,6 +62,27 @@
             <groupId>org.apache.felix</groupId>
             <artifactId>org.apache.felix.framework</artifactId>
         </dependency>
+        
+        <dependency>
+            <groupId>org.glassfish.grizzly</groupId>
+            <artifactId>grizzly-framework</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.glassfish.grizzly</groupId>
+            <artifactId>grizzly-portunif</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.glassfish.grizzly</groupId>
+            <artifactId>grizzly-http</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.glassfish.grizzly</groupId>
+            <artifactId>grizzly-http2</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.glassfish.grizzly</groupId>
+            <artifactId>grizzly-http-server</artifactId>
+        </dependency>
 
         <dependency>
             <groupId>org.glassfish.main.featuresets</groupId>
diff --git a/appserver/tests/tck/servlet/pom.xml b/appserver/tests/tck/servlet/pom.xml
new file mode 100644
index 0000000..2f4fd6e
--- /dev/null
+++ b/appserver/tests/tck/servlet/pom.xml
@@ -0,0 +1,320 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2021, 2022 Contributors to the Eclipse Foundation. 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
+
+-->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.glassfish.main.tests.tck</groupId>
+        <artifactId>tck</artifactId>
+        <version>7.0.0-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>glassfish-external-tck-servlet</artifactId>
+    <packaging>pom</packaging>
+
+    <name>TCK: servlet</name>
+
+    <properties>
+        <ant.home>${project.build.directory}/apache-ant-${ant.version}</ant.home>
+        <ant.zip.url>https://archive.apache.org/dist/ant/binaries/apache-ant-${ant.version}-bin.zip</ant.zip.url>
+        
+        <tck.home>${project.build.directory}/servlet-tck</tck.home>
+        <tck.tests.home>${tck.home}/src/com/sun/ts/tests</tck.tests.home> 
+         
+        <glassfish.home>${project.build.directory}/glassfish7</glassfish.home>
+        <glassfish.version>${project.version}</glassfish.version>
+        <glassfish.asadmin>${glassfish.home}/glassfish/bin/asadmin</glassfish.asadmin>
+       
+        <jacoco.includes>org/glassfish/**\:com/sun/enterprise/**</jacoco.includes>
+        
+        <port.admin>14848</port.admin>
+        <port.derby>11527</port.derby>
+        <port.http>18080</port.http>
+        <port.https>18181</port.https>
+        <port.jms>17676</port.jms>
+        <port.jmx>18686</port.jmx>
+        <port.orb>13700</port.orb>
+        <port.orb.mutual>13920</port.orb.mutual>
+        <port.orb.ssl>13820</port.orb.ssl>
+        <port.harness.log>12000</port.harness.log>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.glassfish.main.distributions</groupId>
+            <artifactId>glassfish</artifactId>
+            <version>${glassfish.version}</version>
+            <type>zip</type>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.glassfish.main.tests.tck</groupId>
+            <artifactId>jakarta-servlet-tck</artifactId>
+            <version>${project.version}</version>
+            <type>zip</type>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>com.googlecode.maven-download-plugin</groupId>
+                <artifactId>download-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>download-ant</id>
+                        <phase>generate-resources</phase>
+                        <goals>
+                            <goal>wget</goal>
+                        </goals>
+                    </execution>
+                </executions>
+                <configuration>
+                    <skip>${skipITs}</skip>
+                    <url>${ant.zip.url}</url>
+                    <unpack>true</unpack>
+                    <outputDirectory>${project.build.directory}</outputDirectory>
+                </configuration>
+            </plugin>
+
+            <plugin>
+                <artifactId>maven-dependency-plugin</artifactId>
+                <configuration>
+                    <skip>${skipITs}</skip>
+                </configuration>
+                <executions>
+                    <execution>
+                        <id>unpack-glassfish</id>
+                        <phase>pre-integration-test</phase>
+                        <goals>
+                            <goal>unpack-dependencies</goal>
+                        </goals>
+                        <configuration>
+                            <includeArtifactIds>glassfish</includeArtifactIds>
+                            <outputDirectory>${project.build.directory}</outputDirectory>
+                        </configuration>
+                    </execution>
+                    <execution>
+                        <id>unpack-tck</id>
+                        <phase>pre-integration-test</phase>
+                        <goals>
+                            <goal>unpack-dependencies</goal>
+                        </goals>
+                        <configuration>
+                            <includeArtifactIds>jakarta-servlet-tck</includeArtifactIds>
+                            <outputDirectory>${project.build.directory}</outputDirectory>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+
+            <plugin>
+                <artifactId>maven-antrun-plugin</artifactId>
+                <dependencies>
+                    <dependency>
+                        <groupId>org.apache.ant</groupId>
+                        <artifactId>ant</artifactId>
+                        <version>${ant.version}</version>
+                    </dependency>
+                    <dependency>
+                        <groupId>ant-contrib</groupId>
+                        <artifactId>ant-contrib</artifactId>
+                        <version>1.0b3</version>
+                        <exclusions>
+                            <exclusion>
+                                <groupId>ant</groupId>
+                                <artifactId>ant</artifactId>
+                            </exclusion>
+                        </exclusions>
+                    </dependency>
+                </dependencies>
+                <configuration>
+                    <skip>${skipITs}</skip>
+                </configuration>
+                <executions>
+                    <execution>
+                        <id>prepare-tck-and-glassfish</id>
+                        <phase>pre-integration-test</phase>
+                        <configuration>
+                            <target xmlns:if="ant:if" xmlns:unless="ant:unless">
+                                <taskdef resource="net/sf/antcontrib/antcontrib.properties" classpathref="maven.plugin.classpath" />
+                                         
+                                <macrodef name="tck-setting">
+                                    <attribute name="key" /> <attribute name="value" />
+                                    <sequential>
+                                      <replaceregexp file="${tck.home}/bin/ts.jte" byline="true"
+                                        match="@{key}=.*" replace="@{key}=@{value}" />
+                                    </sequential>
+                                </macrodef>
+                                
+
+                                <!-- Change configuration -->
+                                
+                                <tck-setting key="web.home" value="${glassfish.home}/glassfish"/>
+                                <tck-setting key="webServerHost" value="localhost"/>
+                                <tck-setting key="webServerPort" value="${port.http}"/>
+                                <tck-setting key="securedWebServicePort" value="${port.https}"/>
+                                
+                                <tck-setting key="s1as.admin.port" value="${port.admin}"/>
+                                <tck-setting key="glassfish.admin.port" value="${port.admin}"/>
+                                <tck-setting key="orb.port" value="${port.orb}"/>
+                                <tck-setting key="database.port" value="${port.derby}"/>
+                                <tck-setting key="harness.log.port" value="${port.harness.log}"/>
+                                
+                                <tck-setting key="report.dir" value="${tck.home}/servletreport/servlet"/>
+                                <tck-setting key="work.dir" value="${tck.home}/servletwork/servlet"/>
+                                
+                                <tck-setting key="impl.vi" value="glassfish"/>
+                          
+                                <limit maxwait="60">
+                                    <exec executable="${glassfish.asadmin}" dir="${glassfish.home}/glassfish/bin">
+                                        <arg value="delete-domain"/>
+                                        <arg value="domain1" />
+                                    </exec>
+                                    <exec executable="${glassfish.asadmin}" dir="${glassfish.home}/glassfish/bin">
+                                        <arg value="create-domain"/>
+                                        <arg value="--domainproperties=domain.adminPort=${port.admin}:domain.instancePort=${port.http}:http.ssl.port=${port.https}:jms.port=${port.jms}:domain.jmxPort=${port.jmx}:orb.listener.port=${port.orb}:orb.ssl.port=${port.orb.ssl}:orb.mutualauth.port=${port.orb.mutual}" />
+                                        <arg value="--user=admin" />
+                                        <arg value="--nopassword" />
+                                        <arg value="domain1" />
+                                    </exec>
+                                    <exec executable="${glassfish.asadmin}" dir="${glassfish.home}/glassfish/bin">
+                                        <arg value="start-domain"/>
+                                    </exec>
+
+                                    <if>
+                                        <isset property="jacoco.version" />
+                                        <then>
+                                            <exec executable="${glassfish.asadmin}" dir="${glassfish.home}/glassfish/bin">
+                                                <arg value="create-jvm-options" />
+                                                <arg value="--port=${port.admin}" />
+                                                <arg value="&quot;-javaagent\:${settings.localRepository}/org/jacoco/org.jacoco.agent/${jacoco.version}/org.jacoco.agent-${jacoco.version}-runtime.jar=destfile=${project.build.directory}/jacoco-it.exec,includes=${jacoco.includes}&quot;" />
+                                            </exec>
+                                        </then>
+                                    </if>
+                                    <exec executable="${glassfish.asadmin}" dir="${glassfish.home}/glassfish/bin">
+                                        <arg value="stop-domain"/>
+                                        <arg value="domain1"/>
+                                    </exec>
+                                </limit>
+                                <mkdir dir="${tck.home}/servlettckreport"/>
+                                <mkdir dir="${tck.home}/servlettckreport/servlettck"/>
+                                
+                                <replace file="${tck.home}/bin/xml/ts.top.import.xml">
+                                  <replacetoken><![CDATA[<jvmarg value="-Xmx512m"/>]]></replacetoken>
+                                  <replacevalue><![CDATA[<jvmarg value="-Xmx512m"/>
+                                <jvmarg value="-Djavatest.security.noSecurityManager=true"/>]]></replacevalue>
+                                </replace>
+                                
+                                <replace file="${tck.home}/bin/xml/ts.top.import.xml" if:set="suspend-tck" >
+                                  <replacetoken><![CDATA[<jvmarg value="-Xmx512m"/>]]></replacetoken>
+                                  <replacevalue><![CDATA[<jvmarg value="-Xmx512m"/>
+                                <jvmarg value="-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=9008"/>]]></replacevalue>
+                                </replace>
+                            </target>
+                        </configuration>
+                        <goals>
+                            <goal>run</goal>
+                        </goals>
+                    </execution>
+
+                    <execution>
+                        <id>configure-tck-tests</id>
+                        <phase>pre-integration-test</phase>
+                        <goals>
+                            <goal>run</goal>
+                        </goals>
+                        <configuration>
+                            <target xmlns:if="ant:if" xmlns:unless="ant:unless">
+                                <taskdef resource="net/sf/antcontrib/antcontrib.properties" classpathref="maven.plugin.classpath" />
+                                
+                                <!-- Start GlassFish -->
+                                <limit maxwait="20">
+                                    <exec executable="${glassfish.asadmin}" dir="${glassfish.home}/glassfish/bin">
+                                        <arg value="start-domain"/>
+                                        <arg value="--suspend" if:set="glassfish.suspend"/>
+                                    </exec>
+                                </limit>
+								
+								<exec executable="${ant.home}/bin/ant" dir="${tck.home}/bin">
+								    <arg value="-Dutil.dir=${tck.home}"  />
+                                    <arg value="config.security"  />
+                                </exec>
+                                
+                                <!-- Deploy single test -->
+                                <sequential if:set="run.test" >
+                                	<dirname property="test.dir" file="${tck.home}/src/${run.test}"/>
+                                	<echo>Deploying from ${test.dir}</echo>
+                                	
+                                	<exec executable="${ant.home}/bin/ant" dir="${test.dir}">
+                                    	<arg value="deploy"  />
+                                	</exec>
+                                </sequential>
+                                
+                                <!-- Deploy all tests -->
+                                <sequential unless:set="run.test" >
+                                	<exec executable="${ant.home}/bin/ant" dir="${tck.tests.home}">
+                                    	<arg value="deploy.all"  />
+                                	</exec>
+                                </sequential>
+                            </target>
+                        </configuration>
+                    </execution>
+
+                    <execution>
+                        <id>run-tck-tests</id>
+                        <phase>integration-test</phase>
+                        <goals>
+                            <goal>run</goal>
+                        </goals>
+                        <configuration>
+                            <target xmlns:if="ant:if" xmlns:unless="ant:unless">
+                                <taskdef resource="net/sf/antcontrib/antcontrib.properties" classpathref="maven.plugin.classpath" />
+
+                                <echo level="info" message="Start running all tests" />
+                                <exec executable="${ant.home}/bin/ant" dir="${tck.tests.home}" resultproperty="testResult">
+                                    <arg value="-Dmultiple.tests=${run.test}" if:set="run.test" />
+                                    <arg value="run.all" unless:set="run.test"/>
+                                    <arg value="runclient" if:set="run.test" />
+                                    <env key="LC_ALL" value="C" />
+                                </exec>
+
+                                <if>
+                                    <not>
+                                        <equals arg1="${testResult}" arg2="0" />
+                                    </not>
+                                    <then>
+                                        <echo message="Running tests failed." />
+                                        <loadfile property="contents" srcFile="${glassfish.home}/glassfish/domains/domain1/logs/server.log" />
+                                        <echo message="${contents}" />
+                                    </then>
+                                </if>
+
+                                <exec executable="${glassfish.asadmin}" dir="${glassfish.home}/glassfish/bin">
+                                    <arg value="stop-domain" />
+                                </exec>
+                            </target>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+</project>
diff --git a/appserver/tests/tck/tck-download/jakarta-servlet-tck/pom.xml b/appserver/tests/tck/tck-download/jakarta-servlet-tck/pom.xml
new file mode 100644
index 0000000..4afc4bc
--- /dev/null
+++ b/appserver/tests/tck/tck-download/jakarta-servlet-tck/pom.xml
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2021, 2022 Contributors to the Eclipse Foundation. 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
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"
+>
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.glassfish.main.tests.tck</groupId>
+        <artifactId>tck-download</artifactId>
+        <version>7.0.0-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>jakarta-servlet-tck</artifactId>
+    <packaging>pom</packaging>
+    <name>TCK: Install Jakarta servlet TCK</name>
+
+    <properties>
+    	<tck.test.servlet.file>jakarta-servlet-tck-6.0.0.zip</tck.test.servlet.file>
+        <tck.test.servlet.url>https://download.eclipse.org/ee4j/jakartaee-tck/jakartaee10/staged/eftl/${tck.test.servlet.file}</tck.test.servlet.url>
+    </properties>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>com.googlecode.maven-download-plugin</groupId>
+                <artifactId>download-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>download-servlet-tck</id>
+                        <phase>generate-resources</phase>
+                        <goals>
+                            <goal>wget</goal>
+                        </goals>
+                    </execution>
+                </executions>
+                <configuration>
+                    <url>${tck.test.servlet.url}</url>
+                    <unpack>false</unpack>
+                    <outputDirectory>${project.build.directory}</outputDirectory>
+                </configuration>
+            </plugin>
+            <plugin>
+                <artifactId>maven-install-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>install-servlet-tck</id>
+                        <phase>process-resources</phase>
+                        <goals>
+                            <goal>install-file</goal>
+                        </goals>
+                        <configuration>
+                            <file>${project.build.directory}/${tck.test.servlet.file}</file>
+                            <groupId>${project.groupId}</groupId>
+                            <artifactId>${project.artifactId}</artifactId>
+                            <version>${project.version}</version>
+                            <packaging>zip</packaging>
+                            <generatePom>true</generatePom>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/appserver/web/web-core/src/main/java/com/sun/enterprise/web/connector/grizzly/CoyoteConnectorLauncher.java b/appserver/web/web-core/src/main/java/com/sun/enterprise/web/connector/grizzly/CoyoteConnectorLauncher.java
index 4a0d797..1d15f6a 100644
--- a/appserver/web/web-core/src/main/java/com/sun/enterprise/web/connector/grizzly/CoyoteConnectorLauncher.java
+++ b/appserver/web/web-core/src/main/java/com/sun/enterprise/web/connector/grizzly/CoyoteConnectorLauncher.java
@@ -1,4 +1,5 @@
 /*
+ * Copyright (c) 2022, 2022 Contributors to the Eclipse Foundation
  * Copyright (c) 1997-2018 Oracle and/or its affiliates. All rights reserved.
  * Copyright 2004 The Apache Software Foundation
  *
@@ -25,68 +26,49 @@
 import org.glassfish.grizzly.http.server.HttpHandler;
 
 /**
- * Abstract the protocol implementation, including threading, etc.
- * Processor is single threaded and specific to stream-based protocols,
- * will not fit Jk protocols like JNI.
+ * Abstract the protocol implementation, including threading, etc. Processor is single threaded and specific to
+ * stream-based protocols, will not fit Jk protocols like JNI.
  *
  * @author Remy Maucherat
  * @author Costin Manolache
  */
-public class CoyoteConnectorLauncher implements ProtocolHandler
-{
-    // START SJSAS 6439313
-    protected boolean blocking = false;
-    // END SJSAS 6439313
+public class CoyoteConnectorLauncher implements ProtocolHandler {
+    protected boolean blocking;
 
     /**
-     * The <code>SelectorThread</code> implementation class. Not used when
-     * Coyote is used.
+     * The <code>SelectorThread</code> implementation class. Not used when Coyote is used.
      */
-    protected String selectorThreadImpl = null;
-
+    protected String selectorThreadImpl;
 
     public CoyoteConnectorLauncher() {
-        // START SJSAS 6439313
-        this(false,false,null);
+        this(false, false, null);
     }
 
-
-    public CoyoteConnectorLauncher(boolean secure, boolean blocking,
-                          String selectorThreadImpl) {
+    public CoyoteConnectorLauncher(boolean secure, boolean blocking, String selectorThreadImpl) {
         this.secure = secure;
         this.blocking = blocking;
         this.selectorThreadImpl = selectorThreadImpl;
     }
 
-
     public int getMaxHttpHeaderSize() {
         return maxHttpHeaderSize;
     }
 
-
     public void setMaxHttpHeaderSize(int valueI) {
         maxHttpHeaderSize = valueI;
         setAttribute("maxHttpHeaderSize", "" + valueI);
     }
 
-
-    /** Pass config info
+    /**
+     * Pass config info
      */
     @Override
-    public void setAttribute( String name, Object value ) {
-
+    public void setAttribute(String name, Object value) {
         attributes.put(name, value);
-/*
-        if ("maxKeepAliveRequests".equals(name)) {
-            maxKeepAliveRequests = Integer.parseInt((String) value.toString());
-        } else if ("port".equals(name)) {
-            setPort(Integer.parseInt((String) value.toString()));
-        }
-*/
     }
 
     @Override
-    public Object getAttribute( String key ) {
+    public Object getAttribute(String key) {
         return attributes.get(key);
     }
 
@@ -101,14 +83,15 @@
      * Get a property
      */
     public String getProperty(String name) {
-        return (String)getAttribute(name);
+        return (String) getAttribute(name);
     }
 
-    /** The adapter, used to call the connector
+    /**
+     * The adapter, used to call the connector
      */
     @Override
     public void setHandler(HttpHandler adapter) {
-        this.adapter=adapter;
+        this.adapter = adapter;
     }
 
     @Override
@@ -116,8 +99,8 @@
         return adapter;
     }
 
-
-    /** Start the protocol
+    /**
+     * Start the protocol
      */
     @Override
     public void init() throws Exception {
@@ -138,24 +121,22 @@
 
     // socket factory attributes ( XXX replace with normal setters )
     protected Map<String, Object> attributes = new HashMap<>();
-    protected String socketFactoryName=null;
-    protected String sslImplementationName=null;
+    protected String socketFactoryName = null;
+    protected String sslImplementationName = null;
 
-    private int maxKeepAliveRequests=100; // as in Apache HTTPD server
-    protected int timeout = 300000;    // 5 minutes as in Apache HTTPD server
+    private int maxKeepAliveRequests = 100; // as in Apache HTTPD server
+    protected int timeout = 300000; // 5 minutes as in Apache HTTPD server
     protected int maxPostSize = 2 * 1024 * 1024;
     protected int maxHttpHeaderSize = 4 * 1024;
     private String reportedname;
-    protected int socketCloseDelay=-1;
+    protected int socketCloseDelay = -1;
     protected boolean disableUploadTimeout = true;
     protected HttpHandler adapter;
 
-    // START OF SJSAS PE 8.1 6172948
     /**
      * The input request buffer size.
      */
     protected int requestBufferSize = 4096;
-    // END OF SJSAS PE 8.1 6172948
 
     /**
      * Compression value.
@@ -164,12 +145,11 @@
 
     // -------------------- Pool setup --------------------
 
-
     public String getSocketFactory() {
         return socketFactoryName;
     }
 
-    public void setSocketFactory( String valueS ) {
+    public void setSocketFactory(String valueS) {
         socketFactoryName = valueS;
         setAttribute("socketFactory", valueS);
     }
@@ -178,8 +158,8 @@
         return sslImplementationName;
     }
 
-    public void setSSLImplementation( String valueS) {
-        sslImplementationName=valueS;
+    public void setSSLImplementation(String valueS) {
+        sslImplementationName = valueS;
         setAttribute("sslImplementation", valueS);
     }
 
@@ -213,7 +193,7 @@
         return getProperty("keystore");
     }
 
-    public void setKeystore( String k ) {
+    public void setKeystore(String k) {
         setAttribute("keystore", k);
     }
 
@@ -221,20 +201,18 @@
         return getProperty("keypass");
     }
 
-    public void setKeypass( String k ) {
+    public void setKeypass(String k) {
         attributes.put("keypass", k);
-        //setAttribute("keypass", k);
     }
 
     public String getKeytype() {
         return getProperty("keystoreType");
     }
 
-    public void setKeytype( String k ) {
+    public void setKeytype(String k) {
         setAttribute("keystoreType", k);
     }
 
-    // START GlassFish Issue 657
     public void setTruststore(String truststore) {
         setAttribute("truststore", truststore);
     }
@@ -242,13 +220,12 @@
     public void setTruststoreType(String truststoreType) {
         setAttribute("truststoreType", truststoreType);
     }
-    // END GlassFish Issue 657
 
     public String getClientauth() {
         return getProperty("clientauth");
     }
 
-    public void setClientauth( String k ) {
+    public void setClientauth(String k) {
         setAttribute("clientauth", k);
     }
 
@@ -256,7 +233,7 @@
         return getProperty("protocol");
     }
 
-    public void setProtocol( String k ) {
+    public void setProtocol(String k) {
         setAttribute("protocol", k);
     }
 
@@ -272,7 +249,7 @@
         return getProperty("algorithm");
     }
 
-    public void setAlgorithm( String k ) {
+    public void setAlgorithm(String k) {
         setAttribute("algorithm", k);
     }
 
@@ -280,21 +257,19 @@
         return secure;
     }
 
-    public void setSecure( boolean b ) {
-        secure=b;
+    public void setSecure(boolean b) {
+        secure = b;
         setAttribute("secure", "" + b);
     }
 
-    // START SJSAS 6439313
     public boolean getBlocking() {
         return blocking;
     }
 
-    public void setBlocking( boolean b ) {
-        blocking=b;
+    public void setBlocking(boolean b) {
+        blocking = b;
         setAttribute("blocking", "" + b);
     }
-    // END SJSAS 6439313
 
     public String getCiphers() {
         return getProperty("ciphers");
@@ -316,7 +291,8 @@
         return maxKeepAliveRequests;
     }
 
-    /** Set the maximum number of Keep-Alive requests that we will honor.
+    /**
+     * Set the maximum number of Keep-Alive requests that we will honor.
      */
     public void setMaxKeepAliveRequests(int mkar) {
         maxKeepAliveRequests = mkar;
@@ -327,15 +303,13 @@
         return socketCloseDelay;
     }
 
-    public void setSocketCloseDelay( int d ) {
-        socketCloseDelay=d;
+    public void setSocketCloseDelay(int d) {
+        socketCloseDelay = d;
         setAttribute("socketCloseDelay", "" + d);
     }
 
-    protected static ServerSocketFactory string2SocketFactory(String val)
-        throws ClassNotFoundException, IllegalAccessException, InstantiationException {
-        Class chC = Class.forName(val);
-        return (ServerSocketFactory) chC.newInstance();
+    protected static ServerSocketFactory string2SocketFactory(String val) throws ReflectiveOperationException, IllegalArgumentException, SecurityException {
+        return (ServerSocketFactory) Class.forName(val).getDeclaredConstructor().newInstance();
     }
 
     public int getTimeout() {
@@ -355,7 +329,6 @@
         reportedname = reportedName;
     }
 
-    // START OF SJSAS PE 8.1 6172948
     /**
      * Set the request input buffer size
      */
@@ -363,12 +336,10 @@
         this.requestBufferSize = requestBufferSize;
     }
 
-
     /**
      * Return the request input buffer size
      */
-    public int getBufferSize(){
+    public int getBufferSize() {
         return requestBufferSize;
     }
-    // END OF SJSAS PE 8.1 6172948
 }
diff --git a/appserver/web/web-core/src/main/java/com/sun/enterprise/web/connector/grizzly/DummyConnectorLauncher.java b/appserver/web/web-core/src/main/java/com/sun/enterprise/web/connector/grizzly/DummyConnectorLauncher.java
index c13dd4f..c18daa5 100644
--- a/appserver/web/web-core/src/main/java/com/sun/enterprise/web/connector/grizzly/DummyConnectorLauncher.java
+++ b/appserver/web/web-core/src/main/java/com/sun/enterprise/web/connector/grizzly/DummyConnectorLauncher.java
@@ -1,4 +1,5 @@
 /*
+ * Copyright (c) 2022, 2022 Contributors to the Eclipse Foundation
  * Copyright (c) 1997-2018 Oracle and/or its affiliates. All rights reserved.
  * Copyright 2004 The Apache Software Foundation
  *
@@ -18,8 +19,7 @@
 package com.sun.enterprise.web.connector.grizzly;
 
 /**
- * Dummy Connector Launcher that doesn't start any listener like Grizzly
- * or Coyote.
+ * Dummy Connector Launcher that doesn't start any listener like Grizzly or Coyote.
  *
  * @author Jean-Francois Arcand
  */
@@ -27,9 +27,8 @@
 
     // ------------------------------------------------------- Constructor --//
 
-    public DummyConnectorLauncher(boolean secure, boolean blocking,
-                               String selectorThreadImpl) {
-        super(secure,blocking,selectorThreadImpl);
+    public DummyConnectorLauncher(boolean secure, boolean blocking, String selectorThreadImpl) {
+        super(secure, blocking, selectorThreadImpl);
     }
 
     /**
@@ -39,17 +38,12 @@
     public void init() throws Exception {
     }
 
-
     @Override
     public void start() throws Exception {
     }
 
-
     @Override
     public void destroy() throws Exception {
     }
 
-
-
 }
-
diff --git a/appserver/web/web-core/src/main/java/org/apache/catalina/connector/ClientAbortException.java b/appserver/web/web-core/src/main/java/org/apache/catalina/connector/ClientAbortException.java
index 9bbedfb..cd8a3a7 100644
--- a/appserver/web/web-core/src/main/java/org/apache/catalina/connector/ClientAbortException.java
+++ b/appserver/web/web-core/src/main/java/org/apache/catalina/connector/ClientAbortException.java
@@ -1,4 +1,5 @@
 /*
+ * Copyright (c) 2022, 2022 Contributors to the Eclipse Foundation
  * Copyright (c) 1997-2018 Oracle and/or its affiliates. All rights reserved.
  * Copyright 2004 The Apache Software Foundation
  *
@@ -20,18 +21,16 @@
 import java.io.IOException;
 
 /**
- * Wrap an IOException identifying it as being caused by an abort
- * of a request by a remote client.
+ * Wrap an IOException identifying it as being caused by an abort of a request by a remote client.
  *
  * @author Glenn L. Nielsen
  * @version $Revision: 1.3 $ $Date: 2005/12/08 01:27:28 $
  */
-
 public final class ClientAbortException extends IOException {
 
+    private static final long serialVersionUID = 1L;
 
-    //------------------------------------------------------------ Constructors
-
+    // ------------------------------------------------------------ Constructors
 
     /**
      * Construct a new ClientAbortException with no other information.
@@ -40,7 +39,6 @@
         super();
     }
 
-
     /**
      * Construct a new ClientAbortException for the specified message.
      *
@@ -50,7 +48,6 @@
         super(message);
     }
 
-
     /**
      * Construct a new ClientAbortException for the specified throwable.
      *
@@ -60,10 +57,8 @@
         super(throwable);
     }
 
-
     /**
-     * Construct a new ClientAbortException for the specified message
-     * and throwable.
+     * Construct a new ClientAbortException for the specified message and throwable.
      *
      * @param message Message describing this exception
      * @param throwable Throwable that caused this exception
diff --git a/appserver/web/web-core/src/main/java/org/apache/catalina/connector/Connector.java b/appserver/web/web-core/src/main/java/org/apache/catalina/connector/Connector.java
index 2c9a6ad..83dc83e 100644
--- a/appserver/web/web-core/src/main/java/org/apache/catalina/connector/Connector.java
+++ b/appserver/web/web-core/src/main/java/org/apache/catalina/connector/Connector.java
@@ -1,4 +1,5 @@
 /*
+ * Copyright (c) 2022, 2022 Contributors to the Eclipse Foundation
  * Copyright (c) 1997-2018 Oracle and/or its affiliates. All rights reserved.
  * Copyright 2004 The Apache Software Foundation
  *
@@ -17,7 +18,15 @@
 
 package org.apache.catalina.connector;
 
-import com.sun.appserv.ProxyHandler;
+import static java.util.logging.Level.FINE;
+import static java.util.logging.Level.INFO;
+import static java.util.logging.Level.WARNING;
+import static org.apache.catalina.Globals.CERTIFICATES_ATTR;
+import static org.apache.catalina.Globals.SSL_CERTIFICATE_ATTR;
+import static org.apache.catalina.LogFacade.CONNECTOR_BEEN_STARTED;
+import static org.apache.catalina.LogFacade.CONNECTOR_NOT_BEEN_STARTED;
+import static org.apache.catalina.LogFacade.PROTOCOL_HANDLER_DESTROY_FAILED_EXCEPTION;
+import static org.apache.catalina.LogFacade.PROTOCOL_HANDLER_START_FAILED_EXCEPTION;
 
 import java.lang.reflect.Constructor;
 import java.net.URLEncoder;
@@ -37,7 +46,6 @@
 
 import org.apache.catalina.Container;
 import org.apache.catalina.Context;
-import org.apache.catalina.Globals;
 import org.apache.catalina.Host;
 import org.apache.catalina.Lifecycle;
 import org.apache.catalina.LifecycleException;
@@ -51,6 +59,8 @@
 import org.glassfish.grizzly.http.server.util.Mapper;
 import org.glassfish.web.util.IntrospectionUtils;
 
+import com.sun.appserv.ProxyHandler;
+
 import jakarta.servlet.http.HttpServletRequest;
 
 /**
@@ -60,9 +70,7 @@
  * @author Remy Maucherat
  * @version $Revision: 1.23 $ $Date: 2007/07/09 20:46:45 $
  */
-public class Connector
-    implements org.apache.catalina.Connector, Lifecycle
-{
+public class Connector implements org.apache.catalina.Connector, Lifecycle {
     private static final Logger log = LogFacade.getLogger();
     private static final ResourceBundle rb = log.getResourceBundle();
 
@@ -70,14 +78,11 @@
 
     // START SJSAS 6363251
     /**
-     * Coyote Adapter class name.
-     * Defaults to the CoyoteAdapter.
+     * Coyote Adapter class name. Defaults to the CoyoteAdapter.
      */
-    private String defaultClassName =
-        "org.apache.catalina.connector.CoyoteAdapter";
+    private String defaultClassName = "org.apache.catalina.connector.CoyoteAdapter";
     // END SJSAS 6363251
 
-
     // ----------------------------------------------------- Instance Variables
 
     /**
@@ -88,7 +93,7 @@
     /**
      * The <code>Service</code> we are associated with (if any).
      */
-    private Service service = null;
+    private Service service;
 
     /**
      * The accept count for this Connector.
@@ -96,10 +101,9 @@
     private int acceptCount = 10;
 
     /**
-     * The IP address on which to bind, if any.  If <code>null</code>, all
-     * addresses on the server will be bound.
+     * The IP address on which to bind, if any. If <code>null</code>, all addresses on the server will be bound.
      */
-    private String address = null;
+    private String address;
 
     /**
      * Do we allow TRACE ?
@@ -114,7 +118,7 @@
     /**
      * The Container used for processing requests received by this Connector.
      */
-    protected Container container = null;
+    protected Container container;
 
     /**
      * Compression value.
@@ -129,12 +133,12 @@
     /**
      * The "enable DNS lookups" flag for this Connector.
      */
-    private boolean enableLookups = false;
+    private boolean enableLookups;
 
     /**
      * The server socket factory for this component.
      */
-    private ServerSocketFactory factory = null;
+    private ServerSocketFactory factory;
 
     /**
      * Maximum size of a HTTP header. 4KB is the default.
@@ -149,8 +153,7 @@
     /**
      * Descriptive information about this Connector implementation.
      */
-    private static final String info =
-        "org.apache.catalina.connector.Connector/2.0";
+    private static final String info = "org.apache.catalina.connector.Connector/2.0";
 
     /**
      * The lifecycle event support for this component.
@@ -168,27 +171,22 @@
     private int maxProcessors = 20;
 
     /**
-     * Linger value on the incoming connection.
-     * Note : a value inferior to 0 means no linger.
+     * Linger value on the incoming connection. Note : a value inferior to 0 means no linger.
      */
     private int connectionLinger = Constants.DEFAULT_CONNECTION_LINGER;
 
     /**
-     * Timeout value on the incoming connection.
-     * Note : a value of 0 means no timeout.
+     * Timeout value on the incoming connection. Note : a value of 0 means no timeout.
      */
     private int connectionTimeout = Constants.DEFAULT_CONNECTION_TIMEOUT;
 
     /**
-     * Timeout value on the incoming connection during request processing.
-     * Note : a value of 0 means no timeout.
+     * Timeout value on the incoming connection during request processing. Note : a value of 0 means no timeout.
      */
-    private int connectionUploadTimeout =
-        Constants.DEFAULT_CONNECTION_UPLOAD_TIMEOUT;
+    private int connectionUploadTimeout = Constants.DEFAULT_CONNECTION_UPLOAD_TIMEOUT;
 
     /**
-     * Timeout value on the server socket.
-     * Note : a value of 0 means no timeout.
+     * Timeout value on the server socket. Note : a value of 0 means no timeout.
      */
     private int serverSocketTimeout = Constants.DEFAULT_SERVER_SOCKET_TIMEOUT;
 
@@ -198,18 +196,16 @@
     private int port = 8080;
 
     /**
-     * The server name to which we should pretend requests to this Connector
-     * were directed.  This is useful when operating Tomcat behind a proxy
-     * server, so that redirects get constructed accurately.  If not specified,
-     * the server name included in the <code>Host</code> header is used.
+     * The server name to which we should pretend requests to this Connector were directed. This is useful when operating
+     * Tomcat behind a proxy server, so that redirects get constructed accurately. If not specified, the server name
+     * included in the <code>Host</code> header is used.
      */
-    private String proxyName = null;
+    private String proxyName;
 
     /**
-     * The server port to which we should pretend requests to this Connector
-     * were directed.  This is useful when operating Tomcat behind a proxy
-     * server, so that redirects get constructed accurately.  If not specified,
-     * the port number specified by the <code>port</code> property is used.
+     * The server port to which we should pretend requests to this Connector were directed. This is useful when operating
+     * Tomcat behind a proxy server, so that redirects get constructed accurately. If not specified, the port number
+     * specified by the <code>port</code> property is used.
      */
     private int proxyPort = 0;
 
@@ -218,44 +214,34 @@
      */
     private int redirectPort = 443;
 
-    // BEGIN S1AS 5000999
     /**
      * The default host.
      */
     private String defaultHost;
-    // END S1AS 5000999
 
     /**
-     * The request scheme that will be set on all requests received
-     * through this connector.
+     * The request scheme that will be set on all requests received through this connector.
      */
     private String scheme = "http";
 
     /**
-     * The secure connection flag that will be set on all requests received
-     * through this connector.
+     * The secure connection flag that will be set on all requests received through this connector.
      */
     private boolean secure = false;
 
-    // START SJSAS 6439313
     /**
-     * The blocking connection flag that will be set on all requests received
-     * through this connector.
+     * The blocking connection flag that will be set on all requests received through this connector.
      */
     private boolean blocking = false;
-    // END SJSAS 6439313
 
-    /** For jk, do tomcat authentication if true, trust server if false
+    /**
+     * For jk, do tomcat authentication if true, trust server if false
      */
     private boolean tomcatAuthentication = true;
 
-
-
     /**
-     * Flag to disable setting a seperate time-out for uploads.
-     * If <code>true</code>, then the <code>timeout</code> parameter is
-     * ignored.  If <code>false</code>, then the <code>timeout</code>
-     * parameter is used to control uploads.
+     * Flag to disable setting a seperate time-out for uploads. If <code>true</code>, then the <code>timeout</code>
+     * parameter is ignored. If <code>false</code>, then the <code>timeout</code> parameter is used to control uploads.
      */
     private boolean disableUploadTimeout = true;
 
@@ -265,14 +251,12 @@
     private int maxKeepAliveRequests = 100;
 
     /**
-     * Maximum size of a POST which will be automatically parsed by the
-     * container. 2MB by default.
+     * Maximum size of a POST which will be automatically parsed by the container. 2MB by default.
      */
     private int maxPostSize = 2 * 1024 * 1024;
 
     /**
-     * Maximum size of a POST which will be saved by the container
-     * during authentication. 4kB by default
+     * Maximum size of a POST which will be saved by the container during authentication. 4kB by default
      */
     protected int maxSavePostSize = 4 * 1024;
 
@@ -287,31 +271,19 @@
     private boolean started = false;
 
     /**
-     * The shutdown signal to our background thread
-     */
-    private boolean stopped = false;
-
-    /**
-     * The background thread.
-     */
-    private Thread thread = null;
-
-    /**
      * Use TCP no delay ?
      */
     private boolean tcpNoDelay = true;
 
     /**
-     * Coyote Protocol handler class name.
-     * Defaults to the Coyote HTTP/1.1 protocolHandler.
+     * Coyote Protocol handler class name. Defaults to the Coyote HTTP/1.1 protocolHandler.
      */
-    private String protocolHandlerClassName =
-        "com.sun.enterprise.web.connector.grizzly.CoyoteConnectorLauncher";
+    private String protocolHandlerClassName = "com.sun.enterprise.web.connector.grizzly.CoyoteConnectorLauncher";
 
     /**
      * Coyote protocol handler.
      */
-    private ProtocolHandler protocolHandler = null;
+    private ProtocolHandler protocolHandler;
 
     private String instanceName;
 
@@ -320,7 +292,7 @@
      */
     private String name;
 
-    private HttpHandler handler = null;
+    private HttpHandler handler;
 
     /**
      * Mapper.
@@ -330,31 +302,21 @@
     /**
      * URI encoding.
      */
-    /* GlassFish Issue 2339
-    private String uriEncoding = null;
-     */
-    // START GlassFish Issue 2339
     private String uriEncoding = "UTF-8";
-    // END GlassFish Issue 2339
 
-    // START SJSAS 6331392
     private boolean enabled = true;
-    // END SJSAS 6331392
 
-    // START S1AS 6188932
     /**
-     * Flag indicating whether this connector is receiving its requests from
-     * a trusted intermediate server
+     * Flag indicating whether this connector is receiving its requests from a trusted intermediate server
      */
     protected boolean authPassthroughEnabled = false;
 
-    protected ProxyHandler proxyHandler = null;
-    // END S1AS 6188932
+    protected ProxyHandler proxyHandler;
 
     /**
      * The <code>SelectorThread</code> implementation class.
      */
-    private String selectorThreadImpl = null;
+    private String selectorThreadImpl;
 
     private String jvmRoute;
 
@@ -409,8 +371,7 @@
     /**
      * Set the value of compression.
      *
-     * @param compression The new compression value, which can be "on", "off"
-     * or "force"
+     * @param compression The new compression value, which can be "on", "off" or "force"
      */
     public void setCompression(String compression) {
         this.compression = compression;
@@ -520,7 +481,7 @@
     }
 
     /**
-     * True if the TRACE method is allowed.  Default value is "false".
+     * True if the TRACE method is allowed. Default value is "false".
      */
     public boolean getAllowTrace() {
         return allowTrace;
@@ -561,8 +522,7 @@
     }
 
     /**
-     * Return the Container used for processing requests received by this
-     * Connector.
+     * Return the Container used for processing requests received by this Connector.
      */
     @Override
     public Container getContainer() {
@@ -570,8 +530,7 @@
     }
 
     /**
-     * Set the Container used for processing requests received by this
-     * Connector.
+     * Set the Container used for processing requests received by this Connector.
      *
      * @param container The new Container to use
      */
@@ -650,9 +609,10 @@
 
     /**
      * Set the {@link Mapper}.
+     *
      * @param mapper
      */
-    public void setMapper(Mapper mapper){
+    public void setMapper(Mapper mapper) {
         this.mapper = mapper;
     }
 
@@ -691,29 +651,27 @@
     }
 
     /**
-     * Return the maximum size of a POST which will be automatically
-     * parsed by the container.
+     * Return the maximum size of a POST which will be automatically parsed by the container.
      */
     public int getMaxPostSize() {
         return maxPostSize;
     }
 
     /**
-     * Set the maximum size of a POST which will be automatically
-     * parsed by the container.
+     * Set the maximum size of a POST which will be automatically parsed by the container.
      *
-     * @param maxPostSize The new maximum size in bytes of a POST which will
-     * be automatically parsed by the container
+     * @param maxPostSize The new maximum size in bytes of a POST which will be automatically parsed by the container
      */
+    @Override
     public void setMaxPostSize(int maxPostSize) {
         this.maxPostSize = maxPostSize;
         setProperty("maxPostSize", String.valueOf(maxPostSize));
     }
 
     /**
-     * Return the maximum size of a POST which will be saved by the container
-     * during authentication.
+     * Return the maximum size of a POST which will be saved by the container during authentication.
      */
+    @Override
     public int getMaxSavePostSize() {
 
         return (maxSavePostSize);
@@ -721,11 +679,10 @@
     }
 
     /**
-     * Set the maximum size of a POST which will be saved by the container
-     * during authentication.
+     * Set the maximum size of a POST which will be saved by the container during authentication.
      *
-     * @param maxSavePostSize The new maximum size in bytes of a POST which will
-     * be saved by the container during authentication.
+     * @param maxSavePostSize The new maximum size in bytes of a POST which will be saved by the container during
+     * authentication.
      */
     public void setMaxSavePostSize(int maxSavePostSize) {
 
@@ -753,7 +710,7 @@
     /**
      * Sets the name of this Connector.
      */
-    public void setName(String name){
+    public void setName(String name) {
         this.name = name;
     }
 
@@ -761,7 +718,7 @@
      * Gets the name of this Connector.
      */
     @Override
-    public String getName(){
+    public String getName() {
         return name;
     }
 
@@ -782,11 +739,9 @@
      * Return the Coyote protocol handler in use.
      */
     public String getProtocol() {
-        if ("org.glassfish.grizzly.tcp.http11.Http11Protocol".equals
-            (getProtocolHandlerClassName())) {
+        if ("org.glassfish.grizzly.tcp.http11.Http11Protocol".equals(getProtocolHandlerClassName())) {
             return "HTTP/1.1";
-        } else if ("org.apache.jk.server.JkCoyoteHandler".equals
-                   (getProtocolHandlerClassName())) {
+        } else if ("org.apache.jk.server.JkCoyoteHandler".equals(getProtocolHandlerClassName())) {
             return "AJP/1.3";
         }
         return null;
@@ -799,11 +754,9 @@
      */
     public void setProtocol(String protocol) {
         if (protocol.equals("HTTP/1.1")) {
-            setProtocolHandlerClassName
-                ("org.glassfish.grizzly.tcp.http11.Http11Protocol");
+            setProtocolHandlerClassName("org.glassfish.grizzly.tcp.http11.Http11Protocol");
         } else if (protocol.equals("AJP/1.3")) {
-            setProtocolHandlerClassName
-                ("org.apache.jk.server.JkCoyoteHandler");
+            setProtocolHandlerClassName("org.apache.jk.server.JkCoyoteHandler");
         } else {
             setProtocolHandlerClassName(null);
         }
@@ -817,8 +770,7 @@
     }
 
     /**
-     * Set the class name of the Coyote protocol handler which will be used
-     * by the connector.
+     * Set the class name of the Coyote protocol handler which will be used by the connector.
      *
      * @param protocolHandlerClassName The new class name
      */
@@ -846,7 +798,7 @@
      * @param proxyName The new proxy server name
      */
     public void setProxyName(String proxyName) {
-        if(proxyName != null && proxyName.length() > 0) {
+        if (proxyName != null && proxyName.length() > 0) {
             this.proxyName = proxyName;
             setProperty("proxyName", proxyName);
         } else {
@@ -873,9 +825,8 @@
     }
 
     /**
-     * Return the port number to which a request should be redirected if
-     * it comes in on a non-SSL port and is subject to a security constraint
-     * with a transport guarantee that requires SSL.
+     * Return the port number to which a request should be redirected if it comes in on a non-SSL port and is subject to a
+     * security constraint with a transport guarantee that requires SSL.
      */
     @Override
     public int getRedirectPort() {
@@ -903,20 +854,19 @@
     /**
      * Set the flag to specify upload time-out behavior.
      *
-     * @param isDisabled If <code>true</code>, then the <code>timeout</code>
-     * parameter is ignored.  If <code>false</code>, then the
-     * <code>timeout</code> parameter is used to control uploads.
+     * @param isDisabled If <code>true</code>, then the <code>timeout</code> parameter is ignored. If <code>false</code>,
+     * then the <code>timeout</code> parameter is used to control uploads.
      */
-    public void setDisableUploadTimeout( boolean isDisabled ) {
+    public void setDisableUploadTimeout(boolean isDisabled) {
         disableUploadTimeout = isDisabled;
         setProperty("disableUploadTimeout", String.valueOf(isDisabled));
     }
 
     /**
-      * Return the maximum HTTP header size.
-      */
+     * Return the maximum HTTP header size.
+     */
     public int getMaxHttpHeaderSize() {
-      return maxHttpHeaderSize;
+        return maxHttpHeaderSize;
     }
 
     /**
@@ -944,8 +894,7 @@
     }
 
     /**
-     * Return the maximum number of Keep-Alive requests to honor
-     * per connection.
+     * Return the maximum number of Keep-Alive requests to honor per connection.
      */
     public int getMaxKeepAliveRequests() {
         return maxKeepAliveRequests;
@@ -960,8 +909,7 @@
     }
 
     /**
-     * Return the scheme that will be assigned to requests received
-     * through this connector.  Default value is "http".
+     * Return the scheme that will be assigned to requests received through this connector. Default value is "http".
      */
     @Override
     public String getScheme() {
@@ -969,8 +917,7 @@
     }
 
     /**
-     * Set the scheme that will be assigned to requests received through
-     * this connector.
+     * Set the scheme that will be assigned to requests received through this connector.
      *
      * @param scheme The new scheme
      */
@@ -981,8 +928,8 @@
     }
 
     /**
-     * Return the secure connection flag that will be assigned to requests
-     * received through this connector.  Default value is "false".
+     * Return the secure connection flag that will be assigned to requests received through this connector. Default value is
+     * "false".
      */
     @Override
     public boolean getSecure() {
@@ -990,8 +937,7 @@
     }
 
     /**
-     * Set the secure connection flag that will be assigned to requests
-     * received through this connector.
+     * Set the secure connection flag that will be assigned to requests received through this connector.
      *
      * @param secure The new secure connection flag
      */
@@ -1001,18 +947,16 @@
         setProperty("secure", String.valueOf(secure));
     }
 
-    // START SJSAS 6439313
     /**
-     * Return the blocking connection flag that will be assigned to requests
-     * received through this connector.  Default value is "false".
+     * Return the blocking connection flag that will be assigned to requests received through this connector. Default value
+     * is "false".
      */
     public boolean getBlocking() {
         return blocking;
     }
 
     /**
-     * Set the blocking connection flag that will be assigned to requests
-     * received through this connector.
+     * Set the blocking connection flag that will be assigned to requests received through this connector.
      *
      * @param blocking The new blocking connection flag
      */
@@ -1020,7 +964,6 @@
         this.blocking = blocking;
         setProperty("blocking", String.valueOf(blocking));
     }
-    // END SJSAS 6439313
 
     public boolean getTomcatAuthentication() {
         return tomcatAuthentication;
@@ -1039,8 +982,7 @@
     }
 
     /**
-     * Set the TCP no delay flag which will be set on the socket after
-     * accepting a connection.
+     * Set the TCP no delay flag which will be set on the socket after accepting a connection.
      *
      * @param tcpNoDelay The new TCP no delay flag
      */
@@ -1065,42 +1007,36 @@
     @Override
     public void setURIEncoding(String uriEncoding) {
         if (Charset.isSupported(uriEncoding)) {
-        this.uriEncoding = uriEncoding;
-        setProperty("uRIEncoding", uriEncoding);
+            this.uriEncoding = uriEncoding;
+            setProperty("uRIEncoding", uriEncoding);
         } else {
-            if (log.isLoggable(Level.WARNING)) {
-                log.log(Level.WARNING, uriEncoding
-                        + "is not supported .Setting default URLEncoding as "
-                        + this.uriEncoding);
+            if (log.isLoggable(WARNING)) {
+                log.log(WARNING, uriEncoding + "is not supported .Setting default URLEncoding as " + this.uriEncoding);
             }
         }
     }
 
     /**
-     * Indicates whether the generation of an X-Powered-By response header for
-     * servlet-generated responses is enabled or disabled for this Connector.
+     * Indicates whether the generation of an X-Powered-By response header for servlet-generated responses is enabled or
+     * disabled for this Connector.
      *
-     * @return true if generation of X-Powered-By response header is enabled,
-     * false otherwise
+     * @return true if generation of X-Powered-By response header is enabled, false otherwise
      */
     public boolean isXpoweredBy() {
         return xpoweredBy;
     }
 
     /**
-     * Enables or disables the generation of an X-Powered-By header (with value
-     * Servlet/2.4) for all servlet-generated responses returned by this
-     * Connector.
+     * Enables or disables the generation of an X-Powered-By header (with value Servlet/2.4) for all servlet-generated
+     * responses returned by this Connector.
      *
-     * @param xpoweredBy true if generation of X-Powered-By response header is
-     * to be enabled, false otherwise
+     * @param xpoweredBy true if generation of X-Powered-By response header is to be enabled, false otherwise
      */
     public void setXpoweredBy(boolean xpoweredBy) {
         this.xpoweredBy = xpoweredBy;
         setProperty("xpoweredBy", String.valueOf(xpoweredBy));
     }
 
-    // BEGIN S1AS 5000999
     /**
      * Sets the default host for this Connector.
      *
@@ -1120,14 +1056,11 @@
     public String getDefaultHost() {
         return defaultHost;
     }
-    // END S1AS 5000999
 
-    // START S1AS 6188932
     /**
      * Returns the value of this connector's authPassthroughEnabled flag.
      *
-     * @return true if this connector is receiving its requests from
-     * a trusted intermediate server, false otherwise
+     * @return true if this connector is receiving its requests from a trusted intermediate server, false otherwise
      */
     @Override
     public boolean getAuthPassthroughEnabled() {
@@ -1137,8 +1070,8 @@
     /**
      * Sets the value of this connector's authPassthroughEnabled flag.
      *
-     * @param authPassthroughEnabled true if this connector is receiving its
-     * requests from a trusted intermediate server, false otherwise
+     * @param authPassthroughEnabled true if this connector is receiving its requests from a trusted intermediate server,
+     * false otherwise
      */
     @Override
     public void setAuthPassthroughEnabled(boolean authPassthroughEnabled) {
@@ -1148,8 +1081,7 @@
     /**
      * Gets the ProxyHandler instance associated with this CoyoteConnector.
      *
-     * @return ProxyHandler instance associated with this CoyoteConnector,
-     * or null
+     * @return ProxyHandler instance associated with this CoyoteConnector, or null
      */
     @Override
     public ProxyHandler getProxyHandler() {
@@ -1166,9 +1098,6 @@
         this.proxyHandler = proxyHandler;
     }
 
-    // END S1AS 6188932
-
-    // START SJSAS 6331392
     public void setEnabled(boolean enabled) {
         this.enabled = enabled;
     }
@@ -1176,12 +1105,13 @@
     public boolean isEnabled() {
         return enabled;
     }
-    // END SJSAS 6331392
 
+    @Override
     public void setJvmRoute(String jvmRoute) {
         this.jvmRoute = jvmRoute;
     }
 
+    @Override
     public String getJvmRoute() {
         return jvmRoute;
     }
@@ -1189,8 +1119,8 @@
     // --------------------------------------------------------- Public Methods
 
     /**
-     * Create (or allocate) and return a Request object suitable for
-     * specifying the contents of a Request to the responsible Container.
+     * Create (or allocate) and return a Request object suitable for specifying the contents of a Request to the responsible
+     * Container.
      */
     @Override
     public org.apache.catalina.Request createRequest() {
@@ -1200,8 +1130,8 @@
     }
 
     /**
-     * Create (or allocate) and return a Response object suitable for
-     * receiving the contents of a Response from the responsible Container.
+     * Create (or allocate) and return a Response object suitable for receiving the contents of a Response from the
+     * responsible Container.
      */
     @Override
     public org.apache.catalina.Response createResponse() {
@@ -1210,37 +1140,31 @@
         return response;
     }
 
-
     // -------------------------------------------------- Monitoring Methods
 
     /**
-     * Fires probe event related to the fact that the given request has
-     * been entered the web container.
+     * Fires probe event related to the fact that the given request has been entered the web container.
      *
      * @param request the request object
      * @param host the virtual server to which the request was mapped
      * @param context the Context to which the request was mapped
      */
-    public void requestStartEvent(HttpServletRequest request, Host host,
-            Context context) {
+    public void requestStartEvent(HttpServletRequest request, Host host, Context context) {
         // Deliberate noop
     };
 
     /**
-     * Fires probe event related to the fact that the given request is about
-     * to exit from the web container.
+     * Fires probe event related to the fact that the given request is about to exit from the web container.
      *
      * @param request the request object
      * @param host the virtual server to which the request was mapped
      * @param context the Context to which the request was mapped
      * @param statusCode the response status code
      */
-    public void requestEndEvent(HttpServletRequest request, Host host,
-            Context context, int statusCode) {
+    public void requestEndEvent(HttpServletRequest request, Host host, Context context, int statusCode) {
         // Deliberate noop
     };
 
-
     // ------------------------------------------------------ Lifecycle Methods
 
     /**
@@ -1254,8 +1178,7 @@
     }
 
     /**
-     * Gets the (possibly empty) list of lifecycle listeners
-     * associated with this Connector.
+     * Gets the (possibly empty) list of lifecycle listeners associated with this Connector.
      */
     @Override
     public List<LifecycleListener> findLifecycleListeners() {
@@ -1272,16 +1195,13 @@
         lifecycle.removeLifecycleListener(listener);
     }
 
-    protected ObjectName createObjectName(String domain, String type)
-            throws MalformedObjectNameException {
+    protected ObjectName createObjectName(String domain, String type) throws MalformedObjectNameException {
         String encodedAddr = null;
         if (getAddress() != null) {
             encodedAddr = URLEncoder.encode(getProperty("address"));
         }
-        String addSuffix = (getAddress() == null) ? "" : ",address="
-                + encodedAddr;
-        ObjectName _oname = new ObjectName(domain + ":type=" + type + ",port="
-                + getPort() + addSuffix);
+        String addSuffix = (getAddress() == null) ? "" : ",address=" + encodedAddr;
+        ObjectName _oname = new ObjectName(domain + ":type=" + type + ",port=" + getPort() + addSuffix);
         return _oname;
     }
 
@@ -1289,12 +1209,10 @@
      * Initialize this connector (create ServerSocket here!)
      */
     @Override
-    public void initialize()
-        throws LifecycleException
-    {
+    public void initialize() throws LifecycleException {
         if (initialized) {
-            if (log.isLoggable(Level.INFO)) {
-                log.log(Level.INFO, LogFacade.CONNECTOR_BEEN_INIT);
+            if (log.isLoggable(INFO)) {
+                log.log(INFO, LogFacade.CONNECTOR_BEEN_INIT);
             }
             return;
         }
@@ -1302,151 +1220,110 @@
         this.initialized = true;
 
         // If the Mapper is null, do not fail and creates one by default.
-        if (mapper == null){
+        if (mapper == null) {
             mapper = new Mapper();
         }
 
-        if( oname == null && (container instanceof StandardEngine)) {
+        if (oname == null && (container instanceof StandardEngine)) {
             try {
                 // we are loaded directly, via API - and no name was given to us
-                StandardEngine cb=(StandardEngine)container;
+                StandardEngine cb = (StandardEngine) container;
                 oname = createObjectName(domain, "Connector");
-                controller=oname;
+                controller = oname;
             } catch (Exception e) {
                 log.log(Level.SEVERE, LogFacade.ERROR_REGISTER_CONNECTOR_EXCEPTION, e);
             }
-            if (log.isLoggable(Level.FINE)) {
-                log.log(Level.FINE, "Creating name for connector " + oname);
+            if (log.isLoggable(FINE)) {
+                log.log(FINE, "Creating name for connector " + oname);
             }
         }
 
-
-        //START SJSAS 6363251
-        // Initializa handler
-        //handler = new CoyoteAdapter(this);
-        //END SJSAS 6363251
-        // Instantiate Adapter
-        //START SJSAS 6363251
-        if ( handler == null){
+        if (handler == null) {
             try {
                 Class<?> clazz = Class.forName(defaultClassName);
-                Constructor constructor =
-                        clazz.getConstructor(new Class<?>[]{Connector.class});
-                handler =
-                        (HttpHandler)constructor.newInstance(new Object[]{this});
+                Constructor constructor = clazz.getConstructor(new Class<?>[] { Connector.class });
+                handler = (HttpHandler) constructor.newInstance(new Object[] { this });
             } catch (Exception e) {
-                throw new LifecycleException
-                    (rb.getString(LogFacade.FAILED_INSTANCIATE_HTTP_HANDLER_EXCEPTION), e);
+                throw new LifecycleException(rb.getString(LogFacade.FAILED_INSTANCIATE_HTTP_HANDLER_EXCEPTION), e);
             }
         }
-        //END SJSAS 6363251
 
         // Instantiate protocol handler
-        if ( protocolHandler == null ) {
+        if (protocolHandler == null) {
             try {
                 Class<?> clazz = Class.forName(protocolHandlerClassName);
 
                 // use no-arg constructor for JkCoyoteHandler
                 if (protocolHandlerClassName.equals("org.apache.jk.server.JkCoyoteHandler")) {
                     protocolHandler = (ProtocolHandler) clazz.newInstance();
-                    if (handler instanceof CoyoteAdapter){
+                    if (handler instanceof CoyoteAdapter) {
                         ((CoyoteAdapter) handler).setCompatWithTomcat(true);
                     } else {
-                        String msg = MessageFormat.format(rb.getString(LogFacade.INVALID_ADAPTER_IMPLEMENTATION_EXCEPTION),
-                                                          handler);
-                        throw new IllegalStateException
-                          (msg);
+                        String msg = MessageFormat.format(rb.getString(LogFacade.INVALID_ADAPTER_IMPLEMENTATION_EXCEPTION), handler);
+                        throw new IllegalStateException(msg);
 
                     }
-                // START SJSAS 6439313
                 } else {
-                    Constructor constructor =
-                            clazz.getConstructor(new Class<?>[]{Boolean.TYPE,
-                                                             Boolean.TYPE,
-                                                             String.class});
+                    Constructor constructor = clazz.getConstructor(new Class<?>[] { Boolean.TYPE, Boolean.TYPE, String.class });
 
-                    protocolHandler = (ProtocolHandler)
-                        constructor.newInstance(secure, blocking,
-                                                selectorThreadImpl);
-                // END SJSAS 6439313
+                    protocolHandler = (ProtocolHandler) constructor.newInstance(secure, blocking, selectorThreadImpl);
                 }
             } catch (Exception e) {
                 String msg = MessageFormat.format(rb.getString(LogFacade.PROTOCOL_HANDLER_INIT_FAILED_EXCEPTION), e);
-                throw new LifecycleException
-                    (msg);
+                throw new LifecycleException(msg);
             }
         }
 
         protocolHandler.setHandler(handler);
 
-        IntrospectionUtils.setProperty(protocolHandler, "jkHome",
-                                       System.getProperty("catalina.base"));
+        IntrospectionUtils.setProperty(protocolHandler, "jkHome", System.getProperty("catalina.base"));
 
         // Configure secure socket factory
         // XXX For backwards compatibility only.
         if (factory instanceof CoyoteServerSocketFactory) {
-            IntrospectionUtils.setProperty(protocolHandler, "secure",
-                                           "" + true);
-            CoyoteServerSocketFactory ssf =
-                (CoyoteServerSocketFactory) factory;
-            IntrospectionUtils.setProperty(protocolHandler, "algorithm",
-                                           ssf.getAlgorithm());
+            IntrospectionUtils.setProperty(protocolHandler, "secure", "" + true);
+            CoyoteServerSocketFactory ssf = (CoyoteServerSocketFactory) factory;
+            IntrospectionUtils.setProperty(protocolHandler, "algorithm", ssf.getAlgorithm());
             if (ssf.getClientAuth()) {
-                IntrospectionUtils.setProperty(protocolHandler, "clientauth",
-                                               "" + ssf.getClientAuth());
+                IntrospectionUtils.setProperty(protocolHandler, "clientauth", "" + ssf.getClientAuth());
             }
-            IntrospectionUtils.setProperty(protocolHandler, "keystore",
-                                           ssf.getKeystoreFile());
-            IntrospectionUtils.setProperty(protocolHandler, "randomfile",
-                                           ssf.getRandomFile());
-            IntrospectionUtils.setProperty(protocolHandler, "rootfile",
-                                           ssf.getRootFile());
+            IntrospectionUtils.setProperty(protocolHandler, "keystore", ssf.getKeystoreFile());
+            IntrospectionUtils.setProperty(protocolHandler, "randomfile", ssf.getRandomFile());
+            IntrospectionUtils.setProperty(protocolHandler, "rootfile", ssf.getRootFile());
 
-            IntrospectionUtils.setProperty(protocolHandler, "keypass",
-                                           ssf.getKeystorePass());
-            IntrospectionUtils.setProperty(protocolHandler, "keytype",
-                                           ssf.getKeystoreType());
-            IntrospectionUtils.setProperty(protocolHandler, "protocol",
-                                           ssf.getProtocol());
-            IntrospectionUtils.setProperty(protocolHandler, "protocols",
-                                           ssf.getProtocols());
-            IntrospectionUtils.setProperty(protocolHandler,
-                                           "sSLImplementation",
-                                           ssf.getSSLImplementation());
-            IntrospectionUtils.setProperty(protocolHandler, "ciphers",
-                                           ssf.getCiphers());
-            IntrospectionUtils.setProperty(protocolHandler, "keyAlias",
-                                           ssf.getKeyAlias());
+            IntrospectionUtils.setProperty(protocolHandler, "keypass", ssf.getKeystorePass());
+            IntrospectionUtils.setProperty(protocolHandler, "keytype", ssf.getKeystoreType());
+            IntrospectionUtils.setProperty(protocolHandler, "protocol", ssf.getProtocol());
+            IntrospectionUtils.setProperty(protocolHandler, "protocols", ssf.getProtocols());
+            IntrospectionUtils.setProperty(protocolHandler, "sSLImplementation", ssf.getSSLImplementation());
+            IntrospectionUtils.setProperty(protocolHandler, "ciphers", ssf.getCiphers());
+            IntrospectionUtils.setProperty(protocolHandler, "keyAlias", ssf.getKeyAlias());
         } else {
-            IntrospectionUtils.setProperty(protocolHandler, "secure",
-                                           "" + secure);
+            IntrospectionUtils.setProperty(protocolHandler, "secure", "" + secure);
         }
 
-        /* Set the configured properties.  This only sets the ones that were
-         * explicitly configured.  Default values are the responsibility of
-         * the protocolHandler.
+        /*
+         * Set the configured properties. This only sets the ones that were explicitly configured. Default values are the
+         * responsibility of the protocolHandler.
          */
         Iterator<String> keys = properties.keySet().iterator();
-        while( keys.hasNext() ) {
+        while (keys.hasNext()) {
             String name = keys.next();
             String value = properties.get(name);
-        String trnName = translateAttributeName(name);
+            String trnName = translateAttributeName(name);
             IntrospectionUtils.setProperty(protocolHandler, trnName, value);
         }
 
-
         try {
             protocolHandler.init();
         } catch (Exception e) {
             String msg = MessageFormat.format(rb.getString(LogFacade.PROTOCOL_HANDLER_INIT_FAILED_EXCEPTION), e);
-            throw new LifecycleException
-                (msg);
+            throw new LifecycleException(msg);
         }
     }
 
     /*
-     * Translate the attribute name from the legacy Factory names to their
-     * internal protocol names.
+     * Translate the attribute name from the legacy Factory names to their internal protocol names.
      */
     private String translateAttributeName(String name) {
         if ("clientAuth".equals(name)) {
@@ -1476,13 +1353,13 @@
      */
     @Override
     public void start() throws LifecycleException {
-        if( !initialized )
+        if (!initialized)
             initialize();
 
         // Validate and update our current state
         if (started) {
-            if (log.isLoggable(Level.INFO)) {
-                log.log(Level.INFO, LogFacade.CONNECTOR_BEEN_STARTED);
+            if (log.isLoggable(INFO)) {
+                log.log(INFO, CONNECTOR_BEEN_STARTED);
             }
             return;
         }
@@ -1492,9 +1369,8 @@
         try {
             protocolHandler.start();
         } catch (Exception e) {
-            String msg = MessageFormat.format(rb.getString(LogFacade.PROTOCOL_HANDLER_START_FAILED_EXCEPTION), e);
-            throw new LifecycleException
-                (msg);
+            String msg = MessageFormat.format(rb.getString(PROTOCOL_HANDLER_START_FAILED_EXCEPTION), e);
+            throw new LifecycleException(msg);
         }
 
     }
@@ -1509,7 +1385,7 @@
 
         // Validate and update our current state
         if (!started) {
-            log.log(Level.SEVERE, LogFacade.CONNECTOR_NOT_BEEN_STARTED);
+            log.log(Level.SEVERE, CONNECTOR_NOT_BEEN_STARTED);
             return;
 
         }
@@ -1519,14 +1395,11 @@
         try {
             protocolHandler.destroy();
         } catch (Exception e) {
-            String msg = MessageFormat.format(rb.getString(LogFacade.PROTOCOL_HANDLER_DESTROY_FAILED_EXCEPTION), e);
-            throw new LifecycleException
-                (msg);
+            throw new LifecycleException(MessageFormat.format(rb.getString(PROTOCOL_HANDLER_DESTROY_FAILED_EXCEPTION), e));
         }
 
     }
 
-
     // -------------------- Management methods --------------------
 
     public boolean getClientAuth() {
@@ -1538,7 +1411,7 @@
         } else {
             ServerSocketFactory factory = this.getFactory();
             if (factory instanceof CoyoteServerSocketFactory) {
-                ret = ((CoyoteServerSocketFactory)factory).getClientAuth();
+                ret = ((CoyoteServerSocketFactory) factory).getClientAuth();
             }
         }
 
@@ -1549,7 +1422,7 @@
         setProperty("clientauth", String.valueOf(clientAuth));
         ServerSocketFactory factory = this.getFactory();
         if (factory instanceof CoyoteServerSocketFactory) {
-            ((CoyoteServerSocketFactory)factory).setClientAuth(clientAuth);
+            ((CoyoteServerSocketFactory) factory).setClientAuth(clientAuth);
         }
     }
 
@@ -1558,7 +1431,7 @@
         if (ret == null) {
             ServerSocketFactory factory = this.getFactory();
             if (factory instanceof CoyoteServerSocketFactory) {
-                ret = ((CoyoteServerSocketFactory)factory).getKeystoreFile();
+                ret = ((CoyoteServerSocketFactory) factory).getKeystoreFile();
             }
         }
 
@@ -1568,7 +1441,7 @@
     public void setKeystoreFile(String keystoreFile) {
         setProperty("keystore", keystoreFile);
         if (factory instanceof CoyoteServerSocketFactory) {
-            ((CoyoteServerSocketFactory)factory).setKeystoreFile(keystoreFile);
+            ((CoyoteServerSocketFactory) factory).setKeystoreFile(keystoreFile);
         }
     }
 
@@ -1578,8 +1451,8 @@
     public String getKeystorePass() {
         String ret = getProperty("keypass");
         if (ret == null) {
-            if (factory instanceof CoyoteServerSocketFactory ) {
-                return ((CoyoteServerSocketFactory)factory).getKeystorePass();
+            if (factory instanceof CoyoteServerSocketFactory) {
+                return ((CoyoteServerSocketFactory) factory).getKeystorePass();
             }
         }
 
@@ -1592,24 +1465,23 @@
     public void setKeystorePass(String keystorePass) {
         setProperty("keypass", keystorePass);
         ServerSocketFactory factory = getFactory();
-        if( factory instanceof CoyoteServerSocketFactory ) {
-            ((CoyoteServerSocketFactory)factory).setKeystorePass(keystorePass);
+        if (factory instanceof CoyoteServerSocketFactory) {
+            ((CoyoteServerSocketFactory) factory).setKeystorePass(keystorePass);
         }
     }
 
     /**
      * Gets the list of SSL cipher suites that are to be enabled
      *
-     * @return Comma-separated list of SSL cipher suites, or null if all
-     * cipher suites supported by the underlying SSL implementation are being
-     * enabled
+     * @return Comma-separated list of SSL cipher suites, or null if all cipher suites supported by the underlying SSL
+     * implementation are being enabled
      */
     public String getCiphers() {
         String ret = getProperty("ciphers");
         if (ret == null) {
             ServerSocketFactory factory = getFactory();
             if (factory instanceof CoyoteServerSocketFactory) {
-                ret = ((CoyoteServerSocketFactory)factory).getCiphers();
+                ret = ((CoyoteServerSocketFactory) factory).getCiphers();
             }
         }
 
@@ -1619,8 +1491,7 @@
     /**
      * Sets the SSL cipher suites that are to be enabled.
      *
-     * Only those SSL cipher suites that are actually supported by
-     * the underlying SSL implementation will be enabled.
+     * Only those SSL cipher suites that are actually supported by the underlying SSL implementation will be enabled.
      *
      * @param ciphers Comma-separated list of SSL cipher suites
      */
@@ -1628,13 +1499,12 @@
         setProperty("ciphers", ciphers);
         ServerSocketFactory factory = getFactory();
         if (factory instanceof CoyoteServerSocketFactory) {
-            ((CoyoteServerSocketFactory)factory).setCiphers(ciphers);
+            ((CoyoteServerSocketFactory) factory).setCiphers(ciphers);
         }
     }
 
     /**
-     * Sets the number of seconds after which SSL sessions expire and are
-     * removed from the SSL sessions cache.
+     * Sets the number of seconds after which SSL sessions expire and are removed from the SSL sessions cache.
      */
     public void setSslSessionTimeout(String timeout) {
         setProperty("sslSessionTimeout", timeout);
@@ -1645,8 +1515,7 @@
     }
 
     /**
-     * Sets the number of seconds after which SSL3 sessions expire and are
-     * removed from the SSL sessions cache.
+     * Sets the number of seconds after which SSL3 sessions expire and are removed from the SSL sessions cache.
      */
     public void setSsl3SessionTimeout(String timeout) {
         setProperty("ssl3SessionTimeout", timeout);
@@ -1668,8 +1537,8 @@
     }
 
     /**
-     * Gets the alias name of the keypair and supporting certificate chain
-     * used by this Connector to authenticate itself to SSL clients.
+     * Gets the alias name of the keypair and supporting certificate chain used by this Connector to authenticate itself to
+     * SSL clients.
      *
      * @return The alias name of the keypair and supporting certificate chain
      */
@@ -1678,7 +1547,7 @@
         if (ret == null) {
             ServerSocketFactory factory = getFactory();
             if (factory instanceof CoyoteServerSocketFactory) {
-                ret = ((CoyoteServerSocketFactory)factory).getKeyAlias();
+                ret = ((CoyoteServerSocketFactory) factory).getKeyAlias();
             }
         }
 
@@ -1686,17 +1555,16 @@
     }
 
     /**
-     * Sets the alias name of the keypair and supporting certificate chain
-     * used by this Connector to authenticate itself to SSL clients.
+     * Sets the alias name of the keypair and supporting certificate chain used by this Connector to authenticate itself to
+     * SSL clients.
      *
-     * @param alias The alias name of the keypair and supporting certificate
-     * chain
+     * @param alias The alias name of the keypair and supporting certificate chain
      */
     public void setKeyAlias(String alias) {
         setProperty("keyAlias", alias);
         ServerSocketFactory factory = getFactory();
         if (factory instanceof CoyoteServerSocketFactory) {
-            ((CoyoteServerSocketFactory)factory).setKeyAlias(alias);
+            ((CoyoteServerSocketFactory) factory).setKeyAlias(alias);
         }
     }
 
@@ -1710,7 +1578,7 @@
         if (ret == null) {
             ServerSocketFactory factory = getFactory();
             if (factory instanceof CoyoteServerSocketFactory) {
-                ret = ((CoyoteServerSocketFactory)factory).getProtocol();
+                ret = ((CoyoteServerSocketFactory) factory).getProtocol();
             }
         }
 
@@ -1726,7 +1594,7 @@
         setProperty("sslProtocol", sslProtocol);
         ServerSocketFactory factory = getFactory();
         if (factory instanceof CoyoteServerSocketFactory) {
-            ((CoyoteServerSocketFactory)factory).setProtocol(sslProtocol);
+            ((CoyoteServerSocketFactory) factory).setProtocol(sslProtocol);
         }
     }
 
@@ -1740,7 +1608,7 @@
         if (ret == null) {
             ServerSocketFactory factory = getFactory();
             if (factory instanceof CoyoteServerSocketFactory) {
-                ret = ((CoyoteServerSocketFactory)factory).getProtocols();
+                ret = ((CoyoteServerSocketFactory) factory).getProtocols();
             }
         }
 
@@ -1756,36 +1624,31 @@
         setProperty("sslProtocols", sslProtocols);
         ServerSocketFactory factory = getFactory();
         if (factory instanceof CoyoteServerSocketFactory) {
-            ((CoyoteServerSocketFactory)factory).setProtocols(sslProtocols);
+            ((CoyoteServerSocketFactory) factory).setProtocols(sslProtocols);
         }
     }
 
-    // START OF SJSAS 8.1 PE 6191830
     /**
      * Get the underlying WebContainer certificate for the request
      */
     @Override
     public X509Certificate[] getCertificates(org.apache.catalina.Request request) {
-
-        Request cRequest = null;
+        Request connectorRequest = null;
         if (request instanceof Request) {
-            cRequest=(Request) request;
+            connectorRequest = (Request) request;
         } else {
             return null;
         }
 
-        X509Certificate certs[] = (X509Certificate[])
-        cRequest.getAttribute(Globals.CERTIFICATES_ATTR);
+        X509Certificate certs[] = (X509Certificate[]) connectorRequest.getAttribute(CERTIFICATES_ATTR);
         if ((certs == null) || (certs.length < 1)) {
-            certs = (X509Certificate[])
-            cRequest.getAttribute(Globals.SSL_CERTIFICATE_ATTR);
+            certs = (X509Certificate[]) connectorRequest.getAttribute(SSL_CERTIFICATE_ATTR);
         }
+
         return certs;
     }
-    // END OF SJSAS 8.1 PE 6191830
 
-
-    // -------------------- JMX registration  --------------------
+    // -------------------- JMX registration --------------------
 
     protected String domain;
     protected ObjectName oname;
@@ -1810,37 +1673,35 @@
     /**
      * Set the domain of this object.
      */
-    public void setDomain(String domain){
+    public void setDomain(String domain) {
         this.domain = domain;
     }
 
     public void init() throws Exception {
-
-        if( this.getService() != null ) {
-            if (log.isLoggable(Level.FINE)) {
-                log.log(Level.FINE, "Already configured");
+        if (this.getService() != null) {
+            if (log.isLoggable(FINE)) {
+                log.log(FINE, "Already configured");
             }
             return;
         }
     }
 
     public void destroy() throws Exception {
-        if( oname!=null && controller==oname ) {
-            if (log.isLoggable(Level.FINE)) {
-                log.log(Level.FINE, "Unregister itself " + oname );
+        if (oname != null && controller == oname) {
+            if (log.isLoggable(FINE)) {
+                log.log(FINE, "Unregister itself " + oname);
             }
         }
-        if( getService() == null)
+        if (getService() == null)
             return;
         getService().removeConnector(this);
     }
 
-    // START SJSAS 6363251
     /**
      * Set the <code>Adapter</code> used by this connector.
      */
     @Override
-    public void setHandler(HttpHandler handler){
+    public void setHandler(HttpHandler handler) {
         this.handler = handler;
     }
 
@@ -1848,21 +1709,19 @@
      * Get the <code>Adapter</code> used by this connector.
      */
     @Override
-    public HttpHandler getHandler(){
+    public HttpHandler getHandler() {
         return handler;
     }
 
     /**
      * Set the <code>ProtocolHandler</code> used by this connector.
      */
-    public void setProtocolHandler(ProtocolHandler protocolHandler){
+    public void setProtocolHandler(ProtocolHandler protocolHandler) {
         this.protocolHandler = protocolHandler;
     }
-    // END SJSAS 6363251
 
     /**
-     * Get the underlying <code>SelectorThread</code> implementation, null if
-     * the default is used.
+     * Get the underlying <code>SelectorThread</code> implementation, null if the default is used.
      */
     public String getSelectorThreadImpl() {
         return selectorThreadImpl;
diff --git a/appserver/web/web-core/src/main/java/org/apache/catalina/connector/CoyoteAdapter.java b/appserver/web/web-core/src/main/java/org/apache/catalina/connector/CoyoteAdapter.java
index d0b11fd..f02578a 100644
--- a/appserver/web/web-core/src/main/java/org/apache/catalina/connector/CoyoteAdapter.java
+++ b/appserver/web/web-core/src/main/java/org/apache/catalina/connector/CoyoteAdapter.java
@@ -1,4 +1,5 @@
 /*
+ * Copyright (c) 2022, 2022 Contributors to the Eclipse Foundation.
  * Copyright (c) 1997-2018 Oracle and/or its affiliates. All rights reserved.
  * Copyright 2004 The Apache Software Foundation
  *
@@ -17,19 +18,30 @@
 
 package org.apache.catalina.connector;
 
+import static jakarta.servlet.http.HttpServletResponse.SC_BAD_REQUEST;
+import static jakarta.servlet.http.HttpServletResponse.SC_NOT_FOUND;
+import static java.util.logging.Level.FINE;
+import static java.util.logging.Level.INFO;
+import static java.util.logging.Level.SEVERE;
+import static org.apache.catalina.Globals.SESSION_PARAMETER_NAME;
+import static org.apache.catalina.LogFacade.FAILED_TO_INITIALIZE_THE_INTERCEPTOR;
+import static org.apache.catalina.LogFacade.HTTP_LISTENER_DISABLED;
+import static org.apache.catalina.LogFacade.INTERNAL_ERROR;
+import static org.apache.catalina.LogFacade.NO_HOST_MATCHES_SERVER_NAME_INFO;
+import static org.apache.catalina.LogFacade.PARSING_CLIENT_CERT_EXCEPTION;
+import static org.apache.catalina.LogFacade.REQUEST_PROCESSING_EXCEPTION;
+import static org.apache.catalina.connector.Constants.USE_CUSTOM_STATUS_MSG_IN_HEADER;
+import static org.glassfish.internal.api.Globals.getDefaultHabitat;
+
+import java.io.CharConversionException;
 import java.nio.charset.Charset;
 import java.security.cert.CertificateException;
 import java.security.cert.X509Certificate;
 import java.text.MessageFormat;
 import java.util.Collection;
 import java.util.ResourceBundle;
-import java.util.logging.Level;
 import java.util.logging.Logger;
-import jakarta.servlet.http.HttpServletRequest;
-import jakarta.servlet.http.HttpServletResponse;
 
-import com.sun.appserv.ProxyHandler;
-import java.io.CharConversionException;
 import org.apache.catalina.Container;
 import org.apache.catalina.Context;
 import org.apache.catalina.Globals;
@@ -37,26 +49,24 @@
 import org.apache.catalina.LogFacade;
 import org.apache.catalina.Wrapper;
 import org.apache.catalina.core.ContainerBase;
-import org.apache.catalina.util.ResponseUtil;
 import org.apache.catalina.util.ServerInfo;
-import org.apache.catalina.util.StringManager;
 import org.glassfish.common.util.InputValidationUtil;
 import org.glassfish.grizzly.http.Method;
+import org.glassfish.grizzly.http.Note;
 import org.glassfish.grizzly.http.server.AfterServiceListener;
 import org.glassfish.grizzly.http.server.HttpHandler;
-import org.glassfish.grizzly.http.Note;
 import org.glassfish.grizzly.http.server.util.MappingData;
 import org.glassfish.grizzly.http.util.ByteChunk;
 import org.glassfish.grizzly.http.util.CharChunk;
 import org.glassfish.grizzly.http.util.DataChunk;
 import org.glassfish.grizzly.http.util.MessageBytes;
-import org.glassfish.hk2.api.ServiceLocator;
 import org.glassfish.web.valve.GlassFishValve;
 import org.glassfish.web.valve.ServletContainerInterceptor;
 
+import com.sun.appserv.ProxyHandler;
+
 /**
- * Implementation of a request processor which delegates the processing to a
- * Coyote processor.
+ * Implementation of a request processor which delegates the processing to a Coyote processor.
  *
  * @author Craig R. McClanahan
  * @author Remy Maucherat
@@ -69,59 +79,51 @@
     private static final ResourceBundle rb = log.getResourceBundle();
 
     // -------------------------------------------------------------- Constants
-    private static final String POWERED_BY = "Servlet/3.1 JSP/2.3 " +
-            "(" + ServerInfo.getServerInfo() + " Java/" +
-            System.getProperty("java.vm.vendor") + "/" +
-            System.getProperty("java.specification.version") + ")";
-
-
-//    protected boolean v3Enabled =
-//        Boolean.valueOf(System.getProperty("v3.grizzly.useMapper", "true"));
-
-
-//    public static final int ADAPTER_NOTES = 1;
 
     static final String JVM_ROUTE = System.getProperty("jvmRoute");
 
-    private Collection<ServletContainerInterceptor> interceptors = null;
-
     protected static final boolean ALLOW_BACKSLASH =
         Boolean.valueOf(System.getProperty("org.glassfish.grizzly.tcp.tomcat5.CoyoteAdapter.ALLOW_BACKSLASH", "false"));
 
     private static final boolean COLLAPSE_ADJACENT_SLASHES =
-        Boolean.valueOf(System.getProperty(
-            "com.sun.enterprise.web.collapseAdjacentSlashes", "true"));
-
-    /**
-     * When mod_jk is used, the adapter must be invoked the same way
-     * Tomcat does by invoking service(...) and the afterService(...). This
-     * is a hack to make it compatible with Tomcat 5|6.
-     */
-    private boolean compatWithTomcat = false;
-
-    private String serverName = ServerInfo.getPublicServerInfo();
+        Boolean.valueOf(System.getProperty("com.sun.enterprise.web.collapseAdjacentSlashes", "true"));
 
     // Make sure this value is always aligned with {@link ContainerMapper}
     // (@see com.sun.enterprise.v3.service.impl.ContainerMapper)
-    protected final static Note<MappingData> MAPPING_DATA =
-            org.glassfish.grizzly.http.server.Request.<MappingData>createNote("MappingData");
-
+    protected static final Note<MappingData> MAPPING_DATA =
+        org.glassfish.grizzly.http.server.Request.<MappingData>createNote("MappingData");
     static final Note<Request> CATALINA_REQUEST_NOTE =
-            org.glassfish.grizzly.http.server.Request.createNote(Request.class.getName());
+        org.glassfish.grizzly.http.server.Request.createNote(Request.class.getName());
     static final Note<Response> CATALINA_RESPONSE_NOTE =
-            org.glassfish.grizzly.http.server.Request.createNote(Response.class.getName());
+        org.glassfish.grizzly.http.server.Request.createNote(Response.class.getName());
 
-    static final CatalinaAfterServiceListener catalinaAfterServiceListener =
-            new CatalinaAfterServiceListener();
+    static final CatalinaAfterServiceListener catalinaAfterServiceListener = new CatalinaAfterServiceListener();
 
     // Make sure this value is always aligned with {@link ContainerMapper}
     // (@see com.sun.enterprise.v3.service.impl.ContainerMapper)
     private final static Note<DataChunk> DATA_CHUNK =
-            org.glassfish.grizzly.http.server.Request.<DataChunk>createNote("DataChunk");
+        org.glassfish.grizzly.http.server.Request.<DataChunk>createNote("DataChunk");
+
+    // ----------------------------------------------------- Instance Variables
+
+    private Collection<ServletContainerInterceptor> interceptors;
+
+    /**
+     * When mod_jk is used, the adapter must be invoked the same way Tomcat does by invoking service(...) and the
+     * afterService(...). This is a hack to make it compatible with Tomcat 5|6.
+     */
+    private boolean compatWithTomcat;
+
+    private String serverName = ServerInfo.getPublicServerInfo();
+
+    /**
+     * The CoyoteConnector with which this processor is associated.
+     */
+    private Connector connector;
+
 
     // ----------------------------------------------------------- Constructors
 
-
     /**
      * Construct a new CoyoteProcessor associated with the specified connector.
      *
@@ -134,213 +136,171 @@
     }
 
 
-    // ----------------------------------------------------- Instance Variables
-
-
-    /**
-     * The CoyoteConnector with which this processor is associated.
-     */
-    private Connector connector = null;
-
-
     // -------------------------------------------------------- Adapter Methods
 
-
     /**
      * Service method.
      */
     @Override
-    public void service(org.glassfish.grizzly.http.server.Request req,
-                        org.glassfish.grizzly.http.server.Response res)
-            throws Exception {
+    public void service(org.glassfish.grizzly.http.server.Request grizzlyRequest, org.glassfish.grizzly.http.server.Response grizzlyResponse) throws Exception {
+        grizzlyResponse.getResponse().setAllowCustomReasonPhrase(USE_CUSTOM_STATUS_MSG_IN_HEADER);
 
-        res.getResponse().setAllowCustomReasonPhrase(Constants.USE_CUSTOM_STATUS_MSG_IN_HEADER);
-
-        Request request = req.getNote(CATALINA_REQUEST_NOTE);
-        Response response = req.getNote(CATALINA_RESPONSE_NOTE);
+        Request catalinaRequest = grizzlyRequest.getNote(CATALINA_REQUEST_NOTE);
+        Response catalinaResponse = grizzlyRequest.getNote(CATALINA_RESPONSE_NOTE);
 
         // Grizzly already parsed, decoded, and mapped the request.
         // Let's re-use this info here, before firing the
         // requestStartEvent probe, so that the mapping data will be
         // available to any probe event listener via standard
         // ServletRequest APIs (such as getContextPath())
-        MappingData md = req.getNote(MAPPING_DATA);
-        final boolean v3Enabled = md != null;
-        if (request == null) {
+        MappingData mappingData = grizzlyRequest.getNote(MAPPING_DATA);
+        final boolean v3Enabled = mappingData != null;
+        if (catalinaRequest == null) {
 
             // Create objects
-            request = (Request) connector.createRequest();
-            response = (Response) connector.createResponse();
+            catalinaRequest = (Request) connector.createRequest();
+            catalinaResponse = (Response) connector.createResponse();
 
             // Link objects
-            request.setResponse(response);
-            response.setRequest(request);
+            catalinaRequest.setResponse(catalinaResponse);
+            catalinaResponse.setRequest(catalinaRequest);
 
             // Set as notes
-            req.setNote(CATALINA_REQUEST_NOTE, request);
-            req.setNote(CATALINA_RESPONSE_NOTE, response);
-//            res.setNote(ADAPTER_NOTES, response);
+            grizzlyRequest.setNote(CATALINA_REQUEST_NOTE, catalinaRequest);
+            grizzlyRequest.setNote(CATALINA_RESPONSE_NOTE, catalinaResponse);
 
             // Set query string encoding
-            req.getRequest().getRequestURIRef().setDefaultURIEncoding(Charset.forName(connector.getURIEncoding()));
+            grizzlyRequest.getRequest().getRequestURIRef().setDefaultURIEncoding(Charset.forName(connector.getURIEncoding()));
         }
 
-        request.setCoyoteRequest(req);
-        response.setCoyoteResponse(res);
+        catalinaRequest.setGrizzlyRequest(grizzlyRequest);
+        catalinaResponse.setCoyoteResponse(grizzlyResponse);
 
         if (v3Enabled && !compatWithTomcat) {
-            request.setMappingData(md);
-            request.updatePaths(md);
+            catalinaRequest.setMappingData(mappingData);
+            catalinaRequest.updatePaths(mappingData);
         }
 
-        req.addAfterServiceListener(catalinaAfterServiceListener);
+        grizzlyRequest.addAfterServiceListener(catalinaAfterServiceListener);
 
         try {
-            doService(req, request, res, response, v3Enabled);
+            doService(grizzlyRequest, catalinaRequest, grizzlyResponse, catalinaResponse, v3Enabled);
 
             // Request may want to initialize async processing
-            request.onExitService();
+            catalinaRequest.onExitService();
         } catch (Throwable t) {
-            log.log(Level.SEVERE, LogFacade.REQUEST_PROCESSING_EXCEPTION, t);
+            log.log(SEVERE, REQUEST_PROCESSING_EXCEPTION, t);
         }
     }
 
     private void enteringServletContainer(Request req, Response res) {
-        if (interceptors == null)
+        if (interceptors == null) {
             return;
-        for(ServletContainerInterceptor interceptor:interceptors) {
-            try{
+        }
+
+        for (ServletContainerInterceptor interceptor : interceptors) {
+            try {
                 interceptor.preInvoke(req, res);
             } catch (Throwable th) {
-                log.log(Level.SEVERE, LogFacade.INTERNAL_ERROR, th);
+                log.log(SEVERE, INTERNAL_ERROR, th);
             }
         }
     }
 
     private void leavingServletContainer(Request req, Response res) {
-        if (interceptors == null)
+        if (interceptors == null) {
             return;
-        for(ServletContainerInterceptor interceptor:interceptors) {
-            try{
+        }
+
+        for (ServletContainerInterceptor interceptor : interceptors) {
+            try {
                 interceptor.postInvoke(req, res);
             } catch (Throwable th) {
-                log.log(Level.SEVERE, LogFacade.INTERNAL_ERROR, th);
+                log.log(SEVERE, INTERNAL_ERROR, th);
             }
         }
     }
 
     private void initServletInterceptors() {
         try {
-            ServiceLocator services = org.glassfish.internal.api.Globals.getDefaultHabitat();
-            interceptors = services.getAllServices(ServletContainerInterceptor.class);
+            interceptors = getDefaultHabitat().getAllServices(ServletContainerInterceptor.class);
         } catch (Throwable th) {
-            log.log(Level.SEVERE, LogFacade.FAILED_TO_INITIALIZE_THE_INTERCEPTOR, th);
+            log.log(SEVERE, FAILED_TO_INITIALIZE_THE_INTERCEPTOR, th);
         }
     }
 
+    private void doService(
+        final org.glassfish.grizzly.http.server.Request grizzlyRequest, final Request catalinaRequest,
+        final org.glassfish.grizzly.http.server.Response grizzlyResponse, final Response catalinaResponse, final boolean v3Enabled) throws Exception {
 
-    private void doService(final org.glassfish.grizzly.http.server.Request req,
-                           final Request request,
-                           final org.glassfish.grizzly.http.server.Response res,
-                           final Response response,
-                           final boolean v3Enabled)
-            throws Exception {
-
-        // START SJSAS 6331392
         // Check connector for disabled state
         if (!connector.isEnabled()) {
-            String msg = MessageFormat.format(rb.getString(LogFacade.HTTP_LISTENER_DISABLED),
-                                              String.valueOf(connector.getPort()));
-            if (log.isLoggable(Level.FINE)) {
-                log.log(Level.FINE, msg);
+            String msg = MessageFormat.format(rb.getString(HTTP_LISTENER_DISABLED), String.valueOf(connector.getPort()));
+            if (log.isLoggable(FINE)) {
+                log.log(FINE, msg);
             }
-            response.sendError(HttpServletResponse.SC_NOT_FOUND, msg);
+            catalinaResponse.sendError(SC_NOT_FOUND, msg);
             return;
         }
-        // END SJSAS 6331392
 
-////            "X-Powered-By" header is set by GlassfishHttpCodecFilter
-//        if (connector.isXpoweredBy()) {
-//            response.addHeader("X-Powered-By", POWERED_BY);
-//        }
+        // Parse and set Catalina and configuration specific request parameters
+        if (postParseRequest(grizzlyRequest, catalinaRequest, grizzlyResponse, catalinaResponse, v3Enabled)) {
 
-
-        // Parse and set Catalina and configuration specific
-        // request parameters
-        if ( postParseRequest(req, request, res, response, v3Enabled) ) {
-
-            // START S1AS 6188932
-            boolean authPassthroughEnabled =
-                connector.getAuthPassthroughEnabled();
+            boolean authPassthroughEnabled = connector.getAuthPassthroughEnabled();
             ProxyHandler proxyHandler = connector.getProxyHandler();
             if (authPassthroughEnabled && proxyHandler != null) {
 
-                // START SJSAS 6397218
-                if (proxyHandler.getSSLKeysize(
-                        (HttpServletRequest)request.getRequest()) > 0) {
-                    request.setSecure(true);
+                // Otherwise Servlet request.isSecure() value is not propagated when authPassthroughEnabled is set to true
+                if (proxyHandler.getSSLKeysize(catalinaRequest.getRequest()) > 0) {
+                    catalinaRequest.setSecure(true);
                 }
-                // END SJSAS 6397218
 
                 X509Certificate[] certs = null;
                 try {
-                    certs = proxyHandler.getSSLClientCertificateChain(
-                                request.getRequest());
+                    certs = proxyHandler.getSSLClientCertificateChain(catalinaRequest.getRequest());
                 } catch (CertificateException ce) {
-                    log.log(Level.SEVERE, LogFacade.PARSING_CLIENT_CERT_EXCEPTION,
-                            ce);
+                    log.log(SEVERE, PARSING_CLIENT_CERT_EXCEPTION, ce);
                 }
                 if (certs != null) {
-                    request.setAttribute(Globals.CERTIFICATES_ATTR,
-                                         certs);
+                    catalinaRequest.setAttribute(Globals.CERTIFICATES_ATTR, certs);
                 }
 
             }
-            // END S1AS 6188932
-
-////            "Server" header is set by GlassfishHttpCodecFilter
-//            if (serverName != null && !serverName.isEmpty()) {
-//                response.addHeader("Server", serverName);
-//            }
 
             // Invoke the web container
-            connector.requestStartEvent(request.getRequest(),
-                request.getHost(), request.getContext());
+            connector.requestStartEvent(catalinaRequest.getRequest(), catalinaRequest.getHost(), catalinaRequest.getContext());
             Container container = connector.getContainer();
-            enteringServletContainer(request, response);
+            enteringServletContainer(catalinaRequest, catalinaResponse);
             try {
-                request.lockSession();
-                if (container.getPipeline().hasNonBasicValves() ||
-                        container.hasCustomPipeline()) {
-                    container.getPipeline().invoke(request, response);
+                catalinaRequest.lockSession();
+                if (container.getPipeline().hasNonBasicValves() || container.hasCustomPipeline()) {
+                    container.getPipeline().invoke(catalinaRequest, catalinaResponse);
                 } else {
                     // Invoke host directly
-                    Host host = request.getHost();
+                    Host host = catalinaRequest.getHost();
                     if (host == null) {
-                        response.sendError(HttpServletResponse.SC_BAD_REQUEST);
-
-                        String msg = MessageFormat.format(rb.getString(LogFacade.NO_HOST_MATCHES_SERVER_NAME_INFO),
-                                                          request.getRequest().getServerName());
-                        response.setDetailMessage(msg);
+                        catalinaResponse.sendError(SC_BAD_REQUEST);
+                        catalinaResponse.setDetailMessage(
+                            MessageFormat.format(
+                                rb.getString(NO_HOST_MATCHES_SERVER_NAME_INFO),
+                                catalinaRequest.getRequest().getServerName()));
                         return;
                     }
-                    if (host.getPipeline().hasNonBasicValves() ||
-                            host.hasCustomPipeline()) {
-                        host.getPipeline().invoke(request, response);
+
+                    if (host.getPipeline().hasNonBasicValves() || host.hasCustomPipeline()) {
+                        host.getPipeline().invoke(catalinaRequest, catalinaResponse);
                     } else {
                         GlassFishValve hostValve = host.getPipeline().getBasic();
-                        hostValve.invoke(request, response);
+                        hostValve.invoke(catalinaRequest, catalinaResponse);
                         // Error handling
-                        hostValve.postInvoke(request, response);
+                        hostValve.postInvoke(catalinaRequest, catalinaResponse);
                     }
                 }
             } finally {
                 try {
-                    connector.requestEndEvent(request.getRequest(),
-                        request.getHost(), request.getContext(),
-                        response.getStatus());
+                    connector.requestEndEvent(catalinaRequest.getRequest(), catalinaRequest.getHost(), catalinaRequest.getContext(), catalinaResponse.getStatus());
                 } finally {
-                    leavingServletContainer(request, response);
+                    leavingServletContainer(catalinaRequest, catalinaResponse);
                 }
             }
         }
@@ -348,170 +308,117 @@
     }
     // ------------------------------------------------------ Protected Methods
 
-
     /**
      * Parse additional request parameters.
      */
-    protected boolean postParseRequest(final org.glassfish.grizzly.http.server.Request req,
-                                       final Request request,
-                                       final org.glassfish.grizzly.http.server.Response res,
-                                       final Response response,
-                                       final boolean v3Enabled)
-        throws Exception {
+    protected boolean postParseRequest(
+        final org.glassfish.grizzly.http.server.Request grizzlyRequest, final Request catalinaRequest,
+        final org.glassfish.grizzly.http.server.Response grizzlyResponse, final Response catalinaResponse, final boolean v3Enabled) throws Exception {
+
         // XXX the processor may have set a correct scheme and port prior to this point,
         // in ajp13 protocols dont make sense to get the port from the connector...
         // otherwise, use connector configuration
-        request.setSecure(req.isSecure());
+        catalinaRequest.setSecure(grizzlyRequest.isSecure());
 
         // URI decoding
         DataChunk decodedURI;
         try {
-            decodedURI = req.getRequest().getRequestURIRef().getDecodedRequestURIBC();
+            decodedURI = grizzlyRequest.getRequest().getRequestURIRef().getDecodedRequestURIBC();
         } catch (CharConversionException cce) {
-            response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Invalid URI");
+            catalinaResponse.sendError(SC_BAD_REQUEST, "Invalid URI");
             return false;
         }
 
         if (compatWithTomcat || !v3Enabled) {
-//            decodedURI.duplicate(req.requestURI());
-//            try {
-//              req.getURLDecoder().convert(decodedURI, false);
-//            } catch (IOException ioe) {
-//              res.setStatus(400);
-//              res.setMessage("Invalid URI: " + ioe.getMessage());
-//              return false;
-//            }
-
-            /* GlassFish Issue 2339
-            // Normalize decoded URI
-            if (!normalize(req.decodedURI())) {
-                res.setStatus(400);
-                res.setMessage("Invalid URI");
-                return false;
-            }
-            */
 
             // Set the remote principal
-            String principal = req.getRemoteUser();
+            String principal = grizzlyRequest.getRemoteUser();
             if (principal != null) {
-                request.setUserPrincipal(new CoyotePrincipal(principal));
+                catalinaRequest.setUserPrincipal(new CoyotePrincipal(principal));
             }
 
             // Set the authorization type
-            String authtype = req.getAuthType();
+            String authtype = grizzlyRequest.getAuthType();
             if (authtype != null) {
-                request.setAuthType(authtype);
+                catalinaRequest.setAuthType(authtype);
             }
-
-            /* CR 6309511
-            // URI character decoding
-            convertURI(decodedURI, request);
-
-            // Parse session Id
-            parseSessionId(req, request);
-             */
-            // START CR 6309511
-//             URI character decoding
-//            request.convertURI(decodedURI);
-
-            // START GlassFish Issue 2339
-            // Normalize decoded URI
-//            if (!normalize(decodedURI)) {
-//                res.setStatus(400);
-//                res.setMessage("Invalid URI");
-//                return false;
-//            }
-            // END GlassFish Issue 2339
         }
-        // END CR 6309511
 
         /*
-         * Remove any parameters from the URI, so they won't be considered
-         * by the mapping algorithm, and save them in a temporary CharChunk,
-         * so that any session id param may be parsed once the target
-         * context, which may use a custom session parameter name, has been
-         * identified
+         * Remove any parameters from the URI, so they won't be considered by the mapping algorithm, and save them in a
+         * temporary CharChunk, so that any session id param may be parsed once the target context, which may use a custom
+         * session parameter name, has been identified
          */
-        final CharChunk uriParamsCC = request.getURIParams();
+        final CharChunk uriParamsCC = catalinaRequest.getURIParams();
         final CharChunk uriCC = decodedURI.getCharChunk();
         final int semicolon = uriCC.indexOf(';');
         if (semicolon > 0) {
             final int absSemicolon = uriCC.getStart() + semicolon;
-            uriParamsCC.setChars(uriCC.getBuffer(), absSemicolon,
-                uriCC.getEnd() - absSemicolon);
-            decodedURI.setChars(uriCC.getBuffer(), uriCC.getStart(),
-                absSemicolon - uriCC.getStart());
+            uriParamsCC.setChars(uriCC.getBuffer(), absSemicolon, uriCC.getEnd() - absSemicolon);
+            decodedURI.setChars(uriCC.getBuffer(), uriCC.getStart(), absSemicolon - uriCC.getStart());
         }
 
         if (compatWithTomcat || !v3Enabled) {
-            /*mod_jk*/
+            /* mod_jk */
             DataChunk localDecodedURI = decodedURI;
             if (semicolon > 0) {
-                localDecodedURI = req.getNote(DATA_CHUNK);
+                localDecodedURI = grizzlyRequest.getNote(DATA_CHUNK);
                 if (localDecodedURI == null) {
                     localDecodedURI = DataChunk.newInstance();
-                    req.setNote(DATA_CHUNK, localDecodedURI);
+                    grizzlyRequest.setNote(DATA_CHUNK, localDecodedURI);
                 }
                 localDecodedURI.duplicate(decodedURI);
             }
-            connector.getMapper().map(req.getRequest().serverName(), localDecodedURI,
-                                  request.getMappingData());
-            MappingData md = request.getMappingData();
-            req.setNote(MAPPING_DATA, md);
-            request.updatePaths(md);
+
+            connector.getMapper()
+                     .map(
+                       grizzlyRequest.getRequest().serverName(),
+                       localDecodedURI,
+                       catalinaRequest.getMappingData());
+
+            MappingData md = catalinaRequest.getMappingData();
+            grizzlyRequest.setNote(MAPPING_DATA, md);
+            catalinaRequest.updatePaths(md);
         }
 
-        // FIXME: the code below doesnt belongs to here,
-        // this is only have sense
-        // in Http11, not in ajp13..
-        // At this point the Host header has been processed.
-        // Override if the proxyPort/proxyHost are set
+        // FIXME: the code below doesn't belongs to here, this is only have sense in Http11, not in ajp13..
+        // At this point the Host header has been processed. Override if the proxyPort/proxyHost are set
         String proxyName = connector.getProxyName();
         int proxyPort = connector.getProxyPort();
         if (proxyPort != 0) {
-            req.setServerPort(proxyPort);
+            grizzlyRequest.setServerPort(proxyPort);
         }
         if (proxyName != null) {
-            req.setServerName(proxyName);
+            grizzlyRequest.setServerName(proxyName);
         }
 
-        Context ctx = (Context) request.getMappingData().context;
+        Context catalinaContext = (Context) catalinaRequest.getMappingData().context;
 
         // Parse session id
-        if (ctx != null) {
-            if (req.isRequestedSessionIdFromURL() &&
-                    Globals.SESSION_PARAMETER_NAME.equals(ctx.getSessionParameterName())) {
-                request.obtainSessionId();
+        if (catalinaContext != null) {
+            if (grizzlyRequest.isRequestedSessionIdFromURL() && SESSION_PARAMETER_NAME.equals(catalinaContext.getSessionParameterName())) {
+                catalinaRequest.obtainSessionId();
             } else if (!uriParamsCC.isNull()) {
-//            String sessionParam = ";" + ctx.getSessionParameterName() + "=";
-                request.parseSessionId(ctx.getSessionParameterName(), uriParamsCC);
+                catalinaRequest.parseSessionId(catalinaContext.getSessionParameterName(), uriParamsCC);
             }
         }
 
-        // START GlassFish 1024
-        request.setDefaultContext(request.getMappingData().isDefaultContext);
-        // END GlassFish 1024
+        catalinaRequest.setDefaultContext(catalinaRequest.getMappingData().isDefaultContext);
+        catalinaRequest.setContext(catalinaContext);
 
-        // START SJSAS 6253524
-        // request.setContext((Context) request.getMappingData().context);
-        // END SJSAS 6253524
-        // START SJSAS 6253524
-        request.setContext(ctx);
-        // END SJSAS 6253524
-
-        if (ctx != null && !uriParamsCC.isNull()) {
-            request.parseSessionVersion(uriParamsCC);
+        if (catalinaContext != null && !uriParamsCC.isNull()) {
+            catalinaRequest.parseSessionVersion(uriParamsCC);
         }
 
         if (!uriParamsCC.isNull()) {
-            request.parseJReplica(uriParamsCC);
+            catalinaRequest.parseJReplica(uriParamsCC);
         }
 
-        request.setWrapper((Wrapper) request.getMappingData().wrapper);
+        catalinaRequest.setWrapper((Wrapper) catalinaRequest.getMappingData().wrapper);
 
         // Filter trace method
-        if (!connector.getAllowTrace() && Method.TRACE.equals(req.getMethod())) {
-            Wrapper wrapper = request.getWrapper();
+        if (!connector.getAllowTrace() && Method.TRACE.equals(grizzlyRequest.getMethod())) {
+            Wrapper wrapper = catalinaRequest.getWrapper();
             String header = null;
             if (wrapper != null) {
                 String[] methods = wrapper.getServletMethods();
@@ -529,113 +436,86 @@
                     }
                 }
             }
-            res.setStatus(405, "TRACE method is not allowed");
-            res.addHeader("Allow", header);
+            grizzlyResponse.setStatus(405, "TRACE method is not allowed");
+            grizzlyResponse.addHeader("Allow", header);
+
             return false;
         }
 
         // Possible redirect
-        DataChunk redirectPathMB = request.getMappingData().redirectPath;
-        // START SJSAS 6253524
-        // if (!redirectPathMB.isNull()) {
-        // END SJSAS 6253524
-        // START SJSAS 6253524
-        if (!redirectPathMB.isNull()
-            && (!ctx.hasAdHocPaths()
-                || (ctx.getAdHocServletName(((HttpServletRequest)
-                        request.getRequest()).getServletPath()) == null))) {
-        // END SJSAS 6253524
+        DataChunk redirectPathMB = catalinaRequest.getMappingData().redirectPath;
+        if (!redirectPathMB.isNull() && (!catalinaContext.hasAdHocPaths() || (catalinaContext.getAdHocServletName(catalinaRequest.getRequest().getServletPath()) == null))) {
             String redirectPath = redirectPathMB.toString();
-            String query = request.getQueryString();
-            if (request.isRequestedSessionIdFromURL()) {
-                // This is not optimal, but as this is not very common, it
-                // shouldn't matter
-                redirectPath = redirectPath + ";" + ctx.getSessionParameterName() + "="
-                    + request.getRequestedSessionId();
+            String query = catalinaRequest.getQueryString();
+            if (catalinaRequest.isRequestedSessionIdFromURL()) {
+                // This is not optimal, but as this is not very common, it shouldn't matter
+                redirectPath = redirectPath + ";" + catalinaContext.getSessionParameterName() + "=" + catalinaRequest.getRequestedSessionId();
             }
-            // START GlassFish 936
-            redirectPath = response.encode(redirectPath);
-            // END GlassFish 936
+
+            redirectPath = catalinaResponse.encode(redirectPath);
             if (query != null) {
-                // This is not optimal, but as this is not very common, it
-                // shouldn't matter
+                // This is not optimal, but as this is not very common, it shouldn't matter
                 redirectPath = redirectPath + "?" + query;
             }
 
-            // START CR 6590921
-            boolean authPassthroughEnabled =
-                connector.getAuthPassthroughEnabled();
+            boolean authPassthroughEnabled = connector.getAuthPassthroughEnabled();
             ProxyHandler proxyHandler = connector.getProxyHandler();
             if (authPassthroughEnabled && proxyHandler != null) {
-
-                if (proxyHandler.getSSLKeysize(
-                        (HttpServletRequest)request.getRequest()) > 0) {
-                    request.setSecure(true);
+                if (proxyHandler.getSSLKeysize(catalinaRequest.getRequest()) > 0) {
+                    catalinaRequest.setSecure(true);
                 }
             }
-            // END CR 6590921
+
             // Issue a permanent redirect
             // Validating the redirectPath for header injection
             if (InputValidationUtil.validateStringforCRLF(redirectPath)) {
-                response.sendError(403, "Forbidden");
+                catalinaResponse.sendError(403, "Forbidden");
             } else {
-                response.sendRedirect(InputValidationUtil.removeLinearWhiteSpaces(redirectPath),
-                        false);
+                catalinaResponse.sendRedirect(InputValidationUtil.removeLinearWhiteSpaces(redirectPath), false);
             }
 
             return false;
         }
 
         // Parse session Id
-        /* CR 6309511
-        parseSessionCookiesId(req, request);
-         */
-        // START CR 6309511
-        request.parseSessionCookiesId();
-        // END CR 6309511
-
-        // START SJSAS 6346226
-        request.parseJrouteCookie();
-        // END SJSAS 6346226
+        catalinaRequest.parseSessionCookiesId();
+        catalinaRequest.parseJrouteCookie();
 
         return true;
     }
 
-
     /**
      * Normalize URI.
      * <p>
-     * This method normalizes "\", "//", "/./" and "/../". This method will
-     * return false when trying to go above the root, or if the URI contains
-     * a null byte.
+     * This method normalizes "\", "//", "/./" and "/../". This method will return false when trying to go above the root,
+     * or if the URI contains a null byte.
      *
      * @param uriMB URI to be normalized
      */
     public static boolean normalize(MessageBytes uriMB) {
-
         int type = uriMB.getType();
         if (type == MessageBytes.T_CHARS) {
             return normalizeChars(uriMB);
-        } else {
-            return normalizeBytes(uriMB);
         }
+
+        return normalizeBytes(uriMB);
     }
 
-
     private static boolean normalizeBytes(MessageBytes uriMB) {
-
         ByteChunk uriBC = uriMB.getByteChunk();
         byte[] b = uriBC.getBytes();
         int start = uriBC.getStart();
         int end = uriBC.getEnd();
 
         // An empty URL is not acceptable
-        if (start == end)
+        if (start == end) {
             return false;
+        }
 
         // URL * is acceptable
-        if ((end - start == 1) && b[start] == (byte) '*')
-          return true;
+        if ((end - start == 1) && b[start] == (byte) '*') {
+            return true;
+        }
 
         int pos = 0;
         int index = 0;
@@ -676,9 +556,7 @@
         // Note: It is possible to extend the URI by 1 without any side effect
         // as the next character is a non-significant WS.
         if (((end - start) > 2) && (b[end - 1] == (byte) '.')) {
-            if ((b[end - 2] == (byte) '/')
-                || ((b[end - 2] == (byte) '.')
-                    && (b[end - 3] == (byte) '/'))) {
+            if ((b[end - 2] == (byte) '/') || ((b[end - 2] == (byte) '.') && (b[end - 3] == (byte) '/'))) {
                 b[end] = (byte) '/';
                 end++;
             }
@@ -691,10 +569,10 @@
         // Resolve occurrences of "/./" in the normalized path
         while (true) {
             index = uriBC.indexOf("/./", 0, 3, index);
-            if (index < 0)
+            if (index < 0) {
                 break;
-            copyBytes(b, start + index, start + index + 2,
-                      end - start - index - 2);
+            }
+            copyBytes(b, start + index, start + index + 2, end - start - index - 2);
             end = end - 2;
             uriBC.setEnd(end);
         }
@@ -704,19 +582,20 @@
         // Resolve occurrences of "/../" in the normalized path
         while (true) {
             index = uriBC.indexOf("/../", 0, 4, index);
-            if (index < 0)
+            if (index < 0) {
                 break;
+            }
             // Prevent from going outside our context
-            if (index == 0)
+            if (index == 0) {
                 return false;
+            }
             int index2 = -1;
-            for (pos = start + index - 1; (pos >= 0) && (index2 < 0); pos --) {
+            for (pos = start + index - 1; (pos >= 0) && (index2 < 0); pos--) {
                 if (b[pos] == (byte) '/') {
                     index2 = pos;
                 }
             }
-            copyBytes(b, start + index2, start + index + 3,
-                      end - start - index - 3);
+            copyBytes(b, start + index2, start + index + 3, end - start - index - 3);
             end = end + index2 - index - 3;
             uriBC.setEnd(end);
             index = index2;
@@ -725,20 +604,18 @@
         uriBC.setBytes(b, start, end);
 
         return true;
-
     }
 
-
-    private static boolean normalizeChars(MessageBytes uriMB) {
-
-        CharChunk uriCC = uriMB.getCharChunk();
-        char[] c = uriCC.getChars();
-        int start = uriCC.getStart();
-        int end = uriCC.getEnd();
+    private static boolean normalizeChars(MessageBytes uriMessageBytes) {
+        CharChunk uriCharChunk = uriMessageBytes.getCharChunk();
+        char[] c = uriCharChunk.getChars();
+        int start = uriCharChunk.getStart();
+        int end = uriCharChunk.getEnd();
 
         // URL * is acceptable
-        if ((end - start == 1) && c[start] == (char) '*')
-          return true;
+        if ((end - start == 1) && c[start] == '*') {
+            return true;
+        }
 
         int pos = 0;
         int index = 0;
@@ -746,9 +623,9 @@
         // Replace '\' with '/'
         // Check for null char
         for (pos = start; pos < end; pos++) {
-            if (c[pos] == (char) '\\') {
+            if (c[pos] == '\\') {
                 if (ALLOW_BACKSLASH) {
-                    c[pos] = (char) '/';
+                    c[pos] = '/';
                 } else {
                     return false;
                 }
@@ -759,15 +636,15 @@
         }
 
         // The URL must start with '/'
-        if (c[start] != (char) '/') {
+        if (c[start] != '/') {
             return false;
         }
 
         // Replace "//" with "/"
         if (COLLAPSE_ADJACENT_SLASHES) {
             for (pos = start; pos < (end - 1); pos++) {
-                if (c[pos] == (char) '/') {
-                    while ((pos + 1 < end) && (c[pos + 1] == (char) '/')) {
+                if (c[pos] == '/') {
+                    while ((pos + 1 < end) && (c[pos + 1] == '/')) {
                         copyChars(c, pos, pos + 1, end - pos - 1);
                         end--;
                     }
@@ -778,66 +655,61 @@
         // If the URI ends with "/." or "/..", then we append an extra "/"
         // Note: It is possible to extend the URI by 1 without any side effect
         // as the next character is a non-significant WS.
-        if (((end - start) > 2) && (c[end - 1] == (char) '.')) {
-            if ((c[end - 2] == (char) '/')
-                || ((c[end - 2] == (char) '.')
-                    && (c[end - 3] == (char) '/'))) {
-                c[end] = (char) '/';
+        if (((end - start) > 2) && (c[end - 1] == '.')) {
+            if ((c[end - 2] == '/') || ((c[end - 2] == '.') && (c[end - 3] == '/'))) {
+                c[end] = '/';
                 end++;
             }
         }
 
-        uriCC.setEnd(end);
+        uriCharChunk.setEnd(end);
 
         index = 0;
 
         // Resolve occurrences of "/./" in the normalized path
         while (true) {
-            index = uriCC.indexOf("/./", 0, 3, index);
-            if (index < 0)
+            index = uriCharChunk.indexOf("/./", 0, 3, index);
+            if (index < 0) {
                 break;
-            copyChars(c, start + index, start + index + 2,
-                      end - start - index - 2);
+            }
+            copyChars(c, start + index, start + index + 2, end - start - index - 2);
             end = end - 2;
-            uriCC.setEnd(end);
+            uriCharChunk.setEnd(end);
         }
 
         index = 0;
 
         // Resolve occurrences of "/../" in the normalized path
         while (true) {
-            index = uriCC.indexOf("/../", 0, 4, index);
-            if (index < 0)
+            index = uriCharChunk.indexOf("/../", 0, 4, index);
+            if (index < 0) {
                 break;
+            }
             // Prevent from going outside our context
-            if (index == 0)
+            if (index == 0) {
                 return false;
+            }
             int index2 = -1;
-            for (pos = start + index - 1; (pos >= 0) && (index2 < 0); pos --) {
-                if (c[pos] == (char) '/') {
+            for (pos = start + index - 1; (pos >= 0) && (index2 < 0); pos--) {
+                if (c[pos] == '/') {
                     index2 = pos;
                 }
             }
-            copyChars(c, start + index2, start + index + 3,
-                      end - start - index - 3);
+            copyChars(c, start + index2, start + index + 3, end - start - index - 3);
             end = end + index2 - index - 3;
-            uriCC.setEnd(end);
+            uriCharChunk.setEnd(end);
             index = index2;
         }
 
-        uriCC.setChars(c, start, end);
+        uriCharChunk.setChars(c, start, end);
 
         return true;
-
     }
 
-
     // ------------------------------------------------------ Protected Methods
 
-
     /**
-     * Copy an array of bytes to a different position. Used during
-     * normalization.
+     * Copy an array of bytes to a different position. Used during normalization.
      */
     protected static void copyBytes(byte[] b, int dest, int src, int len) {
         for (int pos = 0; pos < len; pos++) {
@@ -845,10 +717,8 @@
         }
     }
 
-
     /**
-     * Copy an array of chars to a different position. Used during
-     * normalization.
+     * Copy an array of chars to a different position. Used during normalization.
      */
     private static void copyChars(char[] c, int dest, int src, int len) {
         for (int pos = 0; pos < len; pos++) {
@@ -856,17 +726,15 @@
         }
     }
 
-
     /**
      * Log a message on the Logger associated with our Container (if any)
      *
      * @param message Message to be logged
      */
     protected void log(String message) {
-        log.log(Level.INFO, message);
+        log.log(INFO, message);
     }
 
-
     /**
      * Log a message on the Logger associated with our Container (if any)
      *
@@ -874,58 +742,25 @@
      * @param throwable Associated exception
      */
     protected void log(String message, Throwable throwable) {
-        log.log(Level.SEVERE, message, throwable);
+        log.log(SEVERE, message, throwable);
     }
 
-
-     /**
-      * Character conversion of the a US-ASCII MessageBytes.
-      */
-    /* CR 6309511
-     protected void convertMB(MessageBytes mb) {
-
-        // This is of course only meaningful for bytes
-        if (mb.getType() != MessageBytes.T_BYTES)
-            return;
-
-        ByteChunk bc = mb.getByteChunk();
-        CharChunk cc = mb.getCharChunk();
-        cc.allocate(bc.getLength(), -1);
-
-        // Default encoding: fast conversion
-        byte[] bbuf = bc.getBuffer();
-        char[] cbuf = cc.getBuffer();
-        int start = bc.getStart();
-        for (int i = 0; i < bc.getLength(); i++) {
-            cbuf[i] = (char) (bbuf[i + start] & 0xff);
-        }
-        mb.setChars(cbuf, 0, bc.getLength());
-
-     }
-     */
-
-
-    // START SJSAS 6349248
     /**
-     * Notify all container event listeners that a particular event has
-     * occurred for this Adapter.  The default implementation performs
-     * this notification synchronously using the calling thread.
+     * Notify all container event listeners that a particular event has occurred for this Adapter. The default
+     * implementation performs this notification synchronously using the calling thread.
      *
      * @param type Event type
      * @param data Event data
      */
     public void fireAdapterEvent(String type, Object data) {
-        if ( connector != null && connector.getContainer() != null) {
-            try{
-                ((ContainerBase)connector.getContainer())
-                    .fireContainerEvent(type,data);
-            } catch (Throwable t){
-                log.log(Level.SEVERE, LogFacade.REQUEST_PROCESSING_EXCEPTION, t);
+        if (connector != null && connector.getContainer() != null) {
+            try {
+                ((ContainerBase) connector.getContainer()).fireContainerEvent(type, data);
+            } catch (Throwable t) {
+                log.log(SEVERE, REQUEST_PROCESSING_EXCEPTION, t);
             }
         }
     }
-    // END SJSAS 6349248
-
 
     /**
      * Return true when an instance is executed the same way it does in Tomcat.
@@ -934,18 +769,15 @@
         return compatWithTomcat;
     }
 
-
     /**
-     * <tt>true</tt> if this class needs to be compatible with Tomcat
-     * Adapter class. Since Tomcat Adapter implementation doesn't support
-     * the afterService method, the afterService method must be invoked
-     * inside the service method.
+     * <tt>true</tt> if this class needs to be compatible with Tomcat Adapter class. Since Tomcat Adapter implementation
+     * doesn't support the afterService method, the afterService method must be invoked inside the service method.
      */
     public void setCompatWithTomcat(boolean compatWithTomcat) {
         this.compatWithTomcat = compatWithTomcat;
 
         // Add server header
-        if (compatWithTomcat){
+        if (compatWithTomcat) {
             serverName = "Apache/" + serverName;
         } else {
             // Recalculate.
@@ -953,7 +785,6 @@
         }
     }
 
-
     /**
      * Gets the port of this CoyoteAdapter.
      *
@@ -964,31 +795,30 @@
     }
 
     /**
-     * AfterServiceListener, which is responsible for recycle catalina request and response
-     * objects.
+     * AfterServiceListener, which is responsible for recycle catalina request and response objects.
      */
     static final class CatalinaAfterServiceListener implements AfterServiceListener {
 
         @Override
-        public void onAfterService(final org.glassfish.grizzly.http.server.Request request) {
-            final Request servletRequest = request.getNote(CATALINA_REQUEST_NOTE);
-            final Response servletResponse = request.getNote(CATALINA_RESPONSE_NOTE);
+        public void onAfterService(final org.glassfish.grizzly.http.server.Request grizzlyRequest) {
+            final Request catalinaRequest = grizzlyRequest.getNote(CATALINA_REQUEST_NOTE);
+            final Response catalinaResponse = grizzlyRequest.getNote(CATALINA_RESPONSE_NOTE);
 
-            if (servletRequest != null) {
+            if (catalinaRequest != null) {
                 try {
-                    if (!servletRequest.isUpgrade()) {
-                        servletResponse.finishResponse();
+                    if (!catalinaRequest.isUpgrade()) {
+                        catalinaResponse.finishResponse();
                     } else {
-                        servletResponse.setUpgrade(servletRequest.isUpgrade());
+                        catalinaResponse.setUpgrade(catalinaRequest.isUpgrade());
                     }
                 } catch (Exception e) {
-                    log.log(Level.SEVERE, LogFacade.REQUEST_PROCESSING_EXCEPTION, e);
+                    log.log(SEVERE, REQUEST_PROCESSING_EXCEPTION, e);
                 } finally {
                     try {
-                        servletRequest.unlockSession();
+                        catalinaRequest.unlockSession();
                     } finally {
-                        servletRequest.recycle();
-                        servletResponse.recycle();
+                        catalinaRequest.recycle();
+                        catalinaResponse.recycle();
                     }
                 }
             }
diff --git a/appserver/web/web-core/src/main/java/org/apache/catalina/connector/CoyotePrincipal.java b/appserver/web/web-core/src/main/java/org/apache/catalina/connector/CoyotePrincipal.java
index be32267..0962575 100644
--- a/appserver/web/web-core/src/main/java/org/apache/catalina/connector/CoyotePrincipal.java
+++ b/appserver/web/web-core/src/main/java/org/apache/catalina/connector/CoyotePrincipal.java
@@ -1,4 +1,5 @@
 /*
+ * Copyright (c) 2022, 2022 Contributors to the Eclipse Foundation
  * Copyright (c) 1997-2018 Oracle and/or its affiliates. All rights reserved.
  * Copyright 2004 The Apache Software Foundation
  *
@@ -21,8 +22,8 @@
 import java.security.Principal;
 
 /**
- * Generic implementation of <strong>java.security.Principal</strong> that
- * is used to represent principals authenticated at the protocol handler level.
+ * Generic implementation of <strong>java.security.Principal</strong> that is used to represent principals authenticated
+ * at the protocol handler level.
  *
  * @author Remy Maucherat
  * @version $Revision: 1.2 $ $Date: 2005/12/08 01:28:34 $
@@ -32,45 +33,35 @@
 
     private static final long serialVersionUID = 1L;
 
-
     // ----------------------------------------------------------- Constructors
 
-
     public CoyotePrincipal(String name) {
-
         this.name = name;
-
     }
 
-
     // ------------------------------------------------------------- Properties
 
-
     /**
      * The username of the user represented by this Principal.
      */
-    protected String name = null;
+    protected String name;
 
+    @Override
     public String getName() {
-        return (this.name);
+        return name;
     }
 
-
     // --------------------------------------------------------- Public Methods
 
-
     /**
-     * Return a String representation of this object, which exposes only
-     * information that should be public.
+     * Return a String representation of this object, which exposes only information that should be public.
      */
+    @Override
     public String toString() {
-
         StringBuilder sb = new StringBuilder("CoyotePrincipal[");
-        sb.append(this.name);
+        sb.append(name);
         sb.append("]");
         return (sb.toString());
-
     }
 
-
 }
diff --git a/appserver/web/web-core/src/main/java/org/apache/catalina/connector/CoyoteWriter.java b/appserver/web/web-core/src/main/java/org/apache/catalina/connector/CoyoteWriter.java
index 8f910f4..43f06ee 100644
--- a/appserver/web/web-core/src/main/java/org/apache/catalina/connector/CoyoteWriter.java
+++ b/appserver/web/web-core/src/main/java/org/apache/catalina/connector/CoyoteWriter.java
@@ -1,4 +1,5 @@
 /*
+ * Copyright (c) 2022, 2022 Contributors to the Eclipse Foundation
  * Copyright (c) 1997-2018 Oracle and/or its affiliates. All rights reserved.
  * Copyright 2004 The Apache Software Foundation
  *
@@ -17,12 +18,13 @@
 
 package org.apache.catalina.connector;
 
-import org.apache.catalina.LogFacade;
+import static org.apache.catalina.LogFacade.OBJECT_INVALID_SCOPE_EXCEPTION;
 
 import java.io.IOException;
 import java.io.PrintWriter;
 import java.util.ResourceBundle;
 
+import org.apache.catalina.LogFacade;
 
 /**
  * Coyote implementation of the servlet writer.
@@ -30,53 +32,40 @@
  * @author Remy Maucherat
  * @author Kin-man Chung
  */
-public class CoyoteWriter
-    extends PrintWriter {
+public class CoyoteWriter extends PrintWriter {
 
     private static final ResourceBundle rb = LogFacade.getLogger().getResourceBundle();
 
-
     // -------------------------------------------------------------- Constants
 
-
     // No need for a do privileged block - every web app has permission to read
     // this by default
-    private static final char[] LINE_SEP =
-        System.getProperty("line.separator").toCharArray();
-
-
+    private static final char[] LINE_SEP = System.getProperty("line.separator").toCharArray();
 
     // ----------------------------------------------------- Instance Variables
 
-
     protected OutputBuffer ob;
     protected boolean error = false;
 
-
     // ----------------------------------------------------------- Constructors
 
-
     public CoyoteWriter(OutputBuffer ob) {
         super(ob);
         this.ob = ob;
     }
 
-
     // --------------------------------------------------------- Public Methods
 
-
     /**
-    * Prevent cloning the facade.
-    */
-    protected Object clone()
-        throws CloneNotSupportedException {
+     * Prevent cloning the facade.
+     */
+    @Override
+    protected Object clone() throws CloneNotSupportedException {
         throw new CloneNotSupportedException();
     }
 
-
     // -------------------------------------------------------- Package Methods
 
-
     /**
      * Clear facade.
      */
@@ -91,15 +80,14 @@
         error = false;
     }
 
-
     // --------------------------------------------------------- Writer Methods
 
-
+    @Override
     public void flush() {
 
         // Disallow operation if the object has gone out of scope
         if (ob == null) {
-            throw new IllegalStateException(rb.getString(LogFacade.OBJECT_INVALID_SCOPE_EXCEPTION));
+            throw new IllegalStateException(rb.getString(OBJECT_INVALID_SCOPE_EXCEPTION));
         }
 
         if (error)
@@ -113,41 +101,40 @@
 
     }
 
-
+    @Override
     public void close() {
-
         // Disallow operation if the object has gone out of scope
         if (ob == null) {
-            throw new IllegalStateException(rb.getString(LogFacade.OBJECT_INVALID_SCOPE_EXCEPTION));
+            throw new IllegalStateException(rb.getString(OBJECT_INVALID_SCOPE_EXCEPTION));
         }
 
         // We don't close the PrintWriter - super() is not called,
         // so the stream can be reused. We close ob.
         try {
             ob.close();
-        } catch (IOException ex ) {
+        } catch (IOException ex) {
             // Ignore
         }
         error = false;
 
     }
 
-
+    @Override
     public boolean checkError() {
         // Disallow operation if the object has gone out of scope
         if (ob == null) {
-            throw new IllegalStateException(rb.getString(LogFacade.OBJECT_INVALID_SCOPE_EXCEPTION));
+            throw new IllegalStateException(rb.getString(OBJECT_INVALID_SCOPE_EXCEPTION));
         }
         flush();
         return error;
     }
 
-
+    @Override
     public void write(int c) {
 
         // Disallow operation if the object has gone out of scope
         if (ob == null) {
-            throw new IllegalStateException(rb.getString(LogFacade.OBJECT_INVALID_SCOPE_EXCEPTION));
+            throw new IllegalStateException(rb.getString(OBJECT_INVALID_SCOPE_EXCEPTION));
         }
 
         if (error)
@@ -161,12 +148,12 @@
 
     }
 
-
+    @Override
     public void write(char buf[], int off, int len) {
 
         // Disallow operation if the object has gone out of scope
         if (ob == null) {
-            throw new IllegalStateException(rb.getString(LogFacade.OBJECT_INVALID_SCOPE_EXCEPTION));
+            throw new IllegalStateException(rb.getString(OBJECT_INVALID_SCOPE_EXCEPTION));
         }
 
         if (error)
@@ -179,17 +166,16 @@
         }
     }
 
-
+    @Override
     public void write(char buf[]) {
         write(buf, 0, buf.length);
     }
 
-
+    @Override
     public void write(String s, int off, int len) {
-
         // Disallow operation if the object has gone out of scope
         if (ob == null) {
-            throw new IllegalStateException(rb.getString(LogFacade.OBJECT_INVALID_SCOPE_EXCEPTION));
+            throw new IllegalStateException(rb.getString(OBJECT_INVALID_SCOPE_EXCEPTION));
         }
 
         if (error)
@@ -203,17 +189,16 @@
 
     }
 
-
+    @Override
     public void write(String s) {
         write(s, 0, s.length());
     }
 
-
     public void write(byte[] buff, int off, int len) {
 
         // Disallow operation if the object has gone out of scope
         if (ob == null) {
-            throw new IllegalStateException(rb.getString(LogFacade.OBJECT_INVALID_SCOPE_EXCEPTION));
+            throw new IllegalStateException(rb.getString(OBJECT_INVALID_SCOPE_EXCEPTION));
         }
 
         if (error)
@@ -226,10 +211,9 @@
         }
     }
 
-
     // ---------------------------------------------------- PrintWriter Methods
 
-
+    @Override
     public void print(boolean b) {
         if (b) {
             write("true");
@@ -238,37 +222,37 @@
         }
     }
 
-
+    @Override
     public void print(char c) {
         write(c);
     }
 
-
+    @Override
     public void print(int i) {
         write(String.valueOf(i));
     }
 
-
+    @Override
     public void print(long l) {
         write(String.valueOf(l));
     }
 
-
+    @Override
     public void print(float f) {
         write(String.valueOf(f));
     }
 
-
+    @Override
     public void print(double d) {
         write(String.valueOf(d));
     }
 
-
+    @Override
     public void print(char s[]) {
         write(s);
     }
 
-
+    @Override
     public void print(String s) {
         if (s == null) {
             s = "null";
@@ -276,65 +260,65 @@
         write(s);
     }
 
-
+    @Override
     public void print(Object obj) {
         write(String.valueOf(obj));
     }
 
-
+    @Override
     public void println() {
         write(LINE_SEP);
     }
 
-
+    @Override
     public void println(boolean b) {
         print(b);
         println();
     }
 
-
+    @Override
     public void println(char c) {
         print(c);
         println();
     }
 
-
+    @Override
     public void println(int i) {
         print(i);
         println();
     }
 
-
+    @Override
     public void println(long l) {
         print(l);
         println();
     }
 
-
+    @Override
     public void println(float f) {
         print(f);
         println();
     }
 
-
+    @Override
     public void println(double d) {
         print(d);
         println();
     }
 
-
+    @Override
     public void println(char c[]) {
         print(c);
         println();
     }
 
-
+    @Override
     public void println(String s) {
         print(s);
         println();
     }
 
-
+    @Override
     public void println(Object o) {
         print(o);
         println();
diff --git a/appserver/web/web-core/src/main/java/org/apache/catalina/connector/Request.java b/appserver/web/web-core/src/main/java/org/apache/catalina/connector/Request.java
index bdabcac..0bf9345 100644
--- a/appserver/web/web-core/src/main/java/org/apache/catalina/connector/Request.java
+++ b/appserver/web/web-core/src/main/java/org/apache/catalina/connector/Request.java
@@ -1,4 +1,5 @@
 /*
+ * Copyright (c) 2022, 2022 Contributors to the Eclipse Foundation.
  * Copyright (c) 1997-2018 Oracle and/or its affiliates. All rights reserved.
  * Copyright 2004 The Apache Software Foundation
  *
@@ -17,6 +18,52 @@
 
 package org.apache.catalina.connector;
 
+import static com.sun.logging.LogCleanerUtil.getSafeHeaderValue;
+import static jakarta.servlet.DispatcherType.REQUEST;
+import static jakarta.servlet.RequestDispatcher.ERROR_EXCEPTION;
+import static jakarta.servlet.RequestDispatcher.INCLUDE_SERVLET_PATH;
+import static jakarta.servlet.http.HttpServletResponse.SC_INTERNAL_SERVER_ERROR;
+import static java.util.logging.Level.FINEST;
+import static java.util.logging.Level.SEVERE;
+import static java.util.logging.Level.WARNING;
+import static org.apache.catalina.Globals.CERTIFICATES_ATTR;
+import static org.apache.catalina.Globals.CIPHER_SUITE_ATTR;
+import static org.apache.catalina.Globals.DISPATCHER_TYPE_ATTR;
+import static org.apache.catalina.Globals.ISO_8859_1_ENCODING;
+import static org.apache.catalina.Globals.JREPLICA_PARAMETER;
+import static org.apache.catalina.Globals.JREPLICA_SESSION_NOTE;
+import static org.apache.catalina.Globals.KEY_SIZE_ATTR;
+import static org.apache.catalina.Globals.REQUEST_FACADE_HELPER;
+import static org.apache.catalina.Globals.SESSION_COOKIE_NAME;
+import static org.apache.catalina.Globals.SESSION_VERSIONS_REQUEST_ATTRIBUTE;
+import static org.apache.catalina.Globals.SESSION_VERSION_COOKIE_NAME;
+import static org.apache.catalina.Globals.SESSION_VERSION_PARAMETER;
+import static org.apache.catalina.Globals.SSL_SESSION_ID_ATTR;
+import static org.apache.catalina.LogFacade.ALREADY_AUTHENTICATED;
+import static org.apache.catalina.LogFacade.ASYNC_ALREADY_COMPLETE_EXCEPTION;
+import static org.apache.catalina.LogFacade.ATTRIBUTE_EVENT_LISTENER_EXCEPTION;
+import static org.apache.catalina.LogFacade.BREAKING_BACKGROUND_LOCK_EXCEPTION;
+import static org.apache.catalina.LogFacade.GETINPUTSTREAM_BEEN_CALLED_EXCEPTION;
+import static org.apache.catalina.LogFacade.INTERNAL_LOGOUT_ERROR;
+import static org.apache.catalina.LogFacade.INVALID_URI_CHAR_ENCODING;
+import static org.apache.catalina.LogFacade.INVALID_URI_ENCODING;
+import static org.apache.catalina.LogFacade.LOGIN_WITH_AUTH_CONFIG;
+import static org.apache.catalina.LogFacade.NO_AUTHENTICATOR;
+import static org.apache.catalina.LogFacade.NULL_ATTRIBUTE_NAME_EXCEPTION;
+import static org.apache.catalina.LogFacade.REQUEST_CALLED_WITHOUT_MULTIPART_CONFIG_EXCEPTION;
+import static org.apache.catalina.LogFacade.REQUEST_NOT_PUT_INTO_ASYNC_MODE_EXCEPTION;
+import static org.apache.catalina.LogFacade.REQUEST_WITHIN_SCOPE_OF_FILTER_OR_SERVLET_EXCEPTION;
+import static org.apache.catalina.LogFacade.START_ASYNC_CALLED_AGAIN_EXCEPTION;
+import static org.apache.catalina.LogFacade.START_ASYNC_CALLED_OUTSIDE_SCOPE_EXCEPTION;
+import static org.apache.catalina.LogFacade.UNABLE_DETERMINE_CLIENT_ADDRESS;
+import static org.apache.catalina.LogFacade.UNABLE_PERFORM_ERROR_DISPATCH;
+import static org.apache.catalina.LogFacade.UNABLE_RESOLVE_IP_EXCEPTION;
+import static org.apache.catalina.LogFacade.UNABLE_SET_REQUEST_CHARS;
+import static org.apache.catalina.authenticator.Constants.REQ_SSOID_NOTE;
+import static org.apache.catalina.authenticator.Constants.REQ_SSO_VERSION_NOTE;
+import static org.apache.catalina.connector.Constants.AUTHORIZATION_HEADER;
+import static org.apache.catalina.connector.Constants.JROUTE_COOKIE;
+
 import java.io.BufferedReader;
 import java.io.CharConversionException;
 import java.io.File;
@@ -35,44 +82,29 @@
 import java.security.PrivilegedExceptionAction;
 import java.text.MessageFormat;
 import java.text.SimpleDateFormat;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Enumeration;
+import java.util.EventListener;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.ResourceBundle;
+import java.util.TimeZone;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.logging.Level;
 import java.util.logging.Logger;
+
 import javax.security.auth.Subject;
-import jakarta.servlet.AsyncContext;
-import jakarta.servlet.DispatcherType;
-import jakarta.servlet.FilterChain;
-import jakarta.servlet.RequestDispatcher;
-import jakarta.servlet.ServletConnection;
-import jakarta.servlet.ServletContext;
-import jakarta.servlet.ServletException;
-import jakarta.servlet.ServletInputStream;
-import jakarta.servlet.ServletRequest;
-import jakarta.servlet.ServletRequestAttributeEvent;
-import jakarta.servlet.ServletRequestAttributeListener;
-import jakarta.servlet.ServletResponse;
-import jakarta.servlet.SessionCookieConfig;
-import jakarta.servlet.http.Cookie;
-import jakarta.servlet.http.HttpServletRequest;
-import jakarta.servlet.http.HttpServletResponse;
-import jakarta.servlet.http.HttpSession;
-import jakarta.servlet.http.HttpUpgradeHandler;
-import jakarta.servlet.http.Part;
-import jakarta.servlet.http.PushBuilder;
-import jakarta.servlet.http.WebConnection;
 
-import com.sun.appserv.ProxyHandler;
-import jakarta.servlet.http.MappingMatch;
-
-import static com.sun.logging.LogCleanerUtil.neutralizeForLog;
 import org.apache.catalina.Context;
-import org.apache.catalina.LogFacade;
 import org.apache.catalina.Globals;
 import org.apache.catalina.Host;
 import org.apache.catalina.HttpRequest;
 import org.apache.catalina.HttpResponse;
+import org.apache.catalina.LogFacade;
 import org.apache.catalina.Manager;
 import org.apache.catalina.Pipeline;
 import org.apache.catalina.Realm;
@@ -88,7 +120,9 @@
 import org.apache.catalina.security.SecurityUtil;
 import org.apache.catalina.session.PersistentManagerBase;
 import org.apache.catalina.session.StandardSession;
-import org.apache.catalina.util.*;
+import org.apache.catalina.util.Enumerator;
+import org.apache.catalina.util.ParameterMap;
+import org.apache.catalina.util.RequestUtil;
 import org.glassfish.grizzly.Buffer;
 import org.glassfish.grizzly.CompletionHandler;
 import org.glassfish.grizzly.EmptyCompletionHandler;
@@ -106,8 +140,31 @@
 import org.glassfish.grizzly.memory.Buffers;
 import org.glassfish.grizzly.utils.Charsets;
 import org.glassfish.web.valve.GlassFishValve;
+
+import com.sun.appserv.ProxyHandler;
+
+import jakarta.servlet.AsyncContext;
+import jakarta.servlet.DispatcherType;
+import jakarta.servlet.FilterChain;
+import jakarta.servlet.RequestDispatcher;
+import jakarta.servlet.ServletConnection;
+import jakarta.servlet.ServletContext;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.ServletInputStream;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletRequestAttributeEvent;
+import jakarta.servlet.ServletRequestAttributeListener;
+import jakarta.servlet.ServletResponse;
+import jakarta.servlet.SessionCookieConfig;
+import jakarta.servlet.http.Cookie;
 import jakarta.servlet.http.HttpServletMapping;
-import static com.sun.logging.LogCleanerUtil.getSafeHeaderValue;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpSession;
+import jakarta.servlet.http.HttpUpgradeHandler;
+import jakarta.servlet.http.Part;
+import jakarta.servlet.http.PushBuilder;
+import jakarta.servlet.http.WebConnection;
 
 /**
  * Wrapper object for the Coyote request.
@@ -117,8 +174,7 @@
  * @author Rajiv Mordani
  * @version $Revision: 1.67.2.9 $ $Date: 2008/04/17 18:37:34 $
  */
-public class Request
-        implements HttpRequest, HttpServletRequest {
+public class Request implements HttpRequest, HttpServletRequest {
 
     private static final Logger log = LogFacade.getLogger();
     private static final ResourceBundle rb = log.getResourceBundle();
@@ -127,214 +183,204 @@
     /**
      * Descriptive information about this Request implementation.
      */
-    protected static final String info =
-            "org.apache.catalina.connector.Request/1.0";
+    protected static final String info = "org.apache.catalina.connector.Request/1.0";
 
     /**
      * Whether or not to enforce scope checking of this object.
      */
-    private static boolean enforceScope = false;
+    private static boolean enforceScope;
 
     /**
-     * The notes key for the password used to authenticate this user.
-     */
-    private static final String SESS_PASSWORD_NOTE =
-      "org.apache.catalina.session.PASSWORD";
-
-
-    /**
-     * The notes key for the username used to authenticate this user.
-     */
-    private static final String SESS_USERNAME_NOTE =
-      "org.apache.catalina.session.USERNAME";
-
-    // END CR 6309511
-    // START OF SJSAS 6231069
-    /*
-    protected SimpleDateFormat formats[] = {
-    new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz", Locale.US),
-    new SimpleDateFormat("EEEEEE, dd-MMM-yy HH:mm:ss zzz", Locale.US),
-    new SimpleDateFormat("EEE MMMM d HH:mm:ss yyyy", Locale.US)
-    }*/
-    /**
      * The set of SimpleDateFormat formats to use in getDateHeader().
      *
-     * Notice that because SimpleDateFormat is not thread-safe, we can't
-     * declare formats[] as a static variable.
+     * Notice that because SimpleDateFormat is not thread-safe, we can't declare formats[] as a static variable.
      */
-    private static ThreadLocal staticDateFormats = new ThreadLocal() {
+    private static ThreadLocal<Object> staticDateFormats = new ThreadLocal<>() {
 
         @Override
         protected Object initialValue() {
             SimpleDateFormat[] f = new SimpleDateFormat[3];
-            f[0] = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz",
-                    Locale.US);
-            f[1] = new SimpleDateFormat("EEEEEE, dd-MMM-yy HH:mm:ss zzz",
-                    Locale.US);
+            f[0] = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz", Locale.US);
+            f[1] = new SimpleDateFormat("EEEEEE, dd-MMM-yy HH:mm:ss zzz", Locale.US);
             f[2] = new SimpleDateFormat("EEE MMMM d HH:mm:ss yyyy", Locale.US);
             return f;
         }
     };
     protected SimpleDateFormat formats[];
-    // END OF SJSAS 6231069
+
     /**
-     * ThreadLocal object to keep track of the reentrancy status of each thread.
-     * It contains a byte[] object whose single element is either 0 (initial
-     * value or no reentrancy), or 1 (current thread is reentrant). When a
-     * thread exits the implies method, byte[0] is alwasy reset to 0.
+     * ThreadLocal object to keep track of the reentrancy status of each thread. It contains a byte[] object whose single
+     * element is either 0 (initial value or no reentrancy), or 1 (current thread is reentrant). When a thread exits the
+     * implies method, byte[0] is alwasy reset to 0.
      */
-    private static ThreadLocal reentrancyStatus;
+    private static ThreadLocal<Object> reentrancyStatus = new ThreadLocal<>() {
+        @Override
+        protected synchronized Object initialValue() {
+            return new byte[] { 0 };
+        }
+    };
 
-    static {
-        reentrancyStatus = new ThreadLocal() {
-
-            @Override
-            protected synchronized Object initialValue() {
-                return new byte[]{0};
-            }
-        };
-    }
     // ----------------------------------------------------- Instance Variables
 
-
     /**
      * The set of cookies associated with this Request.
      */
-    protected ArrayList<Cookie> cookies = new ArrayList<Cookie>();
+    protected ArrayList<Cookie> cookies = new ArrayList<>();
+
     /**
      * The default Locale if none are specified.
      */
     protected static final Locale defaultLocale = Locale.getDefault();
+
     /**
      * The attributes associated with this Request, keyed by attribute name.
      */
-    protected Map<String, Object> attributes = new HashMap<String, Object>();
+    protected Map<String, Object> attributes = new HashMap<>();
+
     /**
      * The preferred Locales associated with this Request.
      */
-    protected ArrayList<Locale> locales = new ArrayList<Locale>();
+    protected ArrayList<Locale> locales = new ArrayList<>();
+
     /**
-     * Internal notes associated with this request by Catalina components
-     * and event listeners.
+     * Internal notes associated with this request by Catalina components and event listeners.
      */
-    private Map<String, Object> notes = new HashMap<String, Object>();
+    private Map<String, Object> notes = new HashMap<>();
+
     /**
      * Authentication type.
      */
-    protected String authType = null;
+    protected String authType;
+
     /**
      * The current dispatcher type.
      */
-    protected Object dispatcherTypeAttr = null;
+    protected Object dispatcherTypeAttr;
+
     /**
      * The associated input buffer.
      */
     protected InputBuffer inputBuffer = new InputBuffer();
+
     /**
      * ServletInputStream.
      */
-    protected CoyoteInputStream inputStream =
-            new CoyoteInputStream(inputBuffer);
+    protected CoyoteInputStream inputStream = new CoyoteInputStream(inputBuffer);
+
     /**
      * Reader.
      */
     protected CoyoteReader reader = new CoyoteReader(inputBuffer);
+
     /**
      * Using stream flag.
      */
-    protected boolean usingInputStream = false;
+    protected boolean usingInputStream;
+
     /**
      * Using writer flag.
      */
-    protected boolean usingReader = false;
+    protected boolean usingReader;
+
     /**
      * User principal.
      */
-    protected Principal userPrincipal = null;
+    protected Principal userPrincipal;
+
     /**
      * Session parsed flag.
      */
-    protected boolean sessionParsed = false;
+    protected boolean sessionParsed;
 
-    protected boolean parametersProcessed = false;
+    protected boolean parametersProcessed;
+
     /**
      * Cookies parsed flag.
      */
-    protected boolean cookiesParsed = false;
+    protected boolean cookiesParsed;
+
     /**
      * Secure flag.
      */
-    protected boolean secure = false;
+    protected boolean secure;
+
     /**
      * The Subject associated with the current AccessControllerContext
      */
-    protected Subject subject = null;
+    protected Subject subject;
     /**
      * Post data buffer.
      */
     protected static final int CACHED_POST_LEN = 8192;
-    protected byte[] postData = null;
+    protected byte[] postData;
     /**
      * Hash map used in the getParametersMap method.
      */
-    protected ParameterMap<String, String[]> parameterMap = new ParameterMap<String, String[]>();
+    protected ParameterMap<String, String[]> parameterMap = new ParameterMap<>();
+
     /**
      * The currently active session for this request.
      */
-    protected Session session = null;
+    protected Session session;
+
     /**
      * The current request dispatcher path.
      */
-    protected Object requestDispatcherPath = null;
+    protected Object requestDispatcherPath;
+
     /**
      * Was the requested session ID received in a cookie?
      */
-    protected boolean requestedSessionCookie = false;
+    protected boolean requestedSessionCookie;
+
     /**
      * The requested session ID (if any) for this request.
      */
-    protected String requestedSessionId = null;
+    protected String requestedSessionId;
 
     /**
      * The requested session version (if any) for this request.
      */
-    protected String requestedSessionVersion = null;
+    protected String requestedSessionVersion;
 
     private boolean isRequestedSessionIdFromSecureCookie;
 
-    // The requested session cookie path, see IT 7426
+    // The requested session cookie path
     protected String requestedSessionCookiePath;
 
     // Temporary holder for URI params from which session id is parsed
-    protected CharChunk uriParamsCC = new CharChunk();
+    protected CharChunk uriParamsCharChunk = new CharChunk();
+
     /**
      * Was the requested session ID received in a URL?
      */
-    protected boolean requestedSessionURL = false;
+    protected boolean requestedSessionURL;
+
     /**
      * The socket through which this Request was received.
      */
-    protected Socket socket = null;
+    protected Socket socket;
+
     /**
      * Parse locales.
      */
-    protected boolean localesParsed = false;
-    /**
-     * The string parser we will use for parsing request lines.
-     */
-    private StringParser parser = new StringParser();
+    protected boolean localesParsed;
+
     /**
      * Local port
      */
     protected int localPort = -1;
+
     /**
      * Remote address.
      */
-    protected String remoteAddr = null;
+    protected String remoteAddr;
+
     /**
      * Remote host.
      */
-    protected String remoteHost = null;
+    protected String remoteHost;
+
     /**
      * Remote port
      */
@@ -342,90 +388,83 @@
     /**
      * Local address
      */
-    protected String localName = null;
+    protected String localName;
     /**
      * Local address
      */
-    protected String localAddr = null;
-    /** After the request is mapped to a ServletContext, we can also
-     * map it to a logger.
-     */
-    /* CR 6309511
-    protected Log log=null;
-     */
-    // START CR 6415120
+    protected String localAddr;
+
     /**
-     * Whether or not access to resources in WEB-INF or META-INF needs to be
-     * checked.
+     * Whether or not access to resources in WEB-INF or META-INF needs to be checked.
      */
     protected boolean checkRestrictedResources = true;
-    // END CR 6415120
+
     /**
      * has findSession been called and returned null already
      */
-    private boolean unsuccessfulSessionFind = false;
+    private boolean unsuccessfulSessionFind;
 
     /*
-     * Are we supposed to honor the unsuccessfulSessionFind flag?
-     * WS overrides this to false.
+     * Are we supposed to honor the unsuccessfulSessionFind flag? WS overrides this to false.
      */
     protected boolean checkUnsuccessfulSessionFind = true;
-    // START S1AS 4703023
+
     /**
      * The current application dispatch depth.
      */
     private int dispatchDepth = 0;
+
     /**
      * The maximum allowed application dispatch depth.
      */
     private static int maxDispatchDepth = Constants.DEFAULT_MAX_DISPATCH_DEPTH;
-    // END S1AS 4703023
-    // START SJSAS 6346226
     private String jrouteId;
-    // END SJSAS 6346226
-    // START GlassFish 896
     private SessionTracker sessionTracker = new SessionTracker();
-    // END GlassFish 896
-    // START GlassFish 1024
-    private boolean isDefaultContext = false;
-    // END GlassFish 1024
-    private String requestURI = null;
+    private boolean isDefaultContext;
+    private String requestURI;
+
     /**
-     * Coyote request.
+     * Grizzly request.
      */
-    protected org.glassfish.grizzly.http.server.Request coyoteRequest;
+    protected org.glassfish.grizzly.http.server.Request grizzlyRequest;
+
     /**
      * The facade associated with this request.
      */
-    protected RequestFacade facade = null;
+    protected RequestFacade facade;
+
     /**
-     * Request facade that masks the fact that a request received
-     * at the root context was mapped to a default-web-module (if such a
-     * mapping exists).
-     * For example, its getContextPath() will return "/" rather than the
-     * context root of the default-web-module.
+     * Request facade that masks the fact that a request received at the root context was mapped to a default-web-module (if
+     * such a mapping exists). For example, its getContextPath() will return "/" rather than the context root of the
+     * default-web-module.
      */
-    protected RequestFacade defaultContextMaskingFacade = null;
+    protected RequestFacade defaultContextMaskingFacade;
+
     /**
      * The response with which this request is associated.
      */
-    protected org.apache.catalina.Response response = null;
+    protected org.apache.catalina.Response response;
+
     /**
      * Associated Catalina connector.
      */
     protected org.apache.catalina.Connector connector;
+
     /**
      * Mapping data.
      */
     protected MappingData mappingData = new MappingData();
+
     /**
      * Associated wrapper.
      */
-    protected Wrapper wrapper = null;
+    protected Wrapper wrapper;
+
     /**
      * Filter chain associated with the request.
      */
-    protected FilterChain filterChain = null;
+    protected FilterChain filterChain;
+
     /**
      * Async operation
      */
@@ -441,11 +480,12 @@
      * Multi-Part support
      */
     private Multipart multipart;
+
     /**
      * Associated context.
      */
-    protected Context context = null;
-    protected ServletContext servletContext = null;
+    protected Context context;
+    protected ServletContext servletContext;
     // Associated StandardHost valve for error dispatches
     protected GlassFishValve hostValve;
 
@@ -456,19 +496,17 @@
     private String servletPath;
     private String pathInfo;
 
-    private boolean initRequestFacadeHelper = false;
+    private boolean initRequestFacadeHelper;
 
     // Allow Grizzly to auto detect a remote close connection.
-    public final static boolean discardDisconnectEvent =
-            Boolean.getBoolean("org.glassfish.grizzly.discardDisconnect");
+    public final static boolean discardDisconnectEvent = Boolean.getBoolean("org.glassfish.grizzly.discardDisconnect");
 
     /*
      * An upgrade request is received
      */
-    private boolean upgrade = false;
-
-    private boolean afterService = false;
-    private boolean resume = false;
+    private boolean upgrade;
+    private boolean afterService;
+    private boolean resume;
 
     /*
      * The HttpUpgradeHandler to be used for upgrade request
@@ -480,15 +518,12 @@
      */
     private WebConnection webConnection;
 
-
     // ----------------------------------------------------------- Constructor
     public Request() {
-        // START OF SJSAS 6231069
         formats = (SimpleDateFormat[]) staticDateFormats.get();
         formats[0].setTimeZone(TimeZone.getTimeZone("GMT"));
         formats[1].setTimeZone(TimeZone.getTimeZone("GMT"));
         formats[2].setTimeZone(TimeZone.getTimeZone("GMT"));
-        // END OF SJSAS 6231069
     }
 
     // --------------------------------------------------------- Public Methods
@@ -497,8 +532,8 @@
      *
      * @param grizzlyRequest The Coyote request
      */
-    public void setCoyoteRequest(org.glassfish.grizzly.http.server.Request grizzlyRequest) {
-        this.coyoteRequest = grizzlyRequest;
+    public void setGrizzlyRequest(org.glassfish.grizzly.http.server.Request grizzlyRequest) {
+        this.grizzlyRequest = grizzlyRequest;
         inputBuffer.setRequest(grizzlyRequest);
         inputBuffer.setRequest(this);
     }
@@ -506,8 +541,8 @@
     /**
      * Get the Coyote request.
      */
-    public org.glassfish.grizzly.http.server.Request getCoyoteRequest() {
-        return this.coyoteRequest;
+    public org.glassfish.grizzly.http.server.Request getGrizzlyRequest() {
+        return this.grizzlyRequest;
     }
 
     /**
@@ -518,12 +553,10 @@
     }
 
     /**
-     * Release all object references, and initialize instance variables, in
-     * preparation for reuse of this object.
+     * Release all object references, and initialize instance variables, in preparation for reuse of this object.
      */
     @Override
     public void recycle() {
-
         if (isAsyncStarted()) {
             return;
         }
@@ -577,16 +610,13 @@
         requestedSessionId = null;
         requestedSessionCookiePath = null;
         requestedSessionURL = false;
-        uriParamsCC.recycle();
-
-        // START GlassFish 896
+        uriParamsCharChunk.recycle();
         sessionTracker.reset();
-        // END GlassFish 896
 
-        /* CR 6309511
-        log = null;
+        /*
+         * CR 6309511 log = null;
          */
-        dispatchDepth = 0; // S1AS 4703023
+        dispatchDepth = 0;
 
         parameterMap.setLocked(false);
         parameterMap.clear();
@@ -659,7 +689,7 @@
      */
     @Override
     public String getAuthorization() {
-        return coyoteRequest.getHeader(Constants.AUTHORIZATION_HEADER);
+        return grizzlyRequest.getHeader(AUTHORIZATION_HEADER);
     }
 
     /**
@@ -689,10 +719,9 @@
     }
 
     /**
-     * Set the Context within which this Request is being processed.  This
-     * must be called as soon as the appropriate Context is identified, because
-     * it identifies the value to be returned by <code>getContextPath()</code>,
-     * and thus enables parsing of the request URI.
+     * Set the Context within which this Request is being processed. This must be called as soon as the appropriate Context
+     * is identified, because it identifies the value to be returned by <code>getContextPath()</code>, and thus enables
+     * parsing of the request URI.
      *
      * @param context The newly associated Context
      */
@@ -716,26 +745,22 @@
                     if (resEncoding != null) {
                         getResponse().getResponse().setCharacterEncoding(resEncoding);
                     }
-                } catch(UnsupportedEncodingException e) {
+                } catch (UnsupportedEncodingException e) {
                     throw new RuntimeException(e);
                 }
             }
         }
-        // START GlassFish 896
+
         initSessionTracker();
-        // END GlassFish 896
     }
 
-    // START GlassFish 1024
     /**
-     * @param isDefaultContext true if this request was mapped to a context
-     * with an empty context root that is backed by the vitual server's
-     * default-web-module
+     * @param isDefaultContext true if this request was mapped to a context with an empty context root that is backed by the
+     * vitual server's default-web-module
      */
     public void setDefaultContext(boolean isDefaultContext) {
         this.isDefaultContext = isDefaultContext;
     }
-    // END GlassFish 1024
 
     /**
      * Get filter chain associated with the request.
@@ -764,9 +789,8 @@
     }
 
     /**
-     * Set the Host within which this Request is being processed.  This
-     * must be called as soon as the appropriate Host is identified, and
-     * before the Request is passed to a context.
+     * Set the Host within which this Request is being processed. This must be called as soon as the appropriate Host is
+     * identified, and before the Request is passed to a context.
      *
      * @param host The newly associated Host
      */
@@ -776,8 +800,7 @@
     }
 
     /**
-     * Return descriptive information about this Request implementation and
-     * the corresponding version number, in the format
+     * Return descriptive information about this Request implementation and the corresponding version number, in the format
      * <code>&lt;description&gt;/&lt;version&gt;</code>.
      */
     @Override
@@ -787,11 +810,9 @@
 
     @Override
     public HttpServletMapping getHttpServletMapping() {
-        HttpServletMapping result;
-
-        result = new MappingImpl(mappingData);
-        return result;
+        return new MappingImpl(mappingData);
     }
+
     /**
      * Return mapping data.
      */
@@ -807,27 +828,23 @@
     }
 
     /**
-     * Update this instance with the content of the {@link MappingData}
-     * {@link MappingData}
+     * Update this instance with the content of the {@link MappingData} {@link MappingData}
      */
-    public void updatePaths(MappingData md) {
+    public void updatePaths(MappingData mappingData) {
         /*
-         * Save the path components of this request, in order for them to
-         * survive when the mapping data get recycled as the request
-         * returns to the container after it has been put into async mode.
-         * This is required to satisfy the requirements of subsequent async
-         * dispatches (or error dispatches, if the async operation times out,
-         * and no async listeners have been registered that could be notified
-         * at their onTimeout method)
+         * Save the path components of this request, in order for them to survive when the mapping data get recycled as the
+         * request returns to the container after it has been put into async mode. This is required to satisfy the requirements
+         * of subsequent async dispatches (or error dispatches, if the async operation times out, and no async listeners have
+         * been registered that could be notified at their onTimeout method)
          */
-        pathInfo = md.pathInfo.toString();
-        servletPath = md.wrapperPath.toString();
-        contextPath = md.contextPath.toString();
+        pathInfo = mappingData.pathInfo.toString();
+        servletPath = mappingData.wrapperPath.toString();
+        contextPath = mappingData.contextPath.toString();
     }
 
     /**
-     * Gets the <code>ServletRequest</code> for which this object
-     * is the facade. This method must be implemented by a subclass.
+     * Gets the <code>ServletRequest</code> for which this object is the facade. This method must be implemented by a
+     * subclass.
      */
     @Override
     public HttpServletRequest getRequest() {
@@ -835,12 +852,11 @@
     }
 
     /**
-     * Gets the <code>ServletRequest</code> for which this object
-     * is the facade. This method must be implemented by a subclass.
+     * Gets the <code>ServletRequest</code> for which this object is the facade. This method must be implemented by a
+     * subclass.
      *
-     * @param maskDefaultContextMapping true if the fact that a request
-     * received at the root context was mapped to a default-web-module will
-     * be masked, false otherwise
+     * @param maskDefaultContextMapping true if the fact that a request received at the root context was mapped to a
+     * default-web-module will be masked, false otherwise
      */
     @Override
     public HttpServletRequest getRequest(boolean maskDefaultContextMapping) {
@@ -850,24 +866,23 @@
             }
 
             if (!initRequestFacadeHelper) {
-                attributes.put(Globals.REQUEST_FACADE_HELPER,
-                        facade.getRequestFacadeHelper());
+                attributes.put(REQUEST_FACADE_HELPER, facade.getRequestFacadeHelper());
                 initRequestFacadeHelper = true;
             }
+
             return facade;
-        } else {
-            if (defaultContextMaskingFacade == null) {
-                defaultContextMaskingFacade = new RequestFacade(this, true);
-            }
-
-            if (!initRequestFacadeHelper) {
-                attributes.put(Globals.REQUEST_FACADE_HELPER,
-                        defaultContextMaskingFacade.getRequestFacadeHelper());
-                initRequestFacadeHelper = true;
-            }
-
-            return defaultContextMaskingFacade;
         }
+
+        if (defaultContextMaskingFacade == null) {
+            defaultContextMaskingFacade = new RequestFacade(this, true);
+        }
+
+        if (!initRequestFacadeHelper) {
+            attributes.put(REQUEST_FACADE_HELPER, defaultContextMaskingFacade.getRequestFacadeHelper());
+            initRequestFacadeHelper = true;
+        }
+
+        return defaultContextMaskingFacade;
     }
 
     /**
@@ -875,7 +890,7 @@
      */
     @Override
     public org.apache.catalina.Response getResponse() {
-        return this.response;
+        return response;
     }
 
     /**
@@ -892,10 +907,8 @@
     }
 
     /**
-     * Return the Socket (if any) through which this Request was received.
-     * This should <strong>only</strong> be used to access underlying state
-     * information about this Socket, such as the SSLSession associated with
-     * an SSLSocket.
+     * Return the Socket (if any) through which this Request was received. This should <strong>only</strong> be used to
+     * access underlying state information about this Socket, such as the SSLSession associated with an SSLSocket.
      */
     @Override
     public Socket getSocket() {
@@ -938,6 +951,7 @@
     public void setStream(InputStream stream) {
         // Ignore
     }
+
     /**
      * URI byte to char converter (not recycled).
      */
@@ -968,9 +982,9 @@
     }
 
     /**
-     * Set the Wrapper within which this Request is being processed.  This
-     * must be called as soon as the appropriate Wrapper is identified, and
-     * before the Request is ultimately passed to an application servlet.
+     * Set the Wrapper within which this Request is being processed. This must be called as soon as the appropriate Wrapper
+     * is identified, and before the Request is ultimately passed to an application servlet.
+     *
      * @param wrapper The newly associated Wrapper
      */
     @Override
@@ -980,14 +994,12 @@
 
     // ------------------------------------------------- Request Public Methods
     /**
-     * Create and return a ServletInputStream to read the content
-     * associated with this Request.
+     * Create and return a ServletInputStream to read the content associated with this Request.
      *
      * @exception IOException if an input/output error occurs
      */
     @Override
-    public ServletInputStream createInputStream()
-            throws IOException {
+    public ServletInputStream createInputStream() throws IOException {
         if (inputStream == null) {
             inputStream = new CoyoteInputStream(inputBuffer);
         }
@@ -995,8 +1007,7 @@
     }
 
     /**
-     * Perform whatever actions are required to flush and close the input
-     * stream or reader, in a single operation.
+     * Perform whatever actions are required to flush and close the input stream or reader, in a single operation.
      *
      * @exception IOException if an input/output error occurs
      */
@@ -1006,8 +1017,8 @@
     }
 
     /**
-     * Return the object bound with the specified name to the internal notes
-     * for this request, or <code>null</code> if no such binding exists.
+     * Return the object bound with the specified name to the internal notes for this request, or <code>null</code> if no
+     * such binding exists.
      *
      * @param name Name of the note to be returned
      */
@@ -1017,8 +1028,7 @@
     }
 
     /**
-     * Return an Iterator containing the String names of all notes bindings
-     * that exist for this request.
+     * Return an Iterator containing the String names of all notes bindings that exist for this request.
      */
     @Override
     public Iterator<String> getNoteNames() {
@@ -1026,8 +1036,7 @@
     }
 
     /**
-     * Remove any object bound to the specified name in the internal notes
-     * for this request.
+     * Remove any object bound to the specified name in the internal notes for this request.
      *
      * @param name Name of the note to be removed
      */
@@ -1037,8 +1046,8 @@
     }
 
     /**
-     * Bind an object to a specified name in the internal notes associated
-     * with this request, replacing any existing binding for this name.
+     * Bind an object to a specified name in the internal notes associated with this request, replacing any existing binding
+     * for this name.
      *
      * @param name Name to which the object should be bound
      * @param value Object to be bound to the specified name
@@ -1055,12 +1064,11 @@
      */
     @Override
     public void setContentLength(int length) {
-        coyoteRequest.getRequest().setContentLength(length);
+        grizzlyRequest.getRequest().setContentLength(length);
     }
 
     /**
-     * Set the content type (and optionally the character encoding)
-     * associated with this Request.  For example,
+     * Set the content type (and optionally the character encoding) associated with this Request. For example,
      * <code>text/html; charset=ISO-8859-4</code>.
      *
      * @param type The new content type
@@ -1091,8 +1099,7 @@
     }
 
     /**
-     * Set the fully qualified name of the remote client associated with this
-     * Request.
+     * Set the fully qualified name of the remote client associated with this Request.
      *
      * @param remoteHost The remote host name
      */
@@ -1101,8 +1108,7 @@
     }
 
     /**
-     * Set the value to be returned by <code>isSecure()</code>
-     * for this Request.
+     * Set the value to be returned by <code>isSecure()</code> for this Request.
      *
      * @param secure The new isSecure value
      */
@@ -1118,7 +1124,7 @@
      */
     @Override
     public void setServerName(String name) {
-        coyoteRequest.setServerName(name);
+        grizzlyRequest.setServerName(name);
     }
 
     /**
@@ -1128,13 +1134,11 @@
      */
     @Override
     public void setServerPort(int port) {
-        coyoteRequest.setServerPort(port);
+        grizzlyRequest.setServerPort(port);
     }
 
-    // START CR 6415120
     /**
-     * Set whether or not access to resources under WEB-INF or META-INF
-     * needs to be checked.
+     * Set whether or not access to resources under WEB-INF or META-INF needs to be checked.
      */
     @Override
     public void setCheckRestrictedResources(boolean check) {
@@ -1142,100 +1146,79 @@
     }
 
     /**
-     * Return whether or not access to resources under WEB-INF or META-INF
-     * needs to be checked.
+     * Return whether or not access to resources under WEB-INF or META-INF needs to be checked.
      */
     @Override
     public boolean getCheckRestrictedResources() {
         return this.checkRestrictedResources;
     }
-    // END CR 6415120
 
     // ------------------------------------------------- ServletRequest Methods
     /**
-     * Return the specified request attribute if it exists; otherwise, return
-     * <code>null</code>.
+     * Return the specified request attribute if it exists; otherwise, return <code>null</code>.
      *
      * @param name Name of the request attribute to return
      */
     @Override
     public Object getAttribute(String name) {
 
-        if (name.equals(Globals.DISPATCHER_TYPE_ATTR)) {
-            return dispatcherTypeAttr == null
-                    ? DispatcherType.REQUEST
-                    : dispatcherTypeAttr;
-        } else if (name.equals(Globals.DISPATCHER_REQUEST_PATH_ATTR)) {
-            return requestDispatcherPath == null
-                    ? getRequestPathMB().toString()
-                    : requestDispatcherPath.toString();
-        } else if (name.equals(Globals.CONSTRAINT_URI)) {
-            return getRequestPathMB() != null
-                    ? getRequestPathMB().toString() : null;
+        if (name.equals(DISPATCHER_TYPE_ATTR)) {
+            return dispatcherTypeAttr == null ? REQUEST : dispatcherTypeAttr;
         }
 
-        Object attr = attributes.get(name);
-
-        if (attr != null) {
-            return attr;
+        if (name.equals(Globals.DISPATCHER_REQUEST_PATH_ATTR)) {
+            return requestDispatcherPath == null ? getRequestPathMB().toString() : requestDispatcherPath.toString();
         }
 
-        attr = coyoteRequest.getAttribute(name);
-        if (attr != null) {
-            return attr;
+        if (name.equals(Globals.CONSTRAINT_URI)) {
+            return getRequestPathMB() != null ? getRequestPathMB().toString() : null;
         }
+
+        Object attribute = attributes.get(name);
+
+        if (attribute != null) {
+            return attribute;
+        }
+
+        attribute = grizzlyRequest.getAttribute(name);
+        if (attribute != null) {
+            return attribute;
+        }
+
         if (Globals.SSL_CERTIFICATE_ATTR.equals(name)) {
             // @TODO Implement SSL rehandshake
-            RequestUtils.populateCertificateAttribute(coyoteRequest);
-            attr = getAttribute(Globals.CERTIFICATES_ATTR);
-            if (attr != null) {
-                attributes.put(name, attr);
+            RequestUtils.populateCertificateAttribute(grizzlyRequest);
+            attribute = getAttribute(CERTIFICATES_ATTR);
+            if (attribute != null) {
+                attributes.put(name, attribute);
             }
         } else if (isSSLAttribute(name)) {
-            /* SJSAS 6419950
-            coyoteRequest.action(ActionCode.ACTION_REQ_SSL_ATTRIBUTE,
-            coyoteRequest);
-            attr = coyoteRequest.getAttribute(Globals.CERTIFICATES_ATTR);
-            if( attr != null) {
-            attributes.put(Globals.CERTIFICATES_ATTR, attr);
-            }
-            attr = coyoteRequest.getAttribute(Globals.CIPHER_SUITE_ATTR);
-            if(attr != null) {
-            attributes.put(Globals.CIPHER_SUITE_ATTR, attr);
-            }
-            attr = coyoteRequest.getAttribute(Globals.KEY_SIZE_ATTR);
-            if(attr != null) {
-            attributes.put(Globals.KEY_SIZE_ATTR, attr);
-            }
-             */
-            // START SJSAS 6419950
-            RequestUtils.populateSSLAttributes(coyoteRequest);
-            // END SJSAS 6419950
-            attr = attributes.get(name);
+            RequestUtils.populateSSLAttributes(grizzlyRequest);
+            attribute = attributes.get(name);
         }
-        return attr;
+
+        return attribute;
     }
 
     /**
      * Test if a given name is one of the special Servlet-spec SSL attributes.
      */
     static boolean isSSLAttribute(String name) {
-        return Globals.CERTIFICATES_ATTR.equals(name) ||
-                Globals.CIPHER_SUITE_ATTR.equals(name) ||
-                Globals.KEY_SIZE_ATTR.equals(name) ||
-                Globals.SSL_SESSION_ID_ATTR.equals(name);
+        return
+            CERTIFICATES_ATTR.equals(name) || CIPHER_SUITE_ATTR.equals(name) ||
+            KEY_SIZE_ATTR.equals(name) || SSL_SESSION_ID_ATTR.equals(name);
     }
 
     /**
-     * Return the names of all request attributes for this Request, or an
-     * empty <code>Enumeration</code> if there are none.
+     * Return the names of all request attributes for this Request, or an empty <code>Enumeration</code> if there are none.
      */
     @Override
     public Enumeration<String> getAttributeNames() {
         if (isSecure()) {
             populateSSLAttributes();
         }
-        return new Enumerator<String>(attributes.keySet(), true);
+
+        return new Enumerator<>(attributes.keySet(), true);
     }
 
     /**
@@ -1243,7 +1226,7 @@
      */
     @Override
     public String getCharacterEncoding() {
-        return coyoteRequest.getCharacterEncoding();
+        return grizzlyRequest.getCharacterEncoding();
     }
 
     /**
@@ -1251,7 +1234,7 @@
      */
     @Override
     public int getContentLength() {
-        return coyoteRequest.getContentLength();
+        return grizzlyRequest.getContentLength();
     }
 
     /**
@@ -1259,7 +1242,7 @@
      */
     @Override
     public long getContentLengthLong() {
-        return coyoteRequest.getContentLengthLong();
+        return grizzlyRequest.getContentLengthLong();
     }
 
     /**
@@ -1267,21 +1250,18 @@
      */
     @Override
     public String getContentType() {
-        return coyoteRequest.getContentType();
+        return grizzlyRequest.getContentType();
     }
 
     /**
-     * Return the servlet input stream for this Request.  The default
-     * implementation returns a servlet input stream created by
-     * <code>createInputStream()</code>.
+     * Return the servlet input stream for this Request. The default implementation returns a servlet input stream created
+     * by <code>createInputStream()</code>.
      *
-     * @exception IllegalStateException if <code>getReader()</code> has
-     *  already been called for this request
+     * @exception IllegalStateException if <code>getReader()</code> has already been called for this request
      * @exception IOException if an input/output error occurs
      */
     @Override
     public ServletInputStream getInputStream() throws IOException {
-
         if (usingReader) {
             throw new IllegalStateException(rb.getString(LogFacade.GETREADER_BEEN_CALLED_EXCEPTION));
         }
@@ -1290,106 +1270,74 @@
         if (inputStream == null) {
             inputStream = new CoyoteInputStream(inputBuffer);
         }
-        return inputStream;
 
+        return inputStream;
     }
 
     /**
-     * Return the preferred Locale that the client will accept content in,
-     * based on the value for the first <code>Accept-Language</code> header
-     * that was encountered.  If the request did not specify a preferred
-     * language, the server's default Locale is returned.
+     * Return the preferred Locale that the client will accept content in, based on the value for the first
+     * <code>Accept-Language</code> header that was encountered. If the request did not specify a preferred language, the
+     * server's default Locale is returned.
      */
     @Override
     public Locale getLocale() {
-        return coyoteRequest.getLocale();
-//        if (!localesParsed) {
-//            parseLocales();
-//        }
-//
-//        if (locales.size() > 0) {
-//            return locales.get(0);
-//        } else {
-//            return defaultLocale;
-//        }
-
+        return grizzlyRequest.getLocale();
     }
 
     /**
-     * Return the set of preferred Locales that the client will accept
-     * content in, based on the values for any <code>Accept-Language</code>
-     * headers that were encountered.  If the request did not specify a
-     * preferred language, the server's default Locale is returned.
+     * Return the set of preferred Locales that the client will accept content in, based on the values for any
+     * <code>Accept-Language</code> headers that were encountered. If the request did not specify a preferred language, the
+     * server's default Locale is returned.
      */
     @Override
     public Enumeration<Locale> getLocales() {
-        return new Enumerator<Locale>(coyoteRequest.getLocales());
-//        if (!localesParsed) {
-//            parseLocales();
-//        }
-//
-//        if (locales.size() > 0) {
-//            return (new Enumerator<Locale>(locales));
-//        }
-//        ArrayList<Locale> results = new ArrayList<Locale>();
-//        results.add(defaultLocale);
-//        return (new Enumerator<Locale>(results));
+        return new Enumerator<>(grizzlyRequest.getLocales());
     }
 
     private void processParameters() {
         if (parametersProcessed) {
             return;
         }
+
         getCharacterEncoding();
         if (isMultipartConfigured() && getMethod().equalsIgnoreCase("POST")) {
             String contentType = getContentType();
-            if (contentType != null &&
-                        contentType.startsWith("multipart/form-data")) {
+            if (contentType != null && contentType.startsWith("multipart/form-data")) {
                 getMultipart().init();
             }
         }
+
         parametersProcessed = true;
     }
 
     /**
-     * Return the value of the specified request parameter, if any; otherwise,
-     * return <code>null</code>.  If there is more than one value defined,
-     * return only the first one.
+     * Return the value of the specified request parameter, if any; otherwise, return <code>null</code>. If there is more
+     * than one value defined, return only the first one.
      *
      * @param name Name of the desired request parameter
      */
     @Override
     public String getParameter(String name) {
-
-/*
-        if (!requestParametersParsed) {
-            parseRequestParameters();
-        }
-*/
         processParameters();
 
-        return coyoteRequest.getParameter(name);
+        return grizzlyRequest.getParameter(name);
     }
 
     /**
-     * Returns a <code>Map</code> of the parameters of this request.
-     * Request parameters are extra information sent with the request.
-     * For HTTP servlets, parameters are contained in the query string
-     * or posted form data.
+     * Returns a <code>Map</code> of the parameters of this request. Request parameters are extra information sent with the
+     * request. For HTTP servlets, parameters are contained in the query string or posted form data.
      *
-     * @return A <code>Map</code> containing parameter names as keys
-     *  and parameter values as map values.
+     * @return A <code>Map</code> containing parameter names as keys and parameter values as map values.
      */
     @Override
     public Map<String, String[]> getParameterMap() {
-
         if (parameterMap.isLocked()) {
             return parameterMap;
         }
 
-        Enumeration<String> e = getParameterNames();
-        while (e.hasMoreElements()) {
-            String name = e.nextElement();
+        Enumeration<String> paramaterNames = getParameterNames();
+        while (paramaterNames.hasMoreElements()) {
+            String name = paramaterNames.nextElement();
             String[] values = getParameterValues(name);
             parameterMap.put(name, values);
         }
@@ -1397,7 +1345,6 @@
         parameterMap.setLocked(true);
 
         return parameterMap;
-
     }
 
     /**
@@ -1405,32 +1352,21 @@
      */
     @Override
     public Enumeration<String> getParameterNames() {
-/*
-        if (!requestParametersParsed) {
-            parseRequestParameters();
-        }
-*/
         processParameters();
 
-        return new Enumerator<String>(coyoteRequest.getParameterNames());
+        return new Enumerator<>(grizzlyRequest.getParameterNames());
     }
 
     /**
-     * Return the defined values for the specified request parameter, if any;
-     * otherwise, return <code>null</code>.
+     * Return the defined values for the specified request parameter, if any; otherwise, return <code>null</code>.
      *
      * @param name Name of the desired request parameter
      */
     @Override
     public String[] getParameterValues(String name) {
-/*
-        if (!requestParametersParsed) {
-            parseRequestParameters();
-        }
-*/
         processParameters();
 
-        return coyoteRequest.getParameterValues(name);
+        return grizzlyRequest.getParameterValues(name);
     }
 
     /**
@@ -1438,31 +1374,27 @@
      */
     @Override
     public String getProtocol() {
-        return coyoteRequest.getProtocol().getProtocolString();
+        return grizzlyRequest.getProtocol().getProtocolString();
     }
 
     /**
-     * Read the Reader wrapping the input stream for this Request.  The
-     * default implementation wraps a <code>BufferedReader</code> around the
-     * servlet input stream returned by <code>createInputStream()</code>.
+     * Read the Reader wrapping the input stream for this Request. The default implementation wraps a
+     * <code>BufferedReader</code> around the servlet input stream returned by <code>createInputStream()</code>.
      *
-     * @exception IllegalStateException if <code>getInputStream()</code>
-     *  has already been called for this request
+     * @exception IllegalStateException if <code>getInputStream()</code> has already been called for this request
      * @exception IOException if an input/output error occurs
      */
     @Override
     public BufferedReader getReader() throws IOException {
-
         if (usingInputStream) {
-            throw new IllegalStateException(rb.getString(LogFacade.GETINPUTSTREAM_BEEN_CALLED_EXCEPTION));
+            throw new IllegalStateException(rb.getString(GETINPUTSTREAM_BEEN_CALLED_EXCEPTION));
         }
 
         usingReader = true;
         try {
             inputBuffer.checkConverter();
         } catch (UnsupportedCharsetException uce) {
-            UnsupportedEncodingException uee =
-                    new UnsupportedEncodingException(uce.getMessage());
+            UnsupportedEncodingException uee = new UnsupportedEncodingException(uce.getMessage());
             uee.initCause(uce);
             throw uee;
         }
@@ -1470,6 +1402,7 @@
         if (reader == null) {
             reader = new CoyoteReader(inputBuffer);
         }
+
         return reader;
     }
 
@@ -1480,25 +1413,22 @@
     public String getRemoteAddr() {
         if (remoteAddr == null) {
 
-            // START SJSAS 6347215
             if (connector.getAuthPassthroughEnabled() && connector.getProxyHandler() != null) {
-                remoteAddr = connector.getProxyHandler().getRemoteAddress(
-                        getRequest());
-                if (remoteAddr == null && log.isLoggable(Level.FINEST)) {
-                    log.log(Level.FINEST, LogFacade.UNABLE_DETERMINE_CLIENT_ADDRESS);
+                remoteAddr = connector.getProxyHandler().getRemoteAddress(getRequest());
+                if (remoteAddr == null && log.isLoggable(FINEST)) {
+                    log.log(FINEST, UNABLE_DETERMINE_CLIENT_ADDRESS);
                 }
                 return remoteAddr;
             }
-            // END SJSAS 6347215
 
             if (socket != null) {
                 InetAddress inet = socket.getInetAddress();
                 remoteAddr = inet.getHostAddress();
             } else {
-//                coyoteRequest.action(ActionCode.ACTION_REQ_HOST_ADDR_ATTRIBUTE, coyoteRequest);
-                remoteAddr = coyoteRequest.getRemoteAddr();
+                remoteAddr = grizzlyRequest.getRemoteAddr();
             }
         }
+
         return remoteAddr;
     }
 
@@ -1510,35 +1440,31 @@
         if (remoteHost == null) {
             if (!connector.getEnableLookups()) {
                 remoteHost = getRemoteAddr();
-                // START SJSAS 6347215
             } else if (connector.getAuthPassthroughEnabled() && connector.getProxyHandler() != null) {
-                String addr =
-                        connector.getProxyHandler().getRemoteAddress(getRequest());
+                String addr = connector.getProxyHandler().getRemoteAddress(getRequest());
                 if (addr != null) {
                     try {
                         remoteHost = InetAddress.getByName(addr).getHostName();
                     } catch (UnknownHostException e) {
-                        String msg = MessageFormat.format(rb.getString(LogFacade.UNABLE_RESOLVE_IP_EXCEPTION), addr);
-                        log.log(Level.WARNING, msg, e);
+                        String msg = MessageFormat.format(rb.getString(UNABLE_RESOLVE_IP_EXCEPTION), addr);
+                        log.log(WARNING, msg, e);
                     }
-                } else if (log.isLoggable(Level.FINEST)) {
-                    log.log(Level.FINEST, LogFacade.UNABLE_DETERMINE_CLIENT_ADDRESS);
+                } else if (log.isLoggable(FINEST)) {
+                    log.log(FINEST, UNABLE_DETERMINE_CLIENT_ADDRESS);
                 }
-                // END SJSAS 6347215
             } else if (socket != null) {
                 InetAddress inet = socket.getInetAddress();
                 remoteHost = inet.getHostName();
             } else {
-//                coyoteRequest.action(ActionCode.ACTION_REQ_HOST_ATTRIBUTE, coyoteRequest);
-                remoteHost = coyoteRequest.getRemoteHost();
+                remoteHost = grizzlyRequest.getRemoteHost();
             }
         }
+
         return remoteHost;
     }
 
     /**
-     * Returns the Internet Protocol (IP) source port of the client
-     * or last proxy that sent the request.
+     * Returns the Internet Protocol (IP) source port of the client or last proxy that sent the request.
      */
     @Override
     public int getRemotePort() {
@@ -1546,16 +1472,15 @@
             if (socket != null) {
                 remotePort = socket.getPort();
             } else {
-//                coyoteRequest.action(ActionCode.ACTION_REQ_REMOTEPORT_ATTRIBUTE, coyoteRequest);
-                remotePort = coyoteRequest.getRemotePort();
+                remotePort = grizzlyRequest.getRemotePort();
             }
         }
+
         return remotePort;
     }
 
     /**
-     * Returns the host name of the Internet Protocol (IP) interface on
-     * which the request was received.
+     * Returns the host name of the Internet Protocol (IP) interface on which the request was received.
      */
     @Override
     public String getLocalName() {
@@ -1564,16 +1489,15 @@
                 InetAddress inet = socket.getLocalAddress();
                 localName = inet.getHostName();
             } else {
-//                coyoteRequest.action(ActionCode.ACTION_REQ_LOCAL_NAME_ATTRIBUTE, coyoteRequest);
-                localName = coyoteRequest.getLocalName();
+                localName = grizzlyRequest.getLocalName();
             }
         }
+
         return localName;
     }
 
     /**
-     * Returns the Internet Protocol (IP) address of the interface on
-     * which the request  was received.
+     * Returns the Internet Protocol (IP) address of the interface on which the request was received.
      */
     @Override
     public String getLocalAddr() {
@@ -1582,16 +1506,15 @@
                 InetAddress inet = socket.getLocalAddress();
                 localAddr = inet.getHostAddress();
             } else {
-//                coyoteRequest.action(ActionCode.ACTION_REQ_LOCAL_ADDR_ATTRIBUTE, coyoteRequest);
-                localAddr = coyoteRequest.getLocalAddr();
+                localAddr = grizzlyRequest.getLocalAddr();
             }
         }
+
         return localAddr;
     }
 
     /**
-     * Returns the Internet Protocol (IP) port number of the interface
-     * on which the request was received.
+     * Returns the Internet Protocol (IP) port number of the interface on which the request was received.
      */
     @Override
     public int getLocalPort() {
@@ -1599,22 +1522,21 @@
             if (socket != null) {
                 localPort = socket.getLocalPort();
             } else {
-//                coyoteRequest.action(ActionCode.ACTION_REQ_LOCALPORT_ATTRIBUTE, coyoteRequest);
-                localPort = coyoteRequest.getLocalPort();
+                localPort = grizzlyRequest.getLocalPort();
             }
         }
+
         return localPort;
     }
 
     /**
-     * Return a RequestDispatcher that wraps the resource at the specified
-     * path, which may be interpreted as relative to the current request path.
+     * Return a RequestDispatcher that wraps the resource at the specified path, which may be interpreted as relative to the
+     * current request path.
      *
      * @param path Path of the resource to be wrapped
      */
     @Override
     public RequestDispatcher getRequestDispatcher(String path) {
-
         if (servletContext == null) {
             return null;
         }
@@ -1622,37 +1544,37 @@
         // If the path is already context-relative, just pass it through
         if (path == null) {
             return null;
-        } else if (path.startsWith("/")) {
+        }
+
+        if (path.startsWith("/")) {
             return servletContext.getRequestDispatcher(path);
         }
 
         // Convert a request-relative path to a context-relative one
-        String servPath = (String) getAttribute(
-                RequestDispatcher.INCLUDE_SERVLET_PATH);
-        if (servPath == null) {
-            servPath = getServletPath();
+        String servletPath = (String) getAttribute(INCLUDE_SERVLET_PATH);
+        if (servletPath == null) {
+            servletPath = getServletPath();
         }
 
         // Add the path info, if there is any
-        String pInfo = getPathInfo();
+        String pathInfo = getPathInfo();
         String requestPath = null;
 
-        if (pInfo == null) {
-            requestPath = servPath;
+        if (pathInfo == null) {
+            requestPath = servletPath;
         } else {
-            requestPath = servPath + pInfo;
+            requestPath = servletPath + pathInfo;
         }
 
-        int pos = requestPath.lastIndexOf('/');
-        String relative = null;
-        if (pos >= 0) {
-            relative = requestPath.substring(0, pos + 1) + path;
+        int lastSlashPos = requestPath.lastIndexOf('/');
+        String relativePath = null;
+        if (lastSlashPos >= 0) {
+            relativePath = requestPath.substring(0, lastSlashPos + 1) + path;
         } else {
-            relative = requestPath + path;
+            relativePath = requestPath + path;
         }
 
-        return servletContext.getRequestDispatcher(relative);
-
+        return servletContext.getRequestDispatcher(relativePath);
     }
 
     /**
@@ -1660,16 +1582,14 @@
      */
     @Override
     public String getScheme() {
-        // START S1AS 6170450
         if (getConnector() != null && getConnector().getAuthPassthroughEnabled()) {
             ProxyHandler proxyHandler = getConnector().getProxyHandler();
             if (proxyHandler != null && proxyHandler.getSSLKeysize(getRequest()) > 0) {
                 return "https";
             }
         }
-        // END S1AS 6170450
 
-        return coyoteRequest.getScheme();
+        return grizzlyRequest.getScheme();
     }
 
     /**
@@ -1677,7 +1597,7 @@
      */
     @Override
     public String getServerName() {
-        return coyoteRequest.getServerName();
+        return grizzlyRequest.getServerName();
     }
 
     /**
@@ -1685,22 +1605,15 @@
      */
     @Override
     public int getServerPort() {
-        /* SJSAS 6586658
-        return (coyoteRequest.getServerPort());
-         */
-        // START SJSAS 6586658
         if (isSecure()) {
             String host = getHeader("host");
             if (host != null && host.indexOf(':') == -1) {
                 // No port number provided with Host header, use default
                 return 443;
-            } else {
-                return coyoteRequest.getServerPort();
             }
-        } else {
-            return coyoteRequest.getServerPort();
         }
-        // END SJSAS 6586658
+
+        return grizzlyRequest.getServerPort();
     }
 
     /**
@@ -1732,23 +1645,21 @@
         if (listeners.isEmpty()) {
             return;
         }
-        ServletRequestAttributeEvent event =
-                new ServletRequestAttributeEvent(servletContext, getRequest(),
-                name, value);
+        ServletRequestAttributeEvent event = new ServletRequestAttributeEvent(servletContext, getRequest(), name, value);
         Iterator<EventListener> iter = listeners.iterator();
         while (iter.hasNext()) {
             EventListener eventListener = iter.next();
             if (!(eventListener instanceof ServletRequestAttributeListener)) {
                 continue;
             }
-            ServletRequestAttributeListener listener =
-                    (ServletRequestAttributeListener) eventListener;
+
+            ServletRequestAttributeListener listener = (ServletRequestAttributeListener) eventListener;
             try {
                 listener.attributeRemoved(event);
             } catch (Throwable t) {
-                log(rb.getString(LogFacade.ATTRIBUTE_EVENT_LISTENER_EXCEPTION), t);
+                log(rb.getString(ATTRIBUTE_EVENT_LISTENER_EXCEPTION), t);
                 // Error valve will pick this exception up and display it to user
-                attributes.put(RequestDispatcher.ERROR_EXCEPTION, t);
+                attributes.put(ERROR_EXCEPTION, t);
             }
         }
     }
@@ -1761,10 +1672,9 @@
      */
     @Override
     public void setAttribute(String name, Object value) {
-
         // Name cannot be null
         if (name == null) {
-            throw new IllegalArgumentException(rb.getString(LogFacade.NULL_ATTRIBUTE_NAME_EXCEPTION));
+            throw new IllegalArgumentException(rb.getString(NULL_ATTRIBUTE_NAME_EXCEPTION));
         }
 
         // Null value is the same as removeAttribute()
@@ -1773,7 +1683,7 @@
             return;
         }
 
-        if (name.equals(Globals.DISPATCHER_TYPE_ATTR)) {
+        if (name.equals(DISPATCHER_TYPE_ATTR)) {
             dispatcherTypeAttr = value;
             return;
         } else if (name.equals(Globals.DISPATCHER_REQUEST_PATH_ATTR)) {
@@ -1784,8 +1694,7 @@
         boolean replaced = false;
 
         // Do the security check before any updates are made
-        if (Globals.IS_SECURITY_ENABLED &&
-                name.equals("org.apache.tomcat.sendfile.filename")) {
+        if (Globals.IS_SECURITY_ENABLED && name.equals("org.apache.tomcat.sendfile.filename")) {
             // Use the canonical file name to avoid any possible symlink and
             // relative path issues
             String canonicalPath;
@@ -1808,27 +1717,22 @@
             replaced = true;
         }
 
-        // START SJSAS 6231069
-        // Pass special attributes to the ngrizzly layer
+        // Pass special attributes to the grizzly layer
         if (name.startsWith("grizzly.")) {
-            coyoteRequest.setAttribute(name, value);
+            grizzlyRequest.setAttribute(name, value);
         }
-        // END SJSAS 6231069
 
         // Notify interested application event listeners
         List<EventListener> listeners = context.getApplicationEventListeners();
         if (listeners.isEmpty()) {
             return;
         }
+
         ServletRequestAttributeEvent event = null;
         if (replaced) {
-            event = new ServletRequestAttributeEvent(servletContext,
-                    getRequest(), name,
-                    oldValue);
+            event = new ServletRequestAttributeEvent(servletContext, getRequest(), name, oldValue);
         } else {
-            event = new ServletRequestAttributeEvent(servletContext,
-                    getRequest(), name,
-                    value);
+            event = new ServletRequestAttributeEvent(servletContext, getRequest(), name, value);
         }
 
         Iterator<EventListener> iter = listeners.iterator();
@@ -1837,8 +1741,7 @@
             if (!(eventListener instanceof ServletRequestAttributeListener)) {
                 continue;
             }
-            ServletRequestAttributeListener listener =
-                    (ServletRequestAttributeListener) eventListener;
+            ServletRequestAttributeListener listener = (ServletRequestAttributeListener) eventListener;
             try {
                 if (replaced) {
                     listener.attributeReplaced(event);
@@ -1846,54 +1749,37 @@
                     listener.attributeAdded(event);
                 }
             } catch (Throwable t) {
-                log(rb.getString(LogFacade.ATTRIBUTE_EVENT_LISTENER_EXCEPTION), t);
+                log(rb.getString(ATTRIBUTE_EVENT_LISTENER_EXCEPTION), t);
                 // Error valve will pick this exception up and display it to user
-                attributes.put(RequestDispatcher.ERROR_EXCEPTION, t);
+                attributes.put(ERROR_EXCEPTION, t);
             }
         }
     }
 
     /**
-     * Overrides the name of the character encoding used in the body of this
-     * request.
+     * Overrides the name of the character encoding used in the body of this request.
      *
-     * This method must be called prior to reading request parameters or
-     * reading input using <code>getReader()</code>. Otherwise, it has no
-     * effect.
+     * This method must be called prior to reading request parameters or reading input using <code>getReader()</code>.
+     * Otherwise, it has no effect.
      *
-     * @param enc      <code>String</code> containing the name of
-     *                 the character encoding.
-     * @throws         UnsupportedEncodingException if this
-     *                 ServletRequest is still in a state where a
-     *                 character encoding may be set, but the specified
-     *                 encoding is invalid
+     * @param enc <code>String</code> containing the name of the character encoding.
+     * @throws UnsupportedEncodingException if this ServletRequest is still in a state where a character encoding may be
+     * set, but the specified encoding is invalid
      *
      * @since Servlet 2.3
      */
     @Override
-    public void setCharacterEncoding(String enc)
-            throws UnsupportedEncodingException {
-
-        // START SJSAS 4936855
+    public void setCharacterEncoding(String enc) throws UnsupportedEncodingException {
         if (parametersProcessed || usingReader) {
-            String contextName =
-                getContext() != null ? getContext().getName() : "UNKNOWN";
-            log.log(Level.WARNING, LogFacade.UNABLE_SET_REQUEST_CHARS, new Object[] {enc, contextName});
+            String contextName = getContext() != null ? getContext().getName() : "UNKNOWN";
+            log.log(WARNING, UNABLE_SET_REQUEST_CHARS, new Object[] { enc, contextName });
             return;
         }
-        // END SJSAS 4936855
 
         // Ensure that the specified encoding is valid
         byte buffer[] = new byte[1];
         buffer[0] = (byte) 'a';
 
-        // START S1AS 6179607: Workaround for 6181598. Workaround should be
-        // removed once the underlying issue in J2SE has been fixed.
-        /*
-         * String dummy = new String(buffer, enc);
-         */
-        // END S1AS 6179607
-        // START S1AS 6179607
         final byte[] finalBuffer = buffer;
         final String finalEnc = enc;
         if (Globals.IS_SECURITY_ENABLED) {
@@ -1911,14 +1797,11 @@
         } else {
             new String(buffer, RequestUtil.lookupCharset(enc));
         }
-        // END S1AS 6179607
 
         // Save the validated encoding
-        coyoteRequest.setCharacterEncoding(enc);
-
+        grizzlyRequest.setCharacterEncoding(enc);
     }
 
-    // START S1AS 4703023
     /**
      * Static setter method for the maximum dispatch depth
      */
@@ -1950,20 +1833,11 @@
     public boolean isMaxDispatchDepthReached() {
         return dispatchDepth > maxDispatchDepth;
     }
-    // END S1AS 4703023
 
     // ---------------------------------------------------- HttpRequest Methods
     @Override
-    public boolean authenticate(HttpServletResponse response)
-            throws IOException, ServletException {
-
-        //Issue 9650 - COmmenting this as required
-      /*  if (getUserPrincipal() != null) {
-        throw new ServletException("Attempt to re-login while the " +
-        "user identity already exists");
-        }*/
-
-        if (context == null) {//TODO: throw an exception
+    public boolean authenticate(HttpServletResponse response) throws IOException, ServletException {
+        if (context == null) {
             throw new ServletException("Internal error: Context null");
         }
 
@@ -1975,17 +1849,16 @@
 
         byte[] alreadyCalled = (byte[]) reentrancyStatus.get();
         if (alreadyCalled[0] == 1) {
-            //Re-entrancy from a JSR 196  module, so call the authenticate directly
+            // Re-entrancy from a Jakarta Authentication module, so call the authenticate directly
             try {
-                return authBase.authenticate(this, (HttpResponse) getResponse(),
-                        context.getLoginConfig());
+                return authBase.authenticate(this, (HttpResponse) getResponse(), context.getLoginConfig());
             } catch (Exception ex) {
                 throw new ServletException("Exception thrown while attempting to authenticate", ex);
             }
 
         } else {
-            //No re-entrancy, so call invokeAuthenticateDelegate to check if
-            //JSR196 module is present
+            // No re-entrancy, so call invokeAuthenticateDelegate to check if
+            // a Jakarta Authentication is present
             alreadyCalled[0] = 1;
             try {
                 final Realm realm = context.getRealm();
@@ -1999,7 +1872,8 @@
                             @Override
                             public Boolean run() {
                                 try {
-                                    return Boolean.valueOf(realm.invokeAuthenticateDelegate(req, (HttpResponse) getResponse(), context, authBase, true));
+                                    return Boolean.valueOf(
+                                            realm.invokeAuthenticateDelegate(req, (HttpResponse) getResponse(), context, authBase, true));
                                 } catch (IOException ex) {
                                     throw new RuntimeException("Exception thrown while attempting to authenticate", ex);
                                 }
@@ -2015,34 +1889,29 @@
                 }
 
             } finally {
-                //Reset the threadlocal re-entrancy check variable
+                // Reset the threadlocal re-entrancy check variable
                 alreadyCalled[0] = 0;
             }
         }
     }
 
     @Override
-    public void login(final String username, final String password)
-            throws ServletException {
+    public void login(final String username, final String password) throws ServletException {
         login(username, password != null ? password.toCharArray() : null);
     }
 
-    public void login(final String username, final char[] password)
-            throws ServletException {
+    public void login(final String username, final char[] password) throws ServletException {
         final Realm realm = context.getRealm();
         if (realm != null && realm.isSecurityExtensionEnabled(getServletContext())) {
-            throw new ServletException
-               (rb.getString(LogFacade.LOGIN_WITH_AUTH_CONFIG));
-     }
+            throw new ServletException(rb.getString(LOGIN_WITH_AUTH_CONFIG));
+        }
 
-        if (getAuthType() != null || getRemoteUser() != null ||
-                getUserPrincipal() != null) {
-            throw new ServletException(
-                    rb.getString(LogFacade.ALREADY_AUTHENTICATED));
+        if (getAuthType() != null || getRemoteUser() != null || getUserPrincipal() != null) {
+            throw new ServletException(rb.getString(ALREADY_AUTHENTICATED));
         }
 
         if (context.getAuthenticator() == null) {
-            throw new ServletException(rb.getString(LogFacade.NO_AUTHENTICATOR));
+            throw new ServletException(rb.getString(NO_AUTHENTICATOR));
         }
 
         context.getAuthenticator().login(username, password, this);
@@ -2050,18 +1919,15 @@
 
     @Override
     public void logout() throws ServletException {
-
         Realm realm = (context == null ? null : context.getRealm());
         if (realm == null) {
             if (getUserPrincipal() != null || getAuthType() != null) {
-                throw new ServletException(
-                        rb.getString(LogFacade.INTERNAL_LOGOUT_ERROR));
+                throw new ServletException(rb.getString(INTERNAL_LOGOUT_ERROR));
             }
             return;
         }
-        /*
-         * Pass the request (this).
-         */
+
+        // Pass the request (this).
         realm.logout(this);
     }
 
@@ -2072,7 +1938,6 @@
      */
     @Override
     public void addCookie(Cookie cookie) {
-
         // For compatibility only
         if (!cookiesParsed) {
             parseCookies();
@@ -2089,12 +1954,12 @@
      */
     @Override
     public void addHeader(String name, String value) {
-        coyoteRequest.getRequest().getHeaders().addValue(name).setString(value);
+        grizzlyRequest.getRequest().getHeaders().addValue(name).setString(value);
     }
 
     /**
-     * Add a Locale to the set of preferred Locales for this Request.  The
-     * first added Locale will be the first one returned by getLocales().
+     * Add a Locale to the set of preferred Locales for this Request. The first added Locale will be the first one returned
+     * by getLocales().
      *
      * @param locale The new preferred Locale
      */
@@ -2104,16 +1969,15 @@
     }
 
     /**
-     * Add a parameter name and corresponding set of values to this Request.
-     * (This is used when restoring the original request on a form based
-     * login).
+     * Add a parameter name and corresponding set of values to this Request. (This is used when restoring the original
+     * request on a form based login).
      *
      * @param name Name of this request parameter
      * @param values Corresponding values for this request parameter
      */
     @Override
     public void addParameter(String name, String values[]) {
-        coyoteRequest.addParameter(name, values);
+        grizzlyRequest.addParameter(name, values);
     }
 
     /**
@@ -2130,7 +1994,7 @@
      */
     @Override
     public void clearHeaders() {
-        coyoteRequest.getRequest().getHeaders().recycle();
+        grizzlyRequest.getRequest().getHeaders().recycle();
     }
 
     /**
@@ -2142,14 +2006,12 @@
     }
 
     /**
-     * Clear the collection of parameters associated with this Request
-     * and reset the query string encoding charset.
+     * Clear the collection of parameters associated with this Request and reset the query string encoding charset.
      */
     @Override
     public void clearParameters() {
-        coyoteRequest.getParameters().recycle();
-        coyoteRequest.getParameters().setQueryStringEncoding(
-                Charsets.lookupCharset(getConnector().getURIEncoding()));
+        grizzlyRequest.getParameters().recycle();
+        grizzlyRequest.getParameters().setQueryStringEncoding(Charsets.lookupCharset(getConnector().getURIEncoding()));
     }
 
     @Override
@@ -2158,14 +2020,12 @@
             return;
         }
 
-        coyoteRequest.replayPayload(Buffers.wrap(
-                coyoteRequest.getContext().getMemoryManager(), payloadByteArray));
+        grizzlyRequest.replayPayload(Buffers.wrap(grizzlyRequest.getContext().getMemoryManager(), payloadByteArray));
     }
 
     /**
-     * Set the authentication type used for this request, if any; otherwise
-     * set the type to <code>null</code>.  Typical values are "BASIC",
-     * "DIGEST", or "SSL".
+     * Set the authentication type used for this request, if any; otherwise set the type to <code>null</code>. Typical
+     * values are "BASIC", "DIGEST", or "SSL".
      *
      * @param type The authentication type used
      */
@@ -2177,27 +2037,27 @@
     /**
      * Set the HTTP request method used for this Request.
      *
-     * <p>Used by FBL when the original request is restored after
-     * successful authentication.
+     * <p>
+     * Used by FBL when the original request is restored after successful authentication.
      *
      * @param method The request method
      */
     @Override
     public void setMethod(String method) {
-        coyoteRequest.setMethod(method);
+        grizzlyRequest.setMethod(method);
     }
 
     /**
      * Sets the query string for this Request.
      *
-     * <p>Used by FBL when the original request is restored after
-     * successful authentication.
+     * <p>
+     * Used by FBL when the original request is restored after successful authentication.
      *
      * @param query The query string
      */
     @Override
     public void setQueryString(String query) {
-        coyoteRequest.setQueryString(query);
+        grizzlyRequest.setQueryString(query);
     }
 
     /**
@@ -2212,9 +2072,8 @@
     }
 
     /**
-     * Set a flag indicating whether or not the requested session ID for this
-     * request came in through a cookie.  This is normally called by the
-     * HTTP Connector, when it parses the request headers.
+     * Set a flag indicating whether or not the requested session ID for this request came in through a cookie. This is
+     * normally called by the HTTP Connector, when it parses the request headers.
      *
      * @param flag The new flag
      */
@@ -2232,12 +2091,11 @@
     }
 
     /**
-     * Set the requested session ID for this request.  This is normally called
-     * by the HTTP Connector, when it parses the request headers.
+     * Set the requested session ID for this request. This is normally called by the HTTP Connector, when it parses the
+     * request headers.
      *
-     * This method, which is called when the session id is sent as a cookie,
-     * or when it is encoded in the request URL, removes a jvmRoute
-     * (if present) from the given id.
+     * This method, which is called when the session id is sent as a cookie, or when it is encoded in the request URL,
+     * removes a jvmRoute (if present) from the given id.
      *
      * @param id The new session id
      */
@@ -2263,9 +2121,8 @@
     }
 
     /**
-     * Set a flag indicating whether or not the requested session ID for this
-     * request came in through a URL.  This is normally called by the
-     * HTTP Connector, when it parses the request headers.
+     * Set a flag indicating whether or not the requested session ID for this request came in through a URL. This is
+     * normally called by the HTTP Connector, when it parses the request headers.
      *
      * @param flag The new flag
      */
@@ -2275,17 +2132,16 @@
     }
 
     /**
-     * Set the unparsed request URI for this Request.  This will normally be
-     * called by the HTTP Connector, when it parses the request headers.
+     * Set the unparsed request URI for this Request. This will normally be called by the HTTP Connector, when it parses the
+     * request headers.
      *
-     * Used by FBL when restoring original request after successful
-     * authentication.
+     * Used by FBL when restoring original request after successful authentication.
      *
      * @param uri The request URI
      */
     @Override
     public void setRequestURI(String uri) {
-        coyoteRequest.setRequestURI(uri);
+        grizzlyRequest.setRequestURI(uri);
     }
 
     /**
@@ -2301,16 +2157,15 @@
     /**
      * Gets the decoded request URI.
      *
-     * @param maskDefaultContextMapping true if the fact that a request
-     * received at the root context was mapped to a default-web-module will
-     * be masked, false otherwise
+     * @param maskDefaultContextMapping true if the fact that a request received at the root context was mapped to a
+     * default-web-module will be masked, false otherwise
      */
     public String getDecodedRequestURI(boolean maskDefaultContextMapping) {
         try {
             if (maskDefaultContextMapping || !isDefaultContext) {
-                return coyoteRequest.getDecodedRequestURI();
+                return grizzlyRequest.getDecodedRequestURI();
             } else {
-                return getContextPath() + coyoteRequest.getDecodedRequestURI();
+                return getContextPath() + grizzlyRequest.getDecodedRequestURI();
             }
         } catch (CharConversionException e) {
             throw new RuntimeException(e.getMessage(), e);
@@ -2329,22 +2184,18 @@
     }
 
     /**
-     * Set the Principal who has been authenticated for this Request.  This
-     * value is also used to calculate the value to be returned by the
-     * <code>getRemoteUser()</code> method.
+     * Set the Principal who has been authenticated for this Request. This value is also used to calculate the value to be
+     * returned by the <code>getRemoteUser()</code> method.
      *
      * @param principal The user Principal
      */
     @Override
     public void setUserPrincipal(Principal principal) {
-
         if (SecurityUtil.isPackageProtectionEnabled()) {
             HttpSession session = getSession(false);
-            if (subject != null &&
-                !subject.getPrincipals().contains(principal)) {
+            if (subject != null && !subject.getPrincipals().contains(principal)) {
                 subject.getPrincipals().add(principal);
-            } else if (session != null &&
-                    session.getAttribute(Globals.SUBJECT_ATTR) == null) {
+            } else if (session != null && session.getAttribute(Globals.SUBJECT_ATTR) == null) {
                 subject = new Subject();
                 subject.getPrincipals().add(principal);
             }
@@ -2366,8 +2217,7 @@
     }
 
     /**
-     * Return the portion of the request URI used to select the Context
-     * of the Request.
+     * Return the portion of the request URI used to select the Context of the Request.
      */
     @Override
     public String getContextPath() {
@@ -2375,19 +2225,17 @@
     }
 
     /**
-     * Gets the portion of the request URI used to select the Context
-     * of the Request.
+     * Gets the portion of the request URI used to select the Context of the Request.
      *
-     * @param maskDefaultContextMapping true if the fact that a request
-     * received at the root context was mapped to a default-web-module will
-     * be masked, false otherwise
+     * @param maskDefaultContextMapping true if the fact that a request received at the root context was mapped to a
+     * default-web-module will be masked, false otherwise
      */
     public String getContextPath(boolean maskDefaultContextMapping) {
         if (isDefaultContext && maskDefaultContextMapping) {
             return "";
-        } else {
-            return contextPath;
         }
+
+        return contextPath;
     }
 
     /**
@@ -2395,7 +2243,6 @@
      */
     @Override
     public Cookie[] getCookies() {
-
         if (!cookiesParsed) {
             parseCookies();
         }
@@ -2411,27 +2258,23 @@
      * Set the set of cookies received with this Request.
      */
     public void setCookies(Cookie[] cookies) {
-
         this.cookies.clear();
         if (cookies != null) {
-            for (int i = 0; i < cookies.length; i++) {
-                this.cookies.add(cookies[i]);
+            for (Cookie element : cookies) {
+                this.cookies.add(element);
             }
         }
     }
 
     /**
-     * Return the value of the specified date header, if any; otherwise
-     * return -1.
+     * Return the value of the specified date header, if any; otherwise return -1.
      *
      * @param name Name of the requested date header
      *
-     * @exception IllegalArgumentException if the specified header value
-     *  cannot be converted to a date
+     * @exception IllegalArgumentException if the specified header value cannot be converted to a date
      */
     @Override
     public long getDateHeader(String name) {
-
         String value = getHeader(name);
         if (value == null) {
             return -1L;
@@ -2442,30 +2285,28 @@
         if (result != -1L) {
             return result;
         }
-        throw new IllegalArgumentException(value);
 
+        throw new IllegalArgumentException(value);
     }
 
     /**
-     * Return the first value of the specified header, if any; otherwise,
-     * return <code>null</code>
+     * Return the first value of the specified header, if any; otherwise, return <code>null</code>
      *
      * @param name Name of the requested header
      */
     @Override
     public String getHeader(String name) {
-        return coyoteRequest.getHeader(name);
+        return grizzlyRequest.getHeader(name);
     }
 
     /**
-     * Return all of the values of the specified header, if any; otherwise,
-     * return an empty enumeration.
+     * Return all of the values of the specified header, if any; otherwise, return an empty enumeration.
      *
      * @param name Name of the requested header
      */
     @Override
     public Enumeration<String> getHeaders(String name) {
-        return new Enumerator<String>(coyoteRequest.getHeaders(name).iterator());
+        return new Enumerator<>(grizzlyRequest.getHeaders(name).iterator());
     }
 
     /**
@@ -2473,38 +2314,34 @@
      */
     @Override
     public Enumeration<String> getHeaderNames() {
-        return new Enumerator<String>(coyoteRequest.getHeaderNames().iterator());
+        return new Enumerator<>(grizzlyRequest.getHeaderNames().iterator());
     }
 
     /**
-     * Return the value of the specified header as an integer, or -1 if there
-     * is no such header for this request.
+     * Return the value of the specified header as an integer, or -1 if there is no such header for this request.
      *
      * @param name Name of the requested header
      *
-     * @exception IllegalArgumentException if the specified header value
-     *  cannot be converted to an integer
+     * @exception IllegalArgumentException if the specified header value cannot be converted to an integer
      */
     @Override
     public int getIntHeader(String name) {
-
         String value = getHeader(name);
         if (value == null) {
             return -1;
-        } else {
-            return Integer.parseInt(value);
         }
 
+        return Integer.parseInt(value);
     }
 
     @Override
     public Map<String, String> getTrailerFields() {
-        return coyoteRequest.getTrailers();
+        return grizzlyRequest.getTrailers();
     }
 
     @Override
     public boolean isTrailerFieldsReady() {
-        return coyoteRequest.areTrailersAvailable();
+        return grizzlyRequest.areTrailersAvailable();
     }
 
     /**
@@ -2512,7 +2349,7 @@
      */
     @Override
     public String getMethod() {
-        return coyoteRequest.getMethod().getMethodString();
+        return grizzlyRequest.getMethod().getMethodString();
     }
 
     /**
@@ -2524,35 +2361,33 @@
     }
 
     /**
-     * Return the extra path information for this request, translated
-     * to a real path.
+     * Return the extra path information for this request, translated to a real path.
      */
     @Override
     public String getPathTranslated() {
-
         if (servletContext == null) {
             return null;
         }
 
         if (getPathInfo() == null) {
             return null;
-        } else {
-            return servletContext.getRealPath(getPathInfo());
         }
 
+        return servletContext.getRealPath(getPathInfo());
     }
 
     @Override
     public PushBuilder newPushBuilder() {
         Http2Stream http2Stream = null;
-        if (coyoteRequest != null) {
-            http2Stream = (Http2Stream)coyoteRequest.getAttribute(Http2Stream.HTTP2_STREAM_ATTRIBUTE);
+        if (grizzlyRequest != null) {
+            http2Stream = (Http2Stream) grizzlyRequest.getAttribute(Http2Stream.HTTP2_STREAM_ATTRIBUTE);
         }
+
         if (http2Stream != null && http2Stream.isPushEnabled()) {
             return new ApplicationPushBuilder(this);
-        } else {
-            return null;
         }
+
+        return null;
     }
 
     /**
@@ -2560,26 +2395,25 @@
      */
     @Override
     public String getQueryString() {
-        String queryString = coyoteRequest.getQueryString();
+        String queryString = grizzlyRequest.getQueryString();
 
         if (queryString == null || "".equals(queryString)) {
             return null;
-        } else {
-            return queryString;
         }
+
+        return queryString;
     }
 
     /**
-     * Return the name of the remote user that has been authenticated
-     * for this Request.
+     * Return the name of the remote user that has been authenticated for this Request.
      */
     @Override
     public String getRemoteUser() {
         if (userPrincipal != null) {
             return userPrincipal.getName();
-        } else {
-            return null;
         }
+
+        return null;
     }
 
     /**
@@ -2611,45 +2445,35 @@
     /**
      * Gets the request URI for this request.
      *
-     * @param maskDefaultContextMapping true if the fact that a request
-     * received at the root context was mapped to a default-web-module will
-     * be masked, false otherwise
+     * @param maskDefaultContextMapping true if the fact that a request received at the root context was mapped to a
+     * default-web-module will be masked, false otherwise
      */
     public String getRequestURI(boolean maskDefaultContextMapping) {
         if (maskDefaultContextMapping) {
-            return coyoteRequest.getRequestURI();
-        } else {
-            if (requestURI == null) {
-                // START GlassFish 1024
-                if (isDefaultContext) {
-                    requestURI = getContextPath() +
-                        coyoteRequest.getRequestURI();
-                } else {
-                    // END GlassFish 1024
-                    requestURI = coyoteRequest.getRequestURI();
-                    // START GlassFish 1024
-                }
-                // END GlassFish 1024
-            }
-            return requestURI;
+            return grizzlyRequest.getRequestURI();
         }
+
+        if (requestURI == null) {
+            if (isDefaultContext) {
+                requestURI = getContextPath() + grizzlyRequest.getRequestURI();
+            } else {
+                requestURI = grizzlyRequest.getRequestURI();
+            }
+        }
+
+        return requestURI;
     }
 
     /**
-     * Reconstructs the URL the client used to make the request.
-     * The returned URL contains a protocol, server name, port
-     * number, and server path, but it does not include query
-     * string parameters.
+     * Reconstructs the URL the client used to make the request. The returned URL contains a protocol, server name, port
+     * number, and server path, but it does not include query string parameters.
      * <p>
-     * Because this method returns a <code>StringBuffer</code>,
-     * not a <code>String</code>, you can modify the URL easily,
+     * Because this method returns a <code>StringBuffer</code>, not a <code>String</code>, you can modify the URL easily,
      * for example, to append query parameters.
      * <p>
-     * This method is useful for creating redirect messages and
-     * for reporting errors.
+     * This method is useful for creating redirect messages and for reporting errors.
      *
-     * @return A <code>StringBuffer</code> object containing the
-     *  reconstructed URL
+     * @return A <code>StringBuffer</code> object containing the reconstructed URL
      */
     @Override
     public StringBuffer getRequestURL() {
@@ -2677,8 +2501,7 @@
     }
 
     /**
-     * Return the portion of the request URI used to select the servlet
-     * that will process this request.
+     * Return the portion of the request URI used to select the servlet that will process this request.
      */
     @Override
     public String getServletPath() {
@@ -2686,33 +2509,31 @@
     }
 
     /**
-     * Return the session associated with this Request, creating one
-     * if necessary.
+     * Return the session associated with this Request, creating one if necessary.
      */
     @Override
     public HttpSession getSession() {
         Session session = doGetSession(true);
-        if (session != null) {
-            return session.getSession();
-        } else {
+        if (session == null) {
             return null;
         }
+
+        return session.getSession();
     }
 
     /**
-     * Return the session associated with this Request, creating one
-     * if necessary and requested.
+     * Return the session associated with this Request, creating one if necessary and requested.
      *
      * @param create Create a new session if one does not exist
      */
     @Override
     public HttpSession getSession(boolean create) {
         Session session = doGetSession(create);
-        if (session != null) {
-            return session.getSession();
-        } else {
+        if (session == null) {
             return null;
         }
+
+        return session.getSession();
     }
 
     /**
@@ -2725,70 +2546,55 @@
     }
 
     /**
-     * Return <code>true</code> if the session identifier included in this
-     * request came from a cookie.
+     * Return <code>true</code> if the session identifier included in this request came from a cookie.
      */
     @Override
     public boolean isRequestedSessionIdFromCookie() {
-
-        if (requestedSessionId != null) {
-            return requestedSessionCookie;
-        } else {
+        if (requestedSessionId == null) {
             return false;
         }
 
+        return requestedSessionCookie;
     }
 
     /**
-     * Return <code>true</code> if the session identifier included in this
-     * request came from the request URI.
+     * Return <code>true</code> if the session identifier included in this request came from the request URI.
      */
     @Override
     public boolean isRequestedSessionIdFromURL() {
-
-        if (requestedSessionId != null) {
-            return requestedSessionURL;
-        } else {
+        if (requestedSessionId == null) {
             return false;
         }
 
+        return requestedSessionURL;
     }
 
     /**
-     * Marks (or unmarks) this request as having a JSESSIONID cookie
-     * that is marked as secure
+     * Marks (or unmarks) this request as having a JSESSIONID cookie that is marked as secure
      *
-     * @param secure true if this request has a JSESSIONID cookie that is
-     * marked as secure, false otherwise
+     * @param secure true if this request has a JSESSIONID cookie that is marked as secure, false otherwise
      */
     public void setRequestedSessionIdFromSecureCookie(boolean secure) {
         isRequestedSessionIdFromSecureCookie = secure;
     }
 
-
     /**
-     * @return true if this request contains a JSESSIONID cookie that is
-     * marked as secure, false otherwise
+     * @return true if this request contains a JSESSIONID cookie that is marked as secure, false otherwise
      */
     public boolean isRequestedSessionIdFromSecureCookie() {
         return isRequestedSessionIdFromSecureCookie;
     }
 
     /**
-     * Return <code>true</code> if the session identifier included in this
-     * request identifies a valid session.
+     * Return <code>true</code> if the session identifier included in this request identifies a valid session.
      */
     @Override
     public boolean isRequestedSessionIdValid() {
-        if (requestedSessionId == null) {
-            return false;
-        }
-        if (context == null) {
+        if ((requestedSessionId == null) || (context == null)) {
             return false;
         }
 
-        if (session != null &&
-                requestedSessionId.equals(session.getIdInternal())) {
+        if (session != null && requestedSessionId.equals(session.getIdInternal())) {
             return session.isValid();
         }
 
@@ -2796,51 +2602,45 @@
         if (manager == null) {
             return false;
         }
+
         Session localSession = null;
         try {
             if (manager.isSessionVersioningSupported()) {
-                localSession = manager.findSession(requestedSessionId,
-                                                   requestedSessionVersion);
+                localSession = manager.findSession(requestedSessionId, requestedSessionVersion);
             } else {
                 localSession = manager.findSession(requestedSessionId, this);
             }
         } catch (IOException e) {
             localSession = null;
         }
+
         if (localSession != null && localSession.isValid()) {
             return true;
-        } else {
-            return false;
         }
 
+        return false;
     }
 
     /**
-     * Return <code>true</code> if the authenticated user principal
-     * possesses the specified role name.
+     * Return <code>true</code> if the authenticated user principal possesses the specified role name.
      *
      * @param role Role name to be validated
      */
     @Override
     public boolean isUserInRole(String role) {
 
-        // BEGIN RIMOD 4949842
         /*
-         * Must get userPrincipal through getUserPrincipal(), can't assume
-         * it has already been set since it may be coming from core.
+         * Must get userPrincipal through getUserPrincipal(), can't assume it has already been set since it may be coming from
+         * core.
          */
-        Principal userPrincipal = this.getUserPrincipal();
-        // END RIMOD 4949842
+        Principal userPrincipal = getUserPrincipal();
 
         // Have we got an authenticated principal at all?
-        if (userPrincipal == null) {
+        // Identify the Realm we will use for checking role assignments
+        if (userPrincipal == null || context == null) {
             return false;
         }
 
-        // Identify the Realm we will use for checking role assignments
-        if (context == null) {
-            return false;
-        }
         Realm realm = context.getRealm();
         if (realm == null) {
             return false;
@@ -2850,21 +2650,13 @@
         if (wrapper != null) {
             String realRole = wrapper.findSecurityReference(role);
 
-            //START SJSAS 6232464
-            if (realRole != null &&
-                    //realm.hasRole(userPrincipal, realRole))
-                    realm.hasRole(this, (HttpResponse) response,
-                    userPrincipal, realRole)) {
+            if (realRole != null && realm.hasRole(this, (HttpResponse) response, userPrincipal, realRole)) {
                 return true;
             }
         }
 
         // Check for a role defined directly as a <security-role>
-
-        //return (realm.hasRole(userPrincipal, role));
-        return realm.hasRole(this, (HttpResponse) response,
-                userPrincipal, role);
-        //END SJSAS 6232464
+        return realm.hasRole(this, (HttpResponse) response, userPrincipal, role);
     }
 
     /**
@@ -2876,19 +2668,16 @@
     }
 
     /**
-     * Return the session associated with this Request, creating one
-     * if necessary.
+     * Return the session associated with this Request, creating one if necessary.
      */
     public Session getSessionInternal() {
         return doGetSession(true);
     }
 
     /**
-     * Gets the session associated with this Request, creating one
-     * if necessary and requested.
+     * Gets the session associated with this Request, creating one if necessary and requested.
      *
-     * @param create true if a new session is to be created if one does not
-     * already exist, false otherwise
+     * @param create true if a new session is to be created if one does not already exist, false otherwise
      */
     @Override
     public Session getSessionInternal(boolean create) {
@@ -2896,13 +2685,11 @@
     }
 
     /**
-     * Change the session id of the current session associated with this
-     * request and return the new session id.
+     * Change the session id of the current session associated with this request and return the new session id.
      *
      * @return the new session id
      *
-     * @throws IllegalStateException if there is no session associated
-     * with the request
+     * @throws IllegalStateException if there is no session associated with the request
      *
      * @since Servlet 3.1
      */
@@ -2931,8 +2718,8 @@
     }
 
     /**
-     * This object does not implement a session ID generator. Provide
-     * a dummy implementation so that the default one will be used.
+     * This object does not implement a session ID generator. Provide a dummy implementation so that the default one will be
+     * used.
      */
     @Override
     public String generateSessionId() {
@@ -2940,11 +2727,9 @@
     }
 
     /**
-     * Gets the servlet context to which this servlet request was last
-     * dispatched.
+     * Gets the servlet context to which this servlet request was last dispatched.
      *
-     * @return the servlet context to which this servlet request was last
-     * dispatched
+     * @return the servlet context to which this servlet request was last dispatched
      */
     @Override
     public ServletContext getServletContext() {
@@ -2952,16 +2737,15 @@
     }
 
     /**
-     * Create an instance of <code>HttpUpgradeHandler</code> for an given
-     * class and uses it for the http protocol upgrade processing.
+     * Create an instance of <code>HttpUpgradeHandler</code> for an given class and uses it for the http protocol upgrade
+     * processing.
      *
      * @param handlerClass The <code>HttpUpgradeHandler</code> class used for the upgrade.
      *
      * @return an instance of the <code>HttpUpgradeHandler</code>
      *
      * @exception IOException if an I/O error occurred during the upgrade
-     * @exception ServletException if the given <tt>clazz</tt> fails to be
-     * instantiated
+     * @exception ServletException if the given <tt>clazz</tt> fails to be instantiated
      *
      * @see jakarta.servlet.http.HttpUpgradeHandler
      * @see jakarta.servlet.http.WebConnection
@@ -2969,19 +2753,18 @@
      * @since Servlet 3.1
      */
     @Override
-    public <T extends HttpUpgradeHandler> T upgrade(Class<T> handlerClass)
-            throws IOException, ServletException {
+    public <T extends HttpUpgradeHandler> T upgrade(Class<T> handlerClass) throws IOException, ServletException {
         upgrade = true;
         T handler = null;
         try {
             handler = ((StandardContext) getContext()).createHttpUpgradeHandlerInstance(handlerClass);
-        } catch(IOException | ServletException ise) {
+        } catch (IOException | ServletException ise) {
             throw ise;
-        } catch(Throwable t) {
+        } catch (Throwable t) {
             throw new ServletException(t);
         }
         httpUpgradeHandler = handler;
-        coyoteRequest.getResponse().suspend();
+        grizzlyRequest.getResponse().suspend();
         return handler;
     }
 
@@ -2989,8 +2772,8 @@
         return webConnection;
     }
 
-    public void setWebConnection(WebConnection wc) {
-        webConnection = wc;
+    public void setWebConnection(WebConnection webConnection) {
+        this.webConnection = webConnection;
     }
 
     // ------------------------------------------------------ Protected Methods
@@ -3013,18 +2796,16 @@
         // Return the requested session if it exists and is valid
         Manager manager = context.getManager();
         if (manager == null) {
-            return null;      // Sessions are not supported
+            return null; // Sessions are not supported
         }
         if (requestedSessionId != null) {
             if (!checkUnsuccessfulSessionFind || !unsuccessfulSessionFind) {
                 try {
                     if (manager.isSessionVersioningSupported()) {
-                        session = manager.findSession(requestedSessionId,
-                                                      requestedSessionVersion);
-                        //XXX need to revisit
+                        session = manager.findSession(requestedSessionId, requestedSessionVersion);
+                        // XXX need to revisit
                         if (session instanceof StandardSession) {
-                            incrementSessionVersion((StandardSession) session,
-                                                    context);
+                            incrementSessionVersion((StandardSession) session, context);
                         }
                     } else {
                         session = manager.findSession(requestedSessionId, this);
@@ -3049,20 +2830,16 @@
         if (!create) {
             return null;
         }
-        if (context != null && response != null &&
-                context.getCookies() &&
-                response.getResponse().isCommitted()) {
+
+        if (context != null && response != null && context.getCookies() && response.getResponse().isCommitted()) {
             throw new IllegalStateException(rb.getString(LogFacade.CANNOT_CREATE_SESSION_EXCEPTION));
         }
 
-        // START S1AS8PE 4817642
         if (requestedSessionId != null && context.getReuseSessionID()) {
             session = manager.createSession(requestedSessionId);
             if (manager instanceof PersistentManagerBase) {
                 ((PersistentManagerBase) manager).removeFromInvalidatedSessions(requestedSessionId);
             }
-            // END S1AS8PE 4817642
-            // START GlassFish 896
         } else if (sessionTracker.getActiveSessions() > 0) {
             synchronized (sessionTracker) {
                 if (sessionTracker.getActiveSessions() > 0) {
@@ -3073,10 +2850,7 @@
                     }
                 }
             }
-            // END GlassFish 896
-            // START S1AS8PE 4817642
         } else {
-            // END S1AS8PE 4817642
             // Use the connector's random number generator (if any) to generate
             // a session ID. Fallback to the default session ID generator if
             // the connector does not implement one.
@@ -3086,33 +2860,26 @@
             } else {
                 session = manager.createSession();
             }
-            // START S1AS8PE 4817642
         }
-        // END S1AS8PE 4817642
 
         StandardHost reqHost = (StandardHost) getHost();
         if (reqHost != null) {
             SingleSignOn sso = reqHost.getSingleSignOn();
             if (sso != null) {
-                String ssoId = (String) getNote(
-                        org.apache.catalina.authenticator.Constants.REQ_SSOID_NOTE);
+                String ssoId = (String) getNote(REQ_SSOID_NOTE);
                 if (ssoId != null) {
                     long ssoVersion = 0L;
-                    Long ssoVersionObj = (Long)getNote(
-                            org.apache.catalina.authenticator.Constants.REQ_SSO_VERSION_NOTE);
+                    Long ssoVersionObj = (Long) getNote(REQ_SSO_VERSION_NOTE);
                     if (ssoVersionObj != null) {
                         ssoVersion = ssoVersionObj.longValue();
                     }
                     sso.associate(ssoId, ssoVersion, session);
-                    removeNote(
-                            org.apache.catalina.authenticator.Constants.REQ_SSOID_NOTE);
+                    removeNote(REQ_SSOID_NOTE);
                 }
             }
         }
 
-        // START GlassFish 896
         sessionTracker.track(session);
-        // END GlassFish 896
 
         // Creating a new session cookie based on the newly created session
         if (session != null && getContext() != null) {
@@ -3126,10 +2893,9 @@
         if (session != null) {
             session.access();
             return session;
-        } else {
-            return null;
         }
 
+        return null;
     }
 
     /**
@@ -3141,25 +2907,19 @@
         cookie.setHttpOnly(true);
         cookie.setMaxAge(-1);
         String contextPath = null;
-        // START GlassFish 1024
         if (isDefaultContext) {
             cookie.setPath("/");
         } else {
-            // END GlassFish 1024
             if (context != null) {
-                // START OF SJSAS 6231069
-                // contextPath = getContext().getEncodedPath();
                 contextPath = context.getPath();
-                // END OF SJSAS 6231069
             }
             if (contextPath != null && contextPath.length() > 0) {
                 cookie.setPath(contextPath);
             } else {
                 cookie.setPath("/");
             }
-            // START GlassFish 1024
         }
-        // END GlassFish 1024
+
         if (isSecure()) {
             cookie.setSecure(true);
         }
@@ -3167,8 +2927,7 @@
         // Override the default config with servlet context
         // sessionCookieConfig
         if (context != null) {
-            SessionCookieConfig sessionCookieConfig =
-                    context.getSessionCookieConfig();
+            SessionCookieConfig sessionCookieConfig = context.getSessionCookieConfig();
             if (sessionCookieConfig.getDomain() != null) {
                 cookie.setDomain(sessionCookieConfig.getDomain());
             }
@@ -3179,7 +2938,8 @@
                 cookie.setVersion(1);
                 cookie.setComment(sessionCookieConfig.getComment());
             }
-            // do nothing if it is already secure
+
+            // Do nothing if it is already secure
             if (!cookie.getSecure()) {
                 cookie.setSecure(sessionCookieConfig.isSecure());
             }
@@ -3196,10 +2956,9 @@
      * Parse cookies.
      */
     protected void parseCookies() {
-
         cookiesParsed = true;
 
-        org.glassfish.grizzly.http.Cookie[] serverCookies = coyoteRequest.getCookies();
+        org.glassfish.grizzly.http.Cookie[] serverCookies = grizzlyRequest.getCookies();
         int count = serverCookies.length;
         if (count <= 0) {
             return;
@@ -3210,33 +2969,24 @@
         for (int i = 0; i < count; i++) {
             org.glassfish.grizzly.http.Cookie scookie = serverCookies[i];
             try {
-                /* GlassFish 898
-                Cookie cookie = new Cookie(scookie.getName().toString(),
-                scookie.getValue().toString());
-                 */
-                // START GlassFish 898
                 Cookie cookie = makeCookie(scookie);
-                // END GlassFish 898
                 cookie.setPath(scookie.getPath());
-                cookie.setVersion(scookie.getVersion());
                 String domain = scookie.getDomain();
                 if (domain != null) {
                     cookie.setDomain(scookie.getDomain());
                 }
                 cookies.add(cookie);
             } catch (IllegalArgumentException e) {
-                ; // Ignore bad cookie.
+                 // Ignore bad cookie.
             }
         }
     }
 
-    // START GlassFish 898
     protected Cookie makeCookie(org.glassfish.grizzly.http.Cookie scookie) {
         return makeCookie(scookie, false);
     }
 
     protected Cookie makeCookie(org.glassfish.grizzly.http.Cookie scookie, boolean decode) {
-
         String name = scookie.getName();
         String value = scookie.getValue();
 
@@ -3252,110 +3002,13 @@
 
         return new Cookie(name, value);
     }
-    // END GlassFish 898
 
     /**
-     * Parse request parameters.
-     */
-//    protected void parseRequestParameters() {
-//
-//        /* SJSAS 4936855
-//        requestParametersParsed = true;
-//         */
-//
-//        Parameters parameters = coyoteRequest.getParameters();
-//
-//        // getCharacterEncoding() may have been overridden to search for
-//        // hidden form field containing request encoding
-//        String enc = getCharacterEncoding();
-//        // START SJSAS 4936855
-//        // Delay updating requestParametersParsed to TRUE until
-//        // after getCharacterEncoding() has been called, because
-//        // getCharacterEncoding() may cause setCharacterEncoding() to be
-//        // called, and the latter will ignore the specified encoding if
-//        // requestParametersParsed is TRUE
-//        requestParametersParsed = true;
-//        // END SJSAS 4936855
-//        if (enc != null) {
-//            parameters.setEncoding(enc);
-//            parameters.setQueryStringEncoding(enc);
-//        } else {
-//            parameters.setEncoding(org.glassfish.grizzly.http.server.Constants.DEFAULT_CHARACTER_ENCODING);
-//            parameters.setQueryStringEncoding(org.glassfish.grizzly.http.server.Constants.DEFAULT_CHARACTER_ENCODING);
-//        }
-//
-//        parameters.handleQueryParameters();
-//
-//        if (usingInputStream || usingReader) {
-//            return;
-//        }
-//
-//        if (!"POST".equalsIgnoreCase(getMethod())) {
-//            return;
-//        }
-//
-//        String contentType = getContentType();
-//        if (contentType == null) {
-//            contentType = "";
-//        }
-//        int semicolon = contentType.indexOf(';');
-//        if (semicolon >= 0) {
-//            contentType = contentType.substring(0, semicolon).trim();
-//        } else {
-//            contentType = contentType.trim();
-//        }
-//        if (!"application/x-www-form-urlencoded".equals(contentType)) {
-//            return;
-//        }
-//
-//        int len = getContentLength();
-//
-//        if (len > 0) {
-//            int maxPostSize = ((Connector) connector).getMaxPostSize();
-//            if (maxPostSize > 0 && len > maxPostSize) {
-//                log(sm.getString("coyoteRequest.postTooLarge"));
-
-                  //coyoteRequest.postTooLarge=PWC4004: Parameters were not parsed because the size of the posted data was too big.
-                  // Use the maxPostSize attribute of the connector to resolve this if the application should accept large POSTs.
-//
-//                throw new IllegalStateException("Post too large");
-//            }
-//            try {
-//                /* SJSAS 6346738
-//                byte[] formData = null;
-//                if (len < CACHED_POST_LEN) {
-//                if (postData == null)
-//                postData = new byte[CACHED_POST_LEN];
-//                formData = postData;
-//                } else {
-//                formData = new byte[len];
-//                }
-//                int actualLen = readPostBody(formData, len);
-//                if (actualLen == len) {
-//                parameters.processParameters(formData, 0, len);
-//                }
-//                 */
-//                // START SJSAS 6346738
-//                byte[] formData = getPostBody();
-//                if (formData != null) {
-//                    parameters.processParameters(formData, 0, len);
-//                }
-//                // END SJSAS 6346738
-//            } catch (Throwable t) {
-//                ; // Ignore
-//            }
-//        }
-//
-//    }
-
-    // START SJSAS 6346738
-    /**
      * Gets the POST body of this request.
      *
      * @return The POST body of this request
      */
     protected byte[] getPostBody() throws IOException {
-
         int len = getContentLength();
         byte[] formData = null;
 
@@ -3374,158 +3027,23 @@
 
         return null;
     }
-    // END SJSAS 6346738
 
     /**
      * Read post body in an array.
      */
-    protected int readPostBody(byte body[], int len)
-            throws IOException {
-
-        Buffer b = coyoteRequest.getPostBody(len).duplicate();
+    protected int readPostBody(byte body[], int len) throws IOException {
+        Buffer b = grizzlyRequest.getPostBody(len).duplicate();
         final int length = b.limit() - b.position();
         b.get(body, b.position(), length);
         return length;
-
     }
 
     /**
-     * Parse request locales.
-     */
-//    protected void parseLocales() {
-//
-//        localesParsed = true;
-//        for (String value : getHeaders("accept-language")) {
-//            parseLocalesHeader(value);
-//        }
-//
-//    }
-
-    /**
-     * Parse accept-language header value.
-     */
-//    protected void parseLocalesHeader(String value) {
-//
-        // Store the accumulated languages that have been requested in
-//        // a local collection, sorted by the quality value (so we can
-//        // add Locales in descending order).  The values will be ArrayLists
-//        // containing the corresponding Locales to be added
-//        TreeMap<Double, ArrayList<Locale>> locales = new TreeMap<Double, ArrayList<Locale>>();
-//
-//        // Preprocess the value to remove all whitespace
-//        int white = value.indexOf(' ');
-//        if (white < 0) {
-//            white = value.indexOf('\t');
-//        }
-//        if (white >= 0) {
-//            StringBuilder sb = new StringBuilder();
-//            int len = value.length();
-//            for (int i = 0; i < len; i++) {
-//                char ch = value.charAt(i);
-//                if ((ch != ' ') && (ch != '\t')) {
-//                    sb.append(ch);
-//                }
-//            }
-//            value = sb.toString();
-//        }
-//
-//        // Process each comma-delimited language specification
-//        parser.setString(value);        // ASSERT: parser is available to us
-//        int length = parser.getLength();
-//        while (true) {
-//
-//            // Extract the next comma-delimited entry
-//            int start = parser.getIndex();
-//            if (start >= length) {
-//                break;
-//            }
-//            int end = parser.findChar(',');
-//            String entry = parser.extract(start, end).trim();
-//            parser.advance();   // For the following entry
-//
-//            // Extract the quality factor for this entry
-//            double quality = 1.0;
-//            int semi = entry.indexOf(";q=");
-//            if (semi >= 0) {
-//                try {
-//                    String strQuality = entry.substring(semi + 3);
-//                    if (strQuality.length() <= 5) {
-//                        quality = Double.parseDouble(strQuality);
-//                    } else {
-//                        quality = 0.0;
-//                    }
-//                } catch (NumberFormatException e) {
-//                    quality = 0.0;
-//                }
-//                entry = entry.substring(0, semi);
-//            }
-//
-//            // Skip entries we are not going to keep track of
-//            if (quality < 0.00005) {
-//                continue;       // Zero (or effectively zero) quality factors
-//            }
-//            if ("*".equals(entry)) {
-//                continue;       // FIXME - "*" entries are not handled
-//            }
-//            // Extract the language and country for this entry
-//            String language = null;
-//            String country = null;
-//            String variant = null;
-//            int dash = entry.indexOf('-');
-//            if (dash < 0) {
-//                language = entry;
-//                country = "";
-//                variant = "";
-//            } else {
-//                language = entry.substring(0, dash);
-//                country = entry.substring(dash + 1);
-//                int vDash = country.indexOf('-');
-//                if (vDash > 0) {
-//                    String cTemp = country.substring(0, vDash);
-//                    variant = country.substring(vDash + 1);
-//                    country = cTemp;
-//                } else {
-//                    variant = "";
-//                }
-//            }
-//
-//            if (!isAlpha(language) || !isAlpha(country) || !isAlpha(variant)) {
-//                continue;
-//            }
-//
-//            // Add a new Locale to the list of Locales for this quality level
-//            Locale locale = new Locale(language, country, variant);
-//            Double key = Double.valueOf(-quality);  // Reverse the order
-//            ArrayList<Locale> values = locales.get(key);
-//            if (values == null) {
-//                values = new ArrayList<Locale>();
-//                locales.put(key, values);
-//            }
-//            values.add(locale);
-//
-//        }
-//
-//        // Process the quality values in highest->lowest order (due to
-//        // negating the Double value when creating the key)
-//        for (ArrayList<Locale> list : locales.values()) {
-//            Iterator<Locale> values = list.iterator();
-//            while (values.hasNext()) {
-//                Locale locale = values.next();
-//                addLocale(locale);
-//            }
-//        }
-//
-//    }
-
-    /*
-     * Returns true if the given string is composed of upper- or lowercase
-     * letters only, false otherwise.
+     * Returns true if the given string is composed of upper- or lowercase letters only, false otherwise.
      *
-     * @return true if the given string is composed of upper- or lowercase
-     * letters only, false otherwise.
+     * @return true if the given string is composed of upper- or lowercase letters only, false otherwise.
      */
     protected static final boolean isAlpha(String value) {
-
         if (value == null) {
             return false;
         }
@@ -3545,71 +3063,20 @@
      */
     protected void obtainSessionId() {
         setRequestedSessionURL(true);
-        setJrouteId(coyoteRequest.getJrouteId());
-        setRequestedSessionId(coyoteRequest.getRequestedSessionId());
+        setJrouteId(grizzlyRequest.getJrouteId());
+        setRequestedSessionId(grizzlyRequest.getRequestedSessionId());
     }
 
-    // START CR 6309511
     /**
      * Parse session id in URL.
      */
-    protected void parseSessionId(String sessionParameterName, CharChunk uriBB) {
-        //START GLASSFISH-15508
-        /*
-        if (coyoteRequest.isRequestedSessionIdFromURL() &&
-                sessionParam.equals(Globals.SESSION_PARAMETER_NAME)) {
-            setRequestedSessionURL(true);
-            setRequestedSessionId(coyoteRequest.getRequestedSessionId());
-            setJrouteId(coyoteRequest.getJrouteId());
-
-            return;
-        }
-
-        sessionParam = ";" + sessionParam + "=";
-        int semicolon = uriBB.indexOf(sessionParam, 0, sessionParam.length(),
-                0);
-        if (semicolon >= 0) {
-
-            // Parse session ID, and extract it from the decoded request URI
-            int start = uriBB.getStart();
-            int end = uriBB.getEnd();
-
-            int sessionIdStart = start + semicolon + sessionParam.length();
-            int semicolon2 = uriBB.indexOf(';', sessionIdStart);
-        */
-        //END GLASSFISH-15508
-            /* SJSAS 6346226
-            if (semicolon2 >= 0) {
-            setRequestedSessionId
-            (new String(uriBB.getBuffer(), sessionIdStart,
-            semicolon2 - semicolon - match.length()));
-            } else {
-            setRequestedSessionId
-            (new String(uriBB.getBuffer(), sessionIdStart,
-            end - sessionIdStart));
-            }
-             */
-            //START GLASSFISH-15508
-            /*
-            // START SJSAS 6346226
-            String sessionId = null;
-            if (semicolon2 >= 0) {
-                sessionId = new String(uriBB.getBuffer(), sessionIdStart,
-                        semicolon2 - semicolon - sessionParam.length());
-            } else {
-                sessionId = new String(uriBB.getBuffer(), sessionIdStart,
-                        end - sessionIdStart);
-            }
-            */
-            //END GLASSFISH-15508
+    protected void parseSessionId(String sessionParameterName, CharChunk uriCharChunk) {
 
         // Parse session ID, and extract it from the decoded request URI
         String sessionParam = ";" + sessionParameterName + "=";
-        String sessionId =
-            parseParameterFromRequestURI(uriBB, sessionParam);
+        String sessionId = parseParameterFromRequestURI(uriCharChunk, sessionParam);
 
         if (sessionId != null) {
-            // START SJSAS 6346226
             int jrouteIndex = sessionId.lastIndexOf(':');
             if (jrouteIndex > 0) {
                 setRequestedSessionId(sessionId.substring(0, jrouteIndex));
@@ -3619,65 +3086,33 @@
             } else {
                 setRequestedSessionId(sessionId);
             }
-            // END SJSAS 6346226
 
             setRequestedSessionURL(true);
 
-            /* SJSWS 6376484
-            // Extract session ID from request URI
-            ByteChunk uriBC = coyoteRequest.requestURI().getByteChunk();
-            start = uriBC.getStart();
-            end = uriBC.getEnd();
-            semicolon = uriBC.indexOf(match, 0, match.length(), 0);
-
-            if (semicolon > 0) {
-            sessionIdStart = start + semicolon;
-            semicolon2 = uriBB.indexOf
-            (';', start + semicolon + match.length());
-            uriBC.setEnd(start + semicolon);
-            byte[] buf = uriBC.getBuffer();
-            if (semicolon2 >= 0) {
-            for (int i = 0; i < end - start - semicolon2; i++) {
-            buf[start + semicolon + i]
-            = buf[start + i + semicolon2];
-            }
-            uriBC.setBytes(buf, start, semicolon
-            + (end - start - semicolon2));
-            }
-            }
-             */
-            // START SJSWS 6376484
             /*
-             * Parse the session id from the encoded URI only if the encoded
-             * URI is not null, to allow for lazy evaluation
+             * Parse the session id from the encoded URI only if the encoded URI is not null, to allow for lazy evaluation
              */
-            if (coyoteRequest.getRequestURI() != null) {
+            if (grizzlyRequest.getRequestURI() != null) {
                 removeParameterFromRequestURI(sessionParam);
             }
-            // END SJSWS 6376484
 
         } else {
             setRequestedSessionId(null);
             setRequestedSessionURL(false);
         }
     }
-    // END CR 6309511
 
     /**
-     * Parses and removes any session version (if present) from the request
-     * URI.
+     * Parses and removes any session version (if present) from the request URI.
      *
      */
     protected void parseSessionVersion(CharChunk uriCC) {
-        String sessionVersionString =
-            parseParameterFromRequestURI(uriCC, Globals.SESSION_VERSION_PARAMETER);
+        String sessionVersionString = parseParameterFromRequestURI(uriCC, SESSION_VERSION_PARAMETER);
 
         if (sessionVersionString != null) {
             parseSessionVersionString(sessionVersionString);
 
-//            if (!coyoteRequest.requestURI().getByteChunk().isNull()) {
-                removeParameterFromRequestURI(Globals.SESSION_VERSION_PARAMETER);
-//            }
+            removeParameterFromRequestURI(SESSION_VERSION_PARAMETER);
         }
     }
 
@@ -3685,17 +3120,14 @@
      * Parses and removes jreplica (if present) from the request URI.
      */
     protected void parseJReplica(CharChunk uriCC) {
-        String jreplica =
-            parseParameterFromRequestURI(uriCC, Globals.JREPLICA_PARAMETER);
+        String jreplica = parseParameterFromRequestURI(uriCC, JREPLICA_PARAMETER);
 
         if (jreplica != null) {
             Session session = getSessionInternal(false);
             if (session != null) {
-                session.setNote(Globals.JREPLICA_SESSION_NOTE, jreplica);
+                session.setNote(JREPLICA_SESSION_NOTE, jreplica);
             }
-//            if (!coyoteRequest.requestURI().getByteChunk().isNull()) {
-                removeParameterFromRequestURI(Globals.JREPLICA_PARAMETER);
-//            }
+            removeParameterFromRequestURI(JREPLICA_PARAMETER);
         }
 
     }
@@ -3704,47 +3136,37 @@
         if (context != null && context.getCookies() && response != null) {
             String jvmRoute = ((StandardContext) getContext()).getJvmRoute();
             /*
-             * Check if context has been configured with jvmRoute for
-             * Apache LB. If it has, do not add the JSESSIONID cookie
-             * here, but rely on OutputBuffer#addSessionCookieWithJvmRoute
-             * to add the jvmRoute enhanced JSESSIONID as a cookie right
+             * Check if context has been configured with jvmRoute for Apache LB. If it has, do not add the JSESSIONID cookie here,
+             * but rely on OutputBuffer#addSessionCookieWithJvmRoute to add the jvmRoute enhanced JSESSIONID as a cookie right
              * before the response is flushed.
              */
             if (jvmRoute == null) {
-                Cookie newCookie = new Cookie(
-                        getSafeHeaderValue(getContext().getSessionCookieName()), getSafeHeaderValue(session.getId()));
+                Cookie newCookie = new Cookie(getSafeHeaderValue(getContext().getSessionCookieName()), getSafeHeaderValue(session.getId()));
                 configureSessionCookie(newCookie);
-                ((HttpResponse)response).addSessionCookieInternal(newCookie);
+                ((HttpResponse) response).addSessionCookieInternal(newCookie);
             }
         }
     }
 
     /**
-     * @param parameter  of the form ";" + parameterName + "="
+     * @param parameter of the form ";" + parameterName + "="
      * @return parameterValue
      */
-    private String parseParameterFromRequestURI(CharChunk uriCC, String parameter) {
-
+    private String parseParameterFromRequestURI(CharChunk uriCharChunk, String parameter) {
         String parameterValue = null;
 
-        int semicolon = uriCC.indexOf(parameter, 0, parameter.length(), 0);
+        int semicolon = uriCharChunk.indexOf(parameter, 0, parameter.length(), 0);
         if (semicolon >= 0) {
 
-            int start = uriCC.getStart();
-            int end = uriCC.getEnd();
+            int start = uriCharChunk.getStart();
+            int end = uriCharChunk.getEnd();
 
             int parameterStart = start + semicolon + parameter.length();
-            int semicolon2 = uriCC.indexOf(';', semicolon + parameter.length());
+            int semicolon2 = uriCharChunk.indexOf(';', semicolon + parameter.length());
             if (semicolon2 >= 0) {
-                parameterValue = new String(
-                    uriCC.getBuffer(),
-                    parameterStart,
-                    semicolon2 - semicolon - parameter.length());
+                parameterValue = new String(uriCharChunk.getBuffer(), parameterStart, semicolon2 - semicolon - parameter.length());
             } else {
-                parameterValue = new String(
-                    uriCC.getBuffer(),
-                    parameterStart,
-                    end - parameterStart);
+                parameterValue = new String(uriCharChunk.getBuffer(), parameterStart, end - parameterStart);
             }
 
         }
@@ -3752,67 +3174,48 @@
         return parameterValue;
     }
 
-    // START SJSWS 6376484
     /**
      * Removes the session version from the request URI.
-     * @param parameter   of the form ";" + parameterName + "="
+     *
+     * @param parameter of the form ";" + parameterName + "="
      */
     private void removeParameterFromRequestURI(String parameter) {
-
         int semicolon, semicolon2;
 
-        final DataChunk uriBC =
-                coyoteRequest.getRequest().getRequestURIRef().getRequestURIBC();
+        final DataChunk uriDataChunk = grizzlyRequest.getRequest().getRequestURIRef().getRequestURIBC();
 
-//        start = uriBC.getStart();
-//        end = uriBC.getEnd();
-        semicolon = uriBC.indexOf(parameter, 0);
+        semicolon = uriDataChunk.indexOf(parameter, 0);
 
         if (semicolon > 0) {
-            semicolon2 = uriBC.indexOf(';', semicolon + parameter.length());
+            semicolon2 = uriDataChunk.indexOf(';', semicolon + parameter.length());
 
             final int end;
             if (semicolon2 >= 0) {
                 end = semicolon2;
-                uriBC.notifyDirectUpdate();
+                uriDataChunk.notifyDirectUpdate();
             } else {
-                end = uriBC.getLength();
+                end = uriDataChunk.getLength();
             }
 
-            uriBC.delete(semicolon, end);
-//            uriBC.setEnd(start + semicolon);
-//            byte[] buf = uriBC.getBuffer();
-//            if (semicolon2 >= 0) {
-//                for (int i = 0; i < end - start - semicolon2; i++) {
-//                    buf[start + semicolon + i] = buf[start + i + semicolon2];
-//                }
-//                uriBC.setBytes(buf, start, semicolon
-//                               + (end - start - semicolon2));
-//            }
+            uriDataChunk.delete(semicolon, end);
         }
     }
-    // END SJSWS 6376484
 
     /*
-     * Parses the given session version string into its components. Each
-     * component is stored as an entry in a HashMap, which maps a context
-     * path to its session version number. The HashMap is stored as a
-     * request attribute, to make it available to any target contexts to which
-     * this request may be dispatched.
+     * Parses the given session version string into its components. Each component is stored as an entry in a HashMap, which
+     * maps a context path to its session version number. The HashMap is stored as a request attribute, to make it available
+     * to any target contexts to which this request may be dispatched.
      *
-     * This method also sets the session version number for the context with
-     * which this request has been associated.
+     * This method also sets the session version number for the context with which this request has been associated.
      */
     void parseSessionVersionString(String sessionVersionString) {
         if (sessionVersionString == null || !isSessionVersioningSupported()) {
             return;
         }
 
-        HashMap<String, String> sessionVersions =
-            RequestUtil.parseSessionVersionString(sessionVersionString);
+        HashMap<String, String> sessionVersions = RequestUtil.parseSessionVersionString(sessionVersionString);
         if (sessionVersions != null) {
-            attributes.put(Globals.SESSION_VERSIONS_REQUEST_ATTRIBUTE,
-                           sessionVersions);
+            attributes.put(SESSION_VERSIONS_REQUEST_ATTRIBUTE, sessionVersions);
             if (context != null) {
                 String path = context.getPath();
                 if ("".equals(path)) {
@@ -3827,7 +3230,7 @@
      * Parses the value of the JROUTE cookie, if present.
      */
     void parseJrouteCookie() {
-        org.glassfish.grizzly.http.Cookie[] serverCookies = coyoteRequest.getCookies();
+        org.glassfish.grizzly.http.Cookie[] serverCookies = grizzlyRequest.getCookies();
         int count = serverCookies.length;
         if (count <= 0) {
             return;
@@ -3835,7 +3238,7 @@
 
         for (int i = 0; i < count; i++) {
             org.glassfish.grizzly.http.Cookie scookie = serverCookies[i];
-            if (scookie.getName().equals(Constants.JROUTE_COOKIE)) {
+            if (scookie.getName().equals(JROUTE_COOKIE)) {
                 setJrouteId(scookie.getValue());
                 break;
             }
@@ -3852,20 +3255,16 @@
     }
 
     /**
-     * Gets the jroute id of this request, which may have been
-     * sent as a separate <code>JROUTE</code> cookie or appended to the
-     * session identifier encoded in the URI (if cookies have been disabled).
+     * Gets the jroute id of this request, which may have been sent as a separate <code>JROUTE</code> cookie or appended to
+     * the session identifier encoded in the URI (if cookies have been disabled).
      *
-     * @return The jroute id of this request, or null if this request does not
-     * carry any jroute id
+     * @return The jroute id of this request, or null if this request does not carry any jroute id
      */
     @Override
     public String getJrouteId() {
         return jrouteId;
     }
-    // END SJSAS 6346226
 
-    // START CR 6309511
     /**
      * Parse session id in URL.
      */
@@ -3881,16 +3280,17 @@
         }
 
         // Parse session id from cookies
-        org.glassfish.grizzly.http.Cookie[] serverCookies = coyoteRequest.getCookies();
+        org.glassfish.grizzly.http.Cookie[] serverCookies = grizzlyRequest.getCookies();
         int count = serverCookies.length;
         if (count <= 0) {
             return;
         }
 
-        String sessionCookieName = Globals.SESSION_COOKIE_NAME;
+        String sessionCookieName = SESSION_COOKIE_NAME;
         if (context != null) {
             sessionCookieName = context.getSessionCookieName();
         }
+
         for (int i = 0; i < count; i++) {
             org.glassfish.grizzly.http.Cookie scookie = serverCookies[i];
             if (scookie.getName().equals(sessionCookieName)) {
@@ -3898,44 +3298,35 @@
                 if (!isRequestedSessionIdFromCookie()) {
                     // Accept only the first session id cookie
                     setRequestedSessionId(scookie.getValue());
-                    // TODO: Pass cookie path into
-                    // getSessionVersionFromCookie()
-                    String sessionVersionString = getSessionVersionFromCookie();
-                    parseSessionVersionString(sessionVersionString);
+                    // TODO: Pass cookie path into getSessionVersionFromCookie()
+                    parseSessionVersionString(getSessionVersionFromCookie());
                     setRequestedSessionCookie(true);
-                    // TBD: ServerCookie#getSecure currently always returns
-                    // false.
+                    // TBD: ServerCookie#getSecure currently always returns false.
                     setRequestedSessionIdFromSecureCookie(scookie.isSecure());
                     setRequestedSessionURL(false);
                 } else {
                     if (!isRequestedSessionIdValid()) {
                         // Replace the session id until one is valid
                         setRequestedSessionId(scookie.getValue());
-                        // TODO: Pass cookie path into
-                        // getSessionVersionFromCookie()
-                        String sessionVersionString =
-                            getSessionVersionFromCookie();
-                        parseSessionVersionString(sessionVersionString);
+                        // TODO: Pass cookie path into getSessionVersionFromCookie()
+                        parseSessionVersionString(getSessionVersionFromCookie());
                     }
                 }
             }
         }
     }
-    // END CR 6309511
 
     /*
-     * Returns the value of the first JSESSIONIDVERSION cookie, or null
-     * if no such cookie present in the request.
+     * Returns the value of the first JSESSIONIDVERSION cookie, or null if no such cookie present in the request.
      *
-     * TODO: Add cookie path argument, and return value of JSESSIONIDVERSION
-     * cookie with the specified path.
+     * TODO: Add cookie path argument, and return value of JSESSIONIDVERSION cookie with the specified path.
      */
     private String getSessionVersionFromCookie() {
         if (!isSessionVersioningSupported()) {
             return null;
         }
 
-        org.glassfish.grizzly.http.Cookie[] serverCookies = coyoteRequest.getCookies();
+        org.glassfish.grizzly.http.Cookie[] serverCookies = grizzlyRequest.getCookies();
         int count = serverCookies.length;
         if (count <= 0) {
             return null;
@@ -3943,8 +3334,7 @@
 
         for (int i = 0; i < count; i++) {
             org.glassfish.grizzly.http.Cookie scookie = serverCookies[i];
-            if (scookie.getName().equals(
-                                Globals.SESSION_VERSION_COOKIE_NAME)) {
+            if (scookie.getName().equals(SESSION_VERSION_COOKIE_NAME)) {
                 return scookie.getValue();
             }
         }
@@ -3956,15 +3346,13 @@
      * @return temporary holder for URI params from which session id is parsed
      */
     CharChunk getURIParams() {
-        return uriParamsCC;
+        return uriParamsCharChunk;
     }
 
-    // START CR 6309511
     /**
      * Character conversion of the URI.
      */
-    protected void convertURI(MessageBytes uri)
-            throws Exception {
+    protected void convertURI(MessageBytes uri) throws Exception {
 
         ByteChunk bc = uri.getByteChunk();
         CharChunk cc = uri.getCharChunk();
@@ -3972,8 +3360,7 @@
         cc.allocate(length, -1);
 
         String enc = connector.getURIEncoding();
-        if (enc != null && !enc.isEmpty() &&
-                !Globals.ISO_8859_1_ENCODING.equalsIgnoreCase(enc)) {
+        if (enc != null && !enc.isEmpty() && !ISO_8859_1_ENCODING.equalsIgnoreCase(enc)) {
             B2CConverter conv = getURIConverter();
             try {
                 if (conv == null) {
@@ -3982,17 +3369,16 @@
                 }
             } catch (IOException e) {
                 // Ignore
-                log.log(Level.SEVERE, LogFacade.INVALID_URI_ENCODING);
+                log.log(SEVERE, INVALID_URI_ENCODING);
                 connector.setURIEncoding(null);
             }
             if (conv != null) {
                 try {
                     conv.convert(bc, cc, cc.getBuffer().length - cc.getEnd());
-                    uri.setChars(cc.getBuffer(), cc.getStart(),
-                            cc.getLength());
+                    uri.setChars(cc.getBuffer(), cc.getStart(), cc.getLength());
                     return;
                 } catch (IOException e) {
-                    log.log(Level.SEVERE, LogFacade.INVALID_URI_CHAR_ENCODING);
+                    log.log(SEVERE, INVALID_URI_CHAR_ENCODING);
                     cc.recycle();
                 }
             }
@@ -4008,14 +3394,12 @@
         uri.setChars(cbuf, 0, length);
 
     }
-    // END CR 6309511
 
     @Override
     public DispatcherType getDispatcherType() {
-        DispatcherType dispatcher = (DispatcherType) getAttribute(
-                Globals.DISPATCHER_TYPE_ATTR);
+        DispatcherType dispatcher = (DispatcherType) getAttribute(DISPATCHER_TYPE_ATTR);
         if (dispatcher == null) {
-            dispatcher = DispatcherType.REQUEST;
+            dispatcher = REQUEST;
         }
         return dispatcher;
     }
@@ -4031,31 +3415,22 @@
     /**
      * Starts async processing on this request.
      *
-     * @param servletRequest the ServletRequest with which to initialize
-     * the AsyncContext
-     * @param servletResponse the ServletResponse with which to initialize
-     * the AsyncContext
+     * @param servletRequest the ServletRequest with which to initialize the AsyncContext
+     * @param servletResponse the ServletResponse with which to initialize the AsyncContext
      */
     @Override
-    public AsyncContext startAsync(ServletRequest servletRequest,
-                                   ServletResponse servletResponse)
-            throws IllegalStateException {
+    public AsyncContext startAsync(ServletRequest servletRequest, ServletResponse servletResponse) throws IllegalStateException {
         return startAsync(servletRequest, servletResponse, false);
     }
 
     /**
      * Starts async processing on this request.
      *
-     * @param servletRequest the ServletRequest with which to initialize
-     * the AsyncContext
-     * @param servletResponse the ServletResponse with which to initialize
-     * the AsyncContext
-     * @param isStartAsyncWithZeroArg true if the zero-arg version of
-     * startAsync was called, false otherwise
+     * @param servletRequest the ServletRequest with which to initialize the AsyncContext
+     * @param servletResponse the ServletResponse with which to initialize the AsyncContext
+     * @param isStartAsyncWithZeroArg true if the zero-arg version of startAsync was called, false otherwise
      */
-    private AsyncContext startAsync(ServletRequest servletRequest,
-                ServletResponse servletResponse,
-                boolean isStartAsyncWithZeroArg)
+    private AsyncContext startAsync(ServletRequest servletRequest, ServletResponse servletResponse, boolean isStartAsyncWithZeroArg)
             throws IllegalStateException {
 
         if (servletRequest == null || servletResponse == null) {
@@ -4063,44 +3438,36 @@
         }
 
         if (!isAsyncSupported()) {
-            throw new IllegalStateException(rb.getString(LogFacade.REQUEST_WITHIN_SCOPE_OF_FILTER_OR_SERVLET_EXCEPTION));
+            throw new IllegalStateException(rb.getString(REQUEST_WITHIN_SCOPE_OF_FILTER_OR_SERVLET_EXCEPTION));
         }
 
         final AsyncContextImpl asyncContextLocal = asyncContext;
 
         if (asyncContextLocal != null) {
             if (isAsyncStarted()) {
-                throw new IllegalStateException(rb.getString(LogFacade.START_ASYNC_CALLED_AGAIN_EXCEPTION));
+                throw new IllegalStateException(rb.getString(START_ASYNC_CALLED_AGAIN_EXCEPTION));
             }
             if (asyncContextLocal.isAsyncComplete()) {
-                throw new IllegalStateException(rb.getString(LogFacade.ASYNC_ALREADY_COMPLETE_EXCEPTION));
+                throw new IllegalStateException(rb.getString(ASYNC_ALREADY_COMPLETE_EXCEPTION));
             }
             if (!asyncContextLocal.isStartAsyncInScope()) {
-                throw new IllegalStateException(rb.getString(LogFacade.START_ASYNC_CALLED_OUTSIDE_SCOPE_EXCEPTION));
+                throw new IllegalStateException(rb.getString(START_ASYNC_CALLED_OUTSIDE_SCOPE_EXCEPTION));
             }
 
             // Reinitialize existing AsyncContext
-            asyncContextLocal.reinitialize(servletRequest, servletResponse,
-                    isStartAsyncWithZeroArg);
+            asyncContextLocal.reinitialize(servletRequest, servletResponse, isStartAsyncWithZeroArg);
         } else {
             final AsyncContextImpl asyncContextFinal =
-                    new AsyncContextImpl(this,
-                                         servletRequest,
-                                         (Response) getResponse(),
-                                         servletResponse,
-                                         isStartAsyncWithZeroArg);
+                new AsyncContextImpl(this, servletRequest, (Response) getResponse(), servletResponse, isStartAsyncWithZeroArg);
             asyncContext = asyncContextFinal;
 
-            final CompletionHandler<org.glassfish.grizzly.http.server.Response> requestCompletionHandler =
-                    new EmptyCompletionHandler<org.glassfish.grizzly.http.server.Response>() {
+            final CompletionHandler<org.glassfish.grizzly.http.server.Response> requestCompletionHandler = new EmptyCompletionHandler<>() {
 
-                        @Override
-                        public void completed(org.glassfish.grizzly.http.server.Response response) {
-                            asyncContextFinal.notifyAsyncListeners(
-                                    AsyncContextImpl.AsyncEventType.COMPLETE,
-                                    null);
-                        }
-                    };
+                @Override
+                public void completed(org.glassfish.grizzly.http.server.Response response) {
+                    asyncContextFinal.notifyAsyncListeners(AsyncContextImpl.AsyncEventType.COMPLETE, null);
+                }
+            };
 
             final TimeoutHandler timeoutHandler = new TimeoutHandler() {
 
@@ -4110,8 +3477,7 @@
                 }
             };
 
-            coyoteRequest.getResponse().suspend(-1, TimeUnit.MILLISECONDS,
-                    requestCompletionHandler, timeoutHandler);
+            grizzlyRequest.getResponse().suspend(-1, TimeUnit.MILLISECONDS, requestCompletionHandler, timeoutHandler);
             asyncStartedThread = Thread.currentThread();
         }
 
@@ -4135,9 +3501,8 @@
     /**
      * Disables async support for this request.
      *
-     * Async support is disabled as soon as this request has passed a filter
-     * or servlet that does not support async (either via the designated
-     * annotation or declaratively).
+     * Async support is disabled as soon as this request has passed a filter or servlet that does not support async (either
+     * via the designated annotation or declaratively).
      */
     @Override
     public void disableAsyncSupport() {
@@ -4145,8 +3510,8 @@
     }
 
     void setAsyncTimeout(long timeout) {
-        coyoteRequest.getResponse().getSuspendContext().setTimeout(
-                timeout, TimeUnit.MILLISECONDS);;
+        grizzlyRequest.getResponse().getSuspendContext().setTimeout(timeout, TimeUnit.MILLISECONDS);
+
     }
 
     /**
@@ -4163,29 +3528,26 @@
     @Override
     public AsyncContext getAsyncContext() {
         if (!isAsyncStarted()) {
-            throw new IllegalStateException(rb.getString(LogFacade.REQUEST_NOT_PUT_INTO_ASYNC_MODE_EXCEPTION));
+            throw new IllegalStateException(rb.getString(REQUEST_NOT_PUT_INTO_ASYNC_MODE_EXCEPTION));
         }
 
         return asyncContext;
     }
 
     /*
-     * Invokes any registered AsyncListener instances at their
-     * <tt>onComplete</tt> method
+     * Invokes any registered AsyncListener instances at their <tt>onComplete</tt> method
      */
     void asyncComplete() {
         asyncStarted.set(false);
 
-        if (asyncStartedThread != Thread.currentThread() ||
-                !asyncContext.isOkToConfigure()) {
+        if (asyncStartedThread != Thread.currentThread() || !asyncContext.isOkToConfigure()) {
             // it's not safe to just mark response as resumed
-            coyoteRequest.getResponse().resume();
+            grizzlyRequest.getResponse().resume();
         } else {
             // This code is called if we startAsync and complete in the service() thread.
             // So instead of resuming the suspendedContext (which will finish the response processing),
             // we just have to mark the context as resumed like it has never been suspended.
-            final SuspendedContextImpl suspendContext =
-                    (SuspendedContextImpl) coyoteRequest.getResponse().getSuspendContext();
+            final SuspendedContextImpl suspendContext = (SuspendedContextImpl) grizzlyRequest.getResponse().getSuspendContext();
 
             suspendContext.markResumed();
             suspendContext.getSuspendStatus().reset();
@@ -4193,52 +3555,47 @@
     }
 
     /*
-     * Invokes all registered AsyncListener instances at their
-     * <tt>onTimeout</tt> method.
+     * Invokes all registered AsyncListener instances at their <tt>onTimeout</tt> method.
      *
-     * This method also performs an error dispatch and completes the response
-     * if none of the listeners have done so.
+     * This method also performs an error dispatch and completes the response if none of the listeners have done so.
      */
     void asyncTimeout() {
         if (asyncContext != null) {
-            asyncContext.notifyAsyncListeners(
-                    AsyncContextImpl.AsyncEventType.TIMEOUT, null);
+            asyncContext.notifyAsyncListeners(AsyncContextImpl.AsyncEventType.TIMEOUT, null);
         }
         inputBuffer.disableReadHandler();
         if (response instanceof Response) {
-            ((Response)response).disableWriteHandler();
+            ((Response) response).disableWriteHandler();
         }
         errorDispatchAndComplete(null);
     }
 
     /**
-     * Notifies this Request that the container-initiated dispatch
-     * during which ServletRequest#startAsync was called is about to
-     * return to the container
+     * Notifies this Request that the container-initiated dispatch during which ServletRequest#startAsync was called is
+     * about to return to the container
      */
     void onExitService() {
-        final AsyncContextImpl ac = asyncContext;
+        final AsyncContextImpl asyncContextImpl = asyncContext;
 
-        if (ac != null) {
-            ac.setOkToConfigure(false);
+        if (asyncContextImpl != null) {
+            asyncContextImpl.setOkToConfigure(false);
 
             if (asyncStarted.get()) {
-                coyoteRequest.getResponse().getSuspendContext().setTimeout(
-                        ac.getTimeout(), TimeUnit.MILLISECONDS);
+                grizzlyRequest.getResponse().getSuspendContext().setTimeout(asyncContextImpl.getTimeout(), TimeUnit.MILLISECONDS);
             }
 
-            ac.onExitService();
+            asyncContextImpl.onExitService();
         }
         afterService = true;
         if (resume) {
-            coyoteRequest.getResponse().resume();
+            grizzlyRequest.getResponse().resume();
         }
 
     }
 
     void resumeAfterService() {
         if (afterService) {
-            coyoteRequest.getResponse().resume();
+            grizzlyRequest.getResponse().resume();
         } else {
             resume = true;
         }
@@ -4258,35 +3615,29 @@
 
     void errorDispatchAndComplete(Throwable t) {
         /*
-         * If no listeners, or none of the listeners called
-         * AsyncContext#complete or any of the AsyncContext#dispatch
-         * methods (in which case asyncStarted would have been set to false),
-         * perform an error dispatch with a status code equal to 500.
+         * If no listeners, or none of the listeners called AsyncContext#complete or any of the AsyncContext#dispatch methods
+         * (in which case asyncStarted would have been set to false), perform an error dispatch with a status code equal to 500.
          */
-        final AsyncContextImpl ac = asyncContext;
-        if (ac != null
-                && !ac.isDispatchInScope()
-                && !ac.isAsyncComplete()) {
-            ((HttpServletResponse) response).setStatus(
-                HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+        final AsyncContextImpl asyncContextImpl = asyncContext;
+        if (asyncContextImpl != null && !asyncContextImpl.isDispatchInScope() && !asyncContextImpl.isAsyncComplete()) {
+            ((HttpServletResponse) response).setStatus(SC_INTERNAL_SERVER_ERROR);
             response.setError();
             if (t != null) {
-                setAttribute(RequestDispatcher.ERROR_EXCEPTION, t);
+                setAttribute(ERROR_EXCEPTION, t);
             }
             try {
                 if (hostValve != null) {
                     hostValve.postInvoke(this, response);
                 }
             } catch (Exception e) {
-                log.log(Level.SEVERE, LogFacade.UNABLE_PERFORM_ERROR_DISPATCH, e);
+                log.log(SEVERE, UNABLE_PERFORM_ERROR_DISPATCH, e);
             } finally {
                 /*
-                 * If no matching error page was found, or the error page
-                 * did not call AsyncContext#complete or any of the
+                 * If no matching error page was found, or the error page did not call AsyncContext#complete or any of the
                  * AsyncContext#dispatch methods, call AsyncContext#complete
                  */
-                if (!ac.isAsyncComplete()) {
-                    ac.complete();
+                if (!asyncContextImpl.isAsyncComplete()) {
+                    asyncContextImpl.complete();
                 }
             }
         }
@@ -4294,25 +3645,26 @@
 
     private Multipart getMultipart() {
         if (multipart == null) {
-            multipart = new Multipart(this,
-                    wrapper.getMultipartLocation(),
-                    wrapper.getMultipartMaxFileSize(),
-                    wrapper.getMultipartMaxRequestSize(),
-                    wrapper.getMultipartFileSizeThreshold());
+            multipart =
+                new Multipart(
+                    this, wrapper.getMultipartLocation(), wrapper.getMultipartMaxFileSize(),
+                    wrapper.getMultipartMaxRequestSize(), wrapper.getMultipartFileSizeThreshold());
         }
+
         return multipart;
     }
 
     private boolean isMultipartConfigured() {
         if (wrapper instanceof StandardWrapper) {
-            return ((StandardWrapper)wrapper).isMultipartConfigured();
+            return ((StandardWrapper) wrapper).isMultipartConfigured();
         }
+
         return false;
     }
 
     private void checkMultipartConfiguration(String name) {
-        if (! isMultipartConfigured()) {
-            String msg = MessageFormat.format(rb.getString(LogFacade.REQUEST_CALLED_WITHOUT_MULTIPART_CONFIG_EXCEPTION), name);
+        if (!isMultipartConfigured()) {
+            String msg = MessageFormat.format(rb.getString(REQUEST_CALLED_WITHOUT_MULTIPART_CONFIG_EXCEPTION), name);
             throw new IllegalStateException(msg);
         }
     }
@@ -4333,26 +3685,6 @@
      * Log a message on the Logger associated with our Container (if any).
      *
      * @param message Message to be logged
-     *
-    private void log(String message) {
-        org.apache.catalina.Logger logger = null;
-        if (connector != null && connector.getContainer() != null) {
-            logger = connector.getContainer().getLogger();
-        }
-        String localName = "Request";
-        if (logger != null) {
-            logger.log(localName + " " + message);
-        } else {
-            if (log.isLoggable(Level.INFO)) {
-                log.info(localName + " " + message);
-            }
-        }
-    }*/
-
-    /**
-     * Log a message on the Logger associated with our Container (if any).
-     *
-     * @param message Message to be logged
      * @param t Associated exception
      */
     private void log(String message, Throwable t) {
@@ -4360,94 +3692,88 @@
         if (connector != null && connector.getContainer() != null) {
             logger = connector.getContainer().getLogger();
         }
+
         String localName = "Request";
         if (logger != null) {
-            logger.log(localName + " " + message, t,
-                    org.apache.catalina.Logger.WARNING);
+            logger.log(localName + " " + message, t, org.apache.catalina.Logger.WARNING);
         } else {
-            log.log(Level.WARNING, localName + " " + message, t);
+            log.log(WARNING, localName + " " + message, t);
         }
     }
 
-    // START SJSAS 6419950
     private void populateSSLAttributes() {
-        RequestUtils.populateSSLAttributes(coyoteRequest);
-        Object attr = coyoteRequest.getAttribute(Globals.CERTIFICATES_ATTR);
+        RequestUtils.populateSSLAttributes(grizzlyRequest);
+        Object attr = grizzlyRequest.getAttribute(CERTIFICATES_ATTR);
         if (attr != null) {
-            attributes.put(Globals.CERTIFICATES_ATTR, attr);
+            attributes.put(CERTIFICATES_ATTR, attr);
         }
-        attr = coyoteRequest.getAttribute(Globals.CIPHER_SUITE_ATTR);
+        attr = grizzlyRequest.getAttribute(CIPHER_SUITE_ATTR);
         if (attr != null) {
-            attributes.put(Globals.CIPHER_SUITE_ATTR, attr);
+            attributes.put(CIPHER_SUITE_ATTR, attr);
         }
-        attr = coyoteRequest.getAttribute(Globals.KEY_SIZE_ATTR);
+        attr = grizzlyRequest.getAttribute(KEY_SIZE_ATTR);
         if (attr != null) {
-            attributes.put(Globals.KEY_SIZE_ATTR, attr);
+            attributes.put(KEY_SIZE_ATTR, attr);
         }
-        attr = coyoteRequest.getAttribute(Globals.SSL_SESSION_ID_ATTR);
+        attr = grizzlyRequest.getAttribute(SSL_SESSION_ID_ATTR);
         if (attr != null) {
-            attributes.put(Globals.SSL_SESSION_ID_ATTR, attr);
+            attributes.put(SSL_SESSION_ID_ATTR, attr);
         }
     }
-    // END SJSAS 6419950
 
-    // START GlassFish 896
     private void initSessionTracker() {
         notes.put(Globals.SESSION_TRACKER, sessionTracker);
     }
-    // END GlassFish 896
 
     /**
-     * lock the session associated with this request
-     * this will be a foreground lock
-     * checks for background lock to clear
-     * and does a decay poll loop to wait until
-     * it is clear; after 5 times it takes control for
-     * the foreground
+     * lock the session associated with this request this will be a foreground lock checks for background lock to clear and
+     * does a decay poll loop to wait until it is clear; after 5 times it takes control for the foreground
      *
      * @return the session that's been locked
      */
     @Override
     public Session lockSession() {
-        Session sess = getSessionInternal(false);
+        Session session = getSessionInternal(false);
+
         // Now lock the session
-        if (sess != null) {
+        if (session != null) {
             long pollTime = 200L;
             int maxNumberOfRetries = 7;
             int tryNumber = 0;
             boolean keepTrying = true;
             boolean lockResult = false;
+
             // Try to lock up to maxNumberOfRetries times.
             // Poll and wait starting with 200 ms.
-            while(keepTrying) {
-                lockResult = sess.lockForeground();
-                if(lockResult) {
+            while (keepTrying) {
+                lockResult = session.lockForeground();
+                if (lockResult) {
                     keepTrying = false;
                     break;
                 }
                 tryNumber++;
-                if(tryNumber < maxNumberOfRetries) {
+                if (tryNumber < maxNumberOfRetries) {
                     pollTime = pollTime * 2L;
                     threadSleep(pollTime);
                 } else {
                     // Tried to wait and lock maxNumberOfRetries times.
                     // Unlock the background so we can take over.
-                    log.log(Level.WARNING, LogFacade.BREAKING_BACKGROUND_LOCK_EXCEPTION, sess);
-                    if (sess instanceof StandardSession) {
-                        ((StandardSession)sess).unlockBackground();
+                    log.log(WARNING, BREAKING_BACKGROUND_LOCK_EXCEPTION, session);
+                    if (session instanceof StandardSession) {
+                        ((StandardSession) session).unlockBackground();
                     }
                 }
             }
         }
 
-        return sess;
+        return session;
     }
 
     private void threadSleep(long sleepTime) {
         try {
             Thread.sleep(sleepTime);
         } catch (InterruptedException e) {
-            ;
+
         }
     }
 
@@ -4456,48 +3782,45 @@
      */
     @Override
     public void unlockSession() {
-        Session sess = getSessionInternal(false);
+        Session session = getSessionInternal(false);
         // Now unlock the session
-        if (sess != null) {
-            sess.unlockForeground();
+        if (session != null) {
+            session.unlockForeground();
         }
     }
 
     /**
-     * Increments the version of the given session, and stores it as a
-     * request attribute, so it can later be included in a response cookie.
+     * Increments the version of the given session, and stores it as a request attribute, so it can later be included in a
+     * response cookie.
      */
-    private void incrementSessionVersion(StandardSession ss,
-                                         Context context) {
-        if (ss == null || context == null) {
+    private void incrementSessionVersion(StandardSession standardSession, Context context) {
+        if (standardSession == null || context == null) {
             return;
         }
 
-        String versionString = Long.toString(ss.incrementVersion());
+        String versionString = Long.toString(standardSession.incrementVersion());
 
         Map<String, String> sessionVersions = getSessionVersionsRequestAttribute();
         if (sessionVersions == null) {
-            sessionVersions = new HashMap<String, String>();
-            setAttribute(Globals.SESSION_VERSIONS_REQUEST_ATTRIBUTE,
-                         sessionVersions);
+            sessionVersions = new HashMap<>();
+            setAttribute(SESSION_VERSIONS_REQUEST_ATTRIBUTE, sessionVersions);
         }
+
         String path = context.getPath();
         if ("".equals(path)) {
             path = "/";
         }
+
         sessionVersions.put(path, versionString);
     }
 
     @SuppressWarnings("unchecked")
     Map<String, String> getSessionVersionsRequestAttribute() {
-        return (Map<String, String>) getAttribute(
-                Globals.SESSION_VERSIONS_REQUEST_ATTRIBUTE);
+        return (Map<String, String>) getAttribute(SESSION_VERSIONS_REQUEST_ATTRIBUTE);
     }
 
     private boolean isSessionVersioningSupported() {
-        return context != null &&
-            context.getManager() != null &&
-            context.getManager().isSessionVersioningSupported();
+        return context != null && context.getManager() != null && context.getManager().isSessionVersioningSupported();
     }
 
     @Override
@@ -4518,87 +3841,4 @@
         return null;
     }
 
-    /**
-     * This class will be invoked by Grizzly when a suspended operation is
-     * resumed {@link org.glassfish.grizzly.http.server.Response#resume} or has timed out.
-     * See {@link org.glassfish.grizzly.http.server.Response.ResponseAttachment} for details.
-     */
-//    private final static class RequestAttachment<A> extends
-//            org.glassfish.grizzly.http.server.Response.ResponseAttachment {
-//
-//        private Response res;
-//
-//        public RequestAttachment(Long timeout, A attachment,
-//                CompletionHandler<? super A> completionHandler,
-//                Response res) {
-//            super(timeout, attachment, completionHandler, res.getCoyoteResponse());
-//            this.res = res;
-//        }
-//
-//        @Override
-//        public void resume() {
-//            getCompletionHandler().resumed(getAttachment());
-//            if (log.isLoggable(Level.FINE)) {
-//                log.log(Level.FINE, "RequestAttachement.resume: " + res);
-//            }
-//            completeProcessing();
-//        }
-//
-//        /**
-//         * {@inheritDoc}
-//         */
-//        //@Override
-//        public void handleSelectedKey(SelectionKey selectionKey) {
-//            if (!selectionKey.isValid() || discardDisconnectEvent){
-//                selectionKey.cancel();
-//                return;
-//            }
-//            try {
-//                ((Request)getAttachment()).clientClosedConnection = ((SocketChannel)selectionKey.channel()).
-//                    read(ByteBuffer.allocate(1)) == -1;
-//            } catch (IOException ex) {
-//
-//            } finally{
-//                if (((Request)getAttachment()).clientClosedConnection){
-//                   selectionKey.cancel();
-//                   getCompletionHandler().cancelled(getAttachment());
-//                }
-//            }
-//        }
-//
-//        void completeProcessing() {
-//            try {
-//                res.finishResponse();
-//            } catch (IOException ex) {
-//                if (log.isLoggable(Level.FINE)) {
-//                    log.log(Level.FINE, "res.finishResponse()" + res);
-//                }
-//            }
-//            res.recycle();
-//            res.getRequest().recycle();
-//        }
-//
-//        @Override
-//        public boolean timeout() {
-//            // If the buffers are empty, commit the response header
-//            boolean result = true;
-//
-//            try {
-//                if (log.isLoggable(Level.FINE)) {
-//                    log.log(Level.FINE, "RequestAttachement.timeout: " + res);
-//                }
-//                cancel();
-//            } finally {
-//                Request req = (Request)getAttachment();
-//                final AsyncContextImpl asyncContext = req.asyncContext;
-//                if (asyncContext != null && !asyncContext.getAndResetDispatchInScope()) {
-//                completeProcessing();
-//                } else {
-//                    result = false;
-//            }
-//        }
-//
-//            return result;
-//    }
-//}
 }
diff --git a/appserver/web/web-core/src/main/java/org/apache/catalina/connector/Response.java b/appserver/web/web-core/src/main/java/org/apache/catalina/connector/Response.java
index 02203d8..593221a 100644
--- a/appserver/web/web-core/src/main/java/org/apache/catalina/connector/Response.java
+++ b/appserver/web/web-core/src/main/java/org/apache/catalina/connector/Response.java
@@ -17,6 +17,21 @@
 
 package org.apache.catalina.connector;
 
+import static org.apache.catalina.Globals.JREPLICA_PARAMETER;
+import static org.apache.catalina.Globals.JREPLICA_SESSION_NOTE;
+import static org.apache.catalina.Globals.SESSION_PARAMETER_NAME;
+import static org.apache.catalina.Globals.SESSION_VERSION_PARAMETER;
+import static org.apache.catalina.LogFacade.CANNOT_CALL_SEND_ERROR_EXCEPTION;
+import static org.apache.catalina.LogFacade.CANNOT_CALL_SEND_REDIRECT_EXCEPTION;
+import static org.apache.catalina.LogFacade.CANNOT_CHANGE_BUFFER_SIZE_EXCEPTION;
+import static org.apache.catalina.LogFacade.CANNOT_RESET_BUFFER_EXCEPTION;
+import static org.apache.catalina.LogFacade.ERROR_DURING_FINISH_RESPONSE;
+import static org.apache.catalina.LogFacade.GET_WRITER_BEEN_CALLED_EXCEPTION;
+import static org.apache.catalina.Logger.WARNING;
+import static org.apache.catalina.connector.Constants.PROXY_JROUTE;
+import static org.glassfish.common.util.InputValidationUtil.getSafeHeaderName;
+import static org.glassfish.common.util.InputValidationUtil.getSafeHeaderValue;
+import static org.glassfish.web.util.HtmlEntityEncoder.encodeXSS;
 
 import java.io.IOException;
 import java.io.OutputStream;
@@ -28,34 +43,36 @@
 import java.security.PrivilegedActionException;
 import java.security.PrivilegedExceptionAction;
 import java.text.SimpleDateFormat;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Locale;
+import java.util.Map;
+import java.util.ResourceBundle;
+import java.util.TimeZone;
 import java.util.function.Supplier;
 import java.util.logging.Level;
 import java.util.logging.Logger;
-import jakarta.servlet.ServletOutputStream;
-import jakarta.servlet.http.Cookie;
-import jakarta.servlet.http.HttpServletResponse;
 
-import com.sun.appserv.ProxyHandler;
 import org.apache.catalina.Connector;
 import org.apache.catalina.Context;
-import org.apache.catalina.LogFacade;
-import org.apache.catalina.Globals;
 import org.apache.catalina.HttpResponse;
+import org.apache.catalina.LogFacade;
 import org.apache.catalina.Session;
 import org.apache.catalina.core.StandardContext;
 import org.apache.catalina.security.SecurityUtil;
-import org.apache.catalina.util.CharsetMapper;
 import org.apache.catalina.util.RequestUtil;
-import org.glassfish.common.util.InputValidationUtil;
 import org.glassfish.grizzly.http.util.CharChunk;
-import org.glassfish.grizzly.http.util.CookieSerializerUtils;
-import org.glassfish.grizzly.http.util.CookieUtils;
+import org.glassfish.grizzly.http.util.CookieHeaderGenerator;
 import org.glassfish.grizzly.http.util.FastHttpDateFormat;
 import org.glassfish.grizzly.http.util.MimeHeaders;
 import org.glassfish.grizzly.http.util.UEncoder;
-import org.glassfish.web.util.HtmlEntityEncoder;
-// START S1AS 6170450
+
+import com.sun.appserv.ProxyHandler;
+
+import jakarta.servlet.ServletOutputStream;
+import jakarta.servlet.http.Cookie;
+import jakarta.servlet.http.HttpServletResponse;
 
 // END S1AS 6170450
 
@@ -67,80 +84,40 @@
  * @version $Revision: 1.22 $ $Date: 2007/05/05 05:32:43 $
  */
 
-public class Response
-    implements HttpResponse, HttpServletResponse {
+public class Response implements HttpResponse, HttpServletResponse {
 
     // ------------------------------------------------------ Static variables
 
-    private static final Logger log = LogFacade.getLogger();
-    private static final ResourceBundle rb = log.getResourceBundle();
-
-
-    /**
-     * Whether or not to enforce scope checking of this object.
-     */
-    private static boolean enforceScope = false;
-
-    public static final String HTTP_RESPONSE_DATE_HEADER =
-        "EEE, dd MMM yyyy HH:mm:ss zzz";
+    public static final String HTTP_RESPONSE_DATE_HEADER = "EEE, dd MMM yyyy HH:mm:ss zzz";
 
     /**
      * Descriptive information about this Response implementation.
      */
-    protected static final String info =
-        "org.apache.catalina.connector.Response/1.0";
+    protected static final String info = "org.apache.catalina.connector.Response/1.0";
 
+    private static final Logger log = LogFacade.getLogger();
+    private static final ResourceBundle rb = log.getResourceBundle();
 
-    // ----------------------------------------------------------- Constructors
-
-    public Response() {
-        // START OF SJSAS 6231069
-        outputBuffer = new OutputBuffer();
-        outputStream = new CoyoteOutputStream(outputBuffer);
-        writer = createWriter(outputBuffer);
-        // END OF SJSAS 6231069
-        urlEncoder.addSafeCharacter('/');
-    }
-
-    // START OF SJSAS 6231069
-    public Response(boolean chunkingDisabled) {
-        outputBuffer = new OutputBuffer();
-        outputStream = new CoyoteOutputStream(outputBuffer);
-        writer = createWriter(outputBuffer);
-        urlEncoder.addSafeCharacter('/');
-    }
-    // END OF SJSAS 6231069
-
+    /**
+     * Whether or not to enforce scope checking of this object.
+     */
+    private static boolean enforceScope;
 
     // ----------------------------------------------------- Instance Variables
 
-    // BEGIN S1AS 4878272
     private String detailErrorMsg;
-    // END S1AS 4878272
 
     /**
      * The date format we will use for creating date headers.
      */
-    protected SimpleDateFormat format = null;
+    protected SimpleDateFormat format;
 
     /**
      * Associated context.
      */
-    protected Context context = null;
+    protected Context context;
 
-    protected boolean upgrade = false;
-
-    // ------------------------------------------------------------- Properties
-
-    /**
-     * Set whether or not to enforce scope checking of this object.
-     */
-    public static void setEnforceScope(boolean enforce) {
-
-        enforceScope = enforce;
-
-    }
-
+    protected boolean upgrade;
 
     /**
      * Associated Catalina connector.
@@ -148,8 +125,49 @@
     protected Connector connector;
 
     /**
+     * The request with which this response is associated.
+     */
+    protected Request connectorRequest;
+
+    /**
+     * The facade associated with this response.
+     */
+    protected ResponseFacade connectorResponsefacade;
+
+    /**
+     * Grizzly response.
+     */
+    protected org.glassfish.grizzly.http.server.Response grizzlyResponse;
+
+    // ----------------------------------------------------------- Constructors
+
+    public Response() {
+        outputBuffer = new OutputBuffer();
+        outputStream = new CoyoteOutputStream(outputBuffer);
+        writer = createWriter(outputBuffer);
+        urlEncoder.addSafeCharacter('/');
+    }
+
+    public Response(boolean chunkingDisabled) {
+        outputBuffer = new OutputBuffer();
+        outputStream = new CoyoteOutputStream(outputBuffer);
+        writer = createWriter(outputBuffer);
+        urlEncoder.addSafeCharacter('/');
+    }
+
+    // ------------------------------------------------------------- Properties
+
+    /**
+     * Set whether or not to enforce scope checking of this object.
+     */
+    public static void setEnforceScope(boolean enforce) {
+        enforceScope = enforce;
+    }
+
+    /**
      * Return the Connector through which this Request was received.
      */
+    @Override
     public Connector getConnector() {
         return this.connector;
     }
@@ -159,23 +177,18 @@
      *
      * @param connector The new connector
      */
+    @Override
     public void setConnector(Connector connector) {
         this.connector = connector;
     }
 
-
-    /**
-     * Coyote response.
-     */
-    protected org.glassfish.grizzly.http.server.Response coyoteResponse;
-
     /**
      * Set the Coyote response.
      *
      * @param coyoteResponse The Coyote response
      */
     public void setCoyoteResponse(org.glassfish.grizzly.http.server.Response coyoteResponse) {
-        this.coyoteResponse = coyoteResponse;
+        this.grizzlyResponse = coyoteResponse;
         outputBuffer.setCoyoteResponse(this);
     }
 
@@ -183,127 +196,97 @@
      * Get the Coyote response.
      */
     public org.glassfish.grizzly.http.server.Response getCoyoteResponse() {
-        return coyoteResponse;
+        return grizzlyResponse;
     }
 
-
     /**
      * Return the Context within which this Request is being processed.
      */
+    @Override
     public Context getContext() {
         /*
-         * Ideally, we would call CoyoteResponse.setContext() from
-         * CoyoteAdapter (the same way we call it for CoyoteRequest), and
-         * have getContext() return this context. However, for backwards
-         * compatibility with WS 7.0's NSAPIProcessor, which does not call
-         * CoyoteResponse.setContext(), we must delegate to the getContext()
-         * method of the linked request object.
+         * Ideally, we would call CoyoteResponse.setContext() from CoyoteAdapter (the same way we call it for CoyoteRequest),
+         * and have getContext() return this context. However, for backwards compatibility with WS 7.0's NSAPIProcessor, which
+         * does not call CoyoteResponse.setContext(), we must delegate to the getContext() method of the linked request object.
          */
-        return request.getContext();
+        return connectorRequest.getContext();
     }
 
     /**
-     * Set the Context within which this Request is being processed.  This
-     * must be called as soon as the appropriate Context is identified, because
-     * it identifies the value to be returned by <code>getContextPath()</code>,
-     * and thus enables parsing of the request URI.
+     * Set the Context within which this Request is being processed. This must be called as soon as the appropriate Context
+     * is identified, because it identifies the value to be returned by <code>getContextPath()</code>, and thus enables
+     * parsing of the request URI.
      *
      * @param context The newly associated Context
      */
+    @Override
     public void setContext(Context context) {
         this.context = context;
     }
 
-
     /**
      * The associated output buffer.
      */
-    // START OF SJSAS 6231069
-    //protected OutputBuffer outputBuffer = new OutputBuffer();
     protected OutputBuffer outputBuffer;
-    // END OF SJSAS 6231069
 
     /**
      * The associated output stream.
      */
-    // START OF SJSAS 6231069
-    /*protected CoyoteOutputStream outputStream =
-        new CoyoteOutputStream(outputBuffer);*/
     protected CoyoteOutputStream outputStream;
-    // END OF SJSAS 6231069
 
     /**
      * The associated writer.
      */
-    // START OF SJSAS 6231069
-    // protected CoyoteWriter writer = new CoyoteWriter(outputBuffer);
     protected CoyoteWriter writer;
-    // END OF SJSAS 6231069
-
 
     /**
      * The application commit flag.
      */
-    protected boolean appCommitted = false;
-
+    protected boolean appCommitted;
 
     /**
      * The included flag.
      */
-    protected boolean included = false;
-
+    protected boolean included;
 
     /**
      * The characterEncoding flag
      */
-    private boolean isCharacterEncodingSet = false;
-
-    /**
-     * The contextType flag
-     */
-    private boolean isContentTypeSet = false;
-
+    private boolean isCharacterEncodingSet;
 
     /**
      * The error flag.
      */
-    protected boolean error = false;
-
+    protected boolean error;
 
     /**
      * Using output stream flag.
      */
-    protected boolean usingOutputStream = false;
-
+    protected boolean usingOutputStream;
 
     /**
      * Using writer flag.
      */
-    protected boolean usingWriter = false;
-
+    protected boolean usingWriter;
 
     /**
      * URL encoder.
      */
     protected UEncoder urlEncoder = new UEncoder();
 
-
     /**
      * Recyclable buffer to hold the redirect URL.
      */
-    protected CharChunk redirectURLCC = new CharChunk();
-
+    protected CharChunk redirectURLCharChunk = new CharChunk();
 
     // --------------------------------------------------------- Public Methods
 
-
     /**
-     * Release all object references, and initialize instance variables, in
-     * preparation for reuse of this object.
+     * Release all object references, and initialize instance variables, in preparation for reuse of this object.
      */
+    @Override
     public void recycle() {
-
-        if (request != null && request.isAsyncStarted()) {
+        if (connectorRequest != null && connectorRequest.isAsyncStarted()) {
             return;
         }
 
@@ -314,14 +297,13 @@
         appCommitted = false;
         included = false;
         error = false;
-        isContentTypeSet = false;
         isCharacterEncodingSet = false;
         detailErrorMsg = null;
 
         if (enforceScope) {
-            if (facade != null) {
-                facade.clear();
-                facade = null;
+            if (connectorResponsefacade != null) {
+                connectorResponsefacade.clear();
+                connectorResponsefacade = null;
             }
             if (outputStream != null) {
                 outputStream.clear();
@@ -337,77 +319,67 @@
 
     }
 
-
     // ------------------------------------------------------- Response Methods
 
-
     /**
      * Return the number of bytes actually written to the output stream.
      */
+    @Override
     public int getContentCount() {
         return outputBuffer.getContentWritten();
     }
 
-
     /**
      * Set the application commit flag.
      *
      * @param appCommitted The new application committed flag value
      */
+    @Override
     public void setAppCommitted(boolean appCommitted) {
         this.appCommitted = appCommitted;
     }
 
-
     /**
      * Application commit flag accessor.
      */
+    @Override
     public boolean isAppCommitted() {
-        return this.appCommitted || isCommitted() || isSuspended()
-                || getContentLength() > 0
-                    && getContentCount() >= getContentLength();
+        return appCommitted || isCommitted() || isSuspended() || getContentLength() > 0 && getContentCount() >= getContentLength();
     }
 
-
     /**
      * Return the "processing inside an include" flag.
      */
+    @Override
     public boolean getIncluded() {
         return included;
     }
 
-
     /**
      * Set the "processing inside an include" flag.
      *
-     * @param included <code>true</code> if we are currently inside a
-     *  RequestDispatcher.include(), else <code>false</code>
+     * @param included <code>true</code> if we are currently inside a RequestDispatcher.include(), else <code>false</code>
      */
+    @Override
     public void setIncluded(boolean included) {
         this.included = included;
     }
 
-
     /**
-     * Return descriptive information about this Response implementation and
-     * the corresponding version number, in the format
+     * Return descriptive information about this Response implementation and the corresponding version number, in the format
      * <code>&lt;description&gt;/&lt;version&gt;</code>.
      */
+    @Override
     public String getInfo() {
         return info;
     }
 
-
-    /**
-     * The request with which this response is associated.
-     */
-    protected Request request = null;
-
     /**
      * Return the Request with which this Response is associated.
      */
+    @Override
     public org.apache.catalina.Request getRequest() {
-        return this.request;
+        return connectorRequest;
     }
 
     /**
@@ -415,33 +387,28 @@
      *
      * @param request The new associated request
      */
+    @Override
     public void setRequest(org.apache.catalina.Request request) {
         if (request instanceof Request) {
-            this.request = (Request) request;
+            this.connectorRequest = (Request) request;
         }
     }
 
-
     /**
-     * The facade associated with this response.
+     * Return the <code>ServletResponse</code> for which this object is the facade.
      */
-    protected ResponseFacade facade = null;
-
-    /**
-     * Return the <code>ServletResponse</code> for which this object
-     * is the facade.
-     */
+    @Override
     public HttpServletResponse getResponse() {
-        if (facade == null) {
-            facade = new ResponseFacade(this);
+        if (connectorResponsefacade == null) {
+            connectorResponsefacade = new ResponseFacade(this);
         }
-        return facade;
+        return connectorResponsefacade;
     }
 
-
     /**
      * Return the output stream associated with this Response.
      */
+    @Override
     public OutputStream getStream() {
         if (outputStream == null) {
             outputStream = new CoyoteOutputStream(outputBuffer);
@@ -449,81 +416,77 @@
         return outputStream;
     }
 
-
     /**
      * Set the output stream associated with this Response.
      *
      * @param stream The new output stream
      */
+    @Override
     public void setStream(OutputStream stream) {
         // This method is evil
     }
 
-
     /**
      * Set the suspended flag.
      *
      * @param suspended The new suspended flag value
      */
+    @Override
     public void setSuspended(boolean suspended) {
         outputBuffer.setSuspended(suspended);
     }
 
-
     /**
      * Suspended flag accessor.
      */
+    @Override
     public boolean isSuspended() {
         return outputBuffer.isSuspended();
     }
 
-
     /**
      * Set the error flag.
      */
+    @Override
     public void setError() {
         error = true;
     }
 
-
     /**
      * Error flag accessor.
      */
+    @Override
     public boolean isError() {
         return error;
     }
 
-
-    // BEGIN S1AS 4878272
     /**
      * Sets detail error message.
      *
      * @param message detail error message
      */
+    @Override
     public void setDetailMessage(String message) {
         this.detailErrorMsg = message;
     }
 
-
     /**
      * Gets detail error message.
      *
      * @return the detail error message
      */
+    @Override
     public String getDetailMessage() {
         return this.detailErrorMsg;
     }
-    // END S1AS 4878272
-
 
     /**
-     * Create and return a ServletOutputStream to write the content
-     * associated with this Response.
+     * Create and return a ServletOutputStream to write the content associated with this Response.
      *
      * @exception IOException if an input/output error occurs
      */
-    public ServletOutputStream createOutputStream()
-        throws IOException {
+    @Override
+    public ServletOutputStream createOutputStream() throws IOException {
         // Probably useless
         if (outputStream == null) {
             outputStream = new CoyoteOutputStream(outputBuffer);
@@ -531,179 +494,158 @@
         return outputStream;
     }
 
-
     /**
-     * Perform whatever actions are required to flush and close the output
-     * stream or writer, in a single operation.
+     * Perform whatever actions are required to flush and close the output stream or writer, in a single operation.
      *
      * @exception IOException if an input/output error occurs
      */
-    public void finishResponse()
-        throws IOException {
-
+    @Override
+    public void finishResponse() throws IOException {
         // Writing leftover bytes
         try {
             outputBuffer.close();
-        } catch(IOException e) {
-        ;
-        } catch(Throwable t) {
-        log(rb.getString(LogFacade.ERROR_DURING_FINISH_RESPONSE), t);
+        } catch (IOException e) {
+
+        } catch (Throwable t) {
+            log(rb.getString(ERROR_DURING_FINISH_RESPONSE), t);
         }
     }
 
-
     /**
      * Return the content length that was set or calculated for this Response.
      */
+    @Override
     public int getContentLength() {
-        return coyoteResponse.getContentLength();
+        return grizzlyResponse.getContentLength();
     }
 
-
     /**
-     * Return the content type that was set or calculated for this response,
-     * or <code>null</code> if no content type was set.
+     * Return the content type that was set or calculated for this response, or <code>null</code> if no content type was
+     * set.
      */
+    @Override
     public String getContentType() {
-        return coyoteResponse.getContentType();
+        return grizzlyResponse.getContentType();
     }
 
-
     /**
-     * Return a PrintWriter that can be used to render error messages,
-     * regardless of whether a stream or writer has already been acquired.
+     * Return a PrintWriter that can be used to render error messages, regardless of whether a stream or writer has already
+     * been acquired.
      *
-     * @return Writer which can be used for error reports. If the response is
-     * not an error report returned using sendError or triggered by an
-     * unexpected exception thrown during the servlet processing
-     * (and only in that case), null will be returned if the response stream
-     * has already been used.
+     * @return Writer which can be used for error reports. If the response is not an error report returned using sendError
+     * or triggered by an unexpected exception thrown during the servlet processing (and only in that case), null will be
+     * returned if the response stream has already been used.
      *
      * @exception IOException if an input/output error occurs
      */
+    @Override
     public PrintWriter getReporter() throws IOException {
-        if (outputBuffer.isNew()) {
-            outputBuffer.checkConverter();
-            if (writer == null) {
-                writer = createWriter(outputBuffer);
-            }
-            return writer;
-        } else {
+        if (!outputBuffer.isNew()) {
             return null;
         }
+
+        outputBuffer.checkConverter();
+        if (writer == null) {
+            writer = createWriter(outputBuffer);
+        }
+
+        return writer;
     }
 
-
     // ------------------------------------------------ ServletResponse Methods
 
-
     /**
      * Flush the buffer and commit this response.
      *
      * @exception IOException if an input/output error occurs
      */
-    public void flushBuffer()
-        throws IOException {
+    @Override
+    public void flushBuffer() throws IOException {
         outputBuffer.flush();
     }
 
-
     /**
      * Return the actual buffer size used for this Response.
      */
+    @Override
     public int getBufferSize() {
         return outputBuffer.getBufferSize();
     }
 
-
     /**
      * Return the character encoding used for this Response.
      */
+    @Override
     public String getCharacterEncoding() {
-        return coyoteResponse.getCharacterEncoding();
+        return grizzlyResponse.getCharacterEncoding();
     }
 
-
     /*
-     * Overrides the name of the character encoding used in the body
-     * of the request. This method must be called prior to reading
-     * request parameters or reading input using getReader().
+     * Overrides the name of the character encoding used in the body of the request. This method must be called prior to
+     * reading request parameters or reading input using getReader().
      *
      * @param charset String containing the name of the character encoding.
      */
+    @Override
     public void setCharacterEncoding(String charset) {
 
-        if (isCommitted())
-            return;
-
         // Ignore any call from an included servlet
-        if (included)
-            return;
-
         // Ignore any call made after the getWriter has been invoked
         // The default should be used
-        if (usingWriter)
+        if (isCommitted() || included || usingWriter) {
             return;
+        }
 
-        coyoteResponse.setCharacterEncoding(charset);
+        grizzlyResponse.setCharacterEncoding(charset);
         isCharacterEncodingSet = true;
     }
 
-
     /**
      * Return the servlet output stream associated with this Response.
      *
-     * @exception IllegalStateException if <code>getWriter</code> has
-     *  already been called for this response
+     * @exception IllegalStateException if <code>getWriter</code> has already been called for this response
      * @exception IOException if an input/output error occurs
      */
-    public ServletOutputStream getOutputStream()
-        throws IOException {
-
-        if (usingWriter)
-            throw new IllegalStateException
-                (rb.getString(LogFacade.GET_WRITER_BEEN_CALLED_EXCEPTION));
+    @Override
+    public ServletOutputStream getOutputStream() throws IOException {
+        if (usingWriter) {
+            throw new IllegalStateException(rb.getString(GET_WRITER_BEEN_CALLED_EXCEPTION));
+        }
 
         usingOutputStream = true;
         if (outputStream == null) {
             outputStream = new CoyoteOutputStream(outputBuffer);
         }
+
         return outputStream;
-
     }
 
-
     /**
      * Return the Locale assigned to this response.
      */
+    @Override
     public Locale getLocale() {
-        return coyoteResponse.getLocale();
+        return grizzlyResponse.getLocale();
     }
 
-
     /**
      * Return the writer associated with this Response.
      *
-     * @exception IllegalStateException if <code>getOutputStream</code> has
-     *  already been called for this response
+     * @exception IllegalStateException if <code>getOutputStream</code> has already been called for this response
      * @exception IOException if an input/output error occurs
      */
-    public PrintWriter getWriter()
-        throws IOException {
-
-        if (usingOutputStream)
+    @Override
+    public PrintWriter getWriter() throws IOException {
+        if (usingOutputStream) {
             throw new IllegalStateException(rb.getString(LogFacade.GET_OUTPUT_STREAM_BEEN_CALLED_EXCEPTION));
+        }
 
         /*
-         * If the response's character encoding has not been specified as
-         * described in <code>getCharacterEncoding</code> (i.e., the method
-         * just returns the default value <code>ISO-8859-1</code>),
-         * <code>getWriter</code> updates it to <code>ISO-8859-1</code>
-         * (with the effect that a subsequent call to getContentType() will
-         * include a charset=ISO-8859-1 component which will also be
-         * reflected in the Content-Type response header, thereby satisfying
-         * the Servlet spec requirement that containers must communicate the
-         * character encoding used for the servlet response's writer to the
+         * If the response's character encoding has not been specified as described in <code>getCharacterEncoding</code> (i.e.,
+         * the method just returns the default value <code>ISO-8859-1</code>), <code>getWriter</code> updates it to
+         * <code>ISO-8859-1</code> (with the effect that a subsequent call to getContentType() will include a charset=ISO-8859-1
+         * component which will also be reflected in the Content-Type response header, thereby satisfying the Servlet spec
+         * requirement that containers must communicate the character encoding used for the servlet response's writer to the
          * client).
          */
         setCharacterEncoding(getCharacterEncoding());
@@ -713,144 +655,125 @@
         if (writer == null) {
             writer = createWriter(outputBuffer);
         }
+
         return writer;
-
     }
 
-
     /**
      * Has the output of this response already been committed?
      */
+    @Override
     public boolean isCommitted() {
-        return coyoteResponse.isCommitted();
+        return grizzlyResponse.isCommitted();
     }
 
-
     /**
      * Clear any content written to the buffer.
      *
-     * @exception IllegalStateException if this response has already
-     *  been committed
+     * @exception IllegalStateException if this response has already been committed
      */
+    @Override
     public void reset() {
+        if (included) {
+            return; // Ignore any call from an included servlet
+        }
 
-        if (included)
-            return;     // Ignore any call from an included servlet
-
-        coyoteResponse.reset();
+        grizzlyResponse.reset();
         outputBuffer.reset();
+
         // reset Grizzly duplicated internal attributes
-        coyoteResponse.resetBuffer(true);
+        grizzlyResponse.resetBuffer(true);
         usingOutputStream = false;
         usingWriter = false;
         isCharacterEncodingSet = false;
     }
 
-
     /**
      * Reset the data buffer but not any status or header information.
      *
-     * @exception IllegalStateException if the response has already
-     *  been committed
+     * @exception IllegalStateException if the response has already been committed
      */
+    @Override
     public void resetBuffer() {
         resetBuffer(false);
     }
 
-
     /**
-     * Reset the data buffer and the using Writer/Stream flags but not any
-     * status or header information.
+     * Reset the data buffer and the using Writer/Stream flags but not any status or header information.
      *
-     * @param resetWriterStreamFlags <code>true</code> if the internal
-     *        <code>usingWriter</code>, <code>usingOutputStream</code>,
-     *        <code>isCharacterEncodingSet</code> flags should also be reset
+     * @param resetWriterStreamFlags <code>true</code> if the internal <code>usingWriter</code>,
+     * <code>usingOutputStream</code>, <code>isCharacterEncodingSet</code> flags should also be reset
      *
-     * @exception IllegalStateException if the response has already
-     *  been committed
+     * @exception IllegalStateException if the response has already been committed
      */
+    @Override
     public void resetBuffer(boolean resetWriterStreamFlags) {
-
-        if (isCommitted())
-            throw new IllegalStateException(rb.getString(LogFacade.CANNOT_RESET_BUFFER_EXCEPTION));
+        if (isCommitted()) {
+            throw new IllegalStateException(rb.getString(CANNOT_RESET_BUFFER_EXCEPTION));
+        }
 
         outputBuffer.reset();
 
-        if(resetWriterStreamFlags) {
+        if (resetWriterStreamFlags) {
             usingOutputStream = false;
             usingWriter = false;
             isCharacterEncodingSet = false;
         }
-
     }
 
-
     /**
      * Set the buffer size to be used for this Response.
      *
      * @param size The new buffer size
      *
-     * @exception IllegalStateException if this method is called after
-     *  output has been committed for this response
+     * @exception IllegalStateException if this method is called after output has been committed for this response
      */
+    @Override
     public void setBufferSize(int size) {
-
-        if (isCommitted() || !outputBuffer.isNew())
-            throw new IllegalStateException(rb.getString(LogFacade.CANNOT_CHANGE_BUFFER_SIZE_EXCEPTION));
+        if (isCommitted() || !outputBuffer.isNew()) {
+            throw new IllegalStateException(rb.getString(CANNOT_CHANGE_BUFFER_SIZE_EXCEPTION));
+        }
 
         outputBuffer.setBufferSize(size);
-
     }
 
-
     /**
      * Set the content length (in bytes) for this Response.
      *
      * @param length The new content length
      */
+    @Override
     public void setContentLength(int length) {
-
         setContentLengthLong(length);
-
     }
 
-
     /**
-     * Sets the length of the content body in the response In HTTP servlets,
-     * this method sets the HTTP Content-Length header.
+     * Sets the length of the content body in the response In HTTP servlets, this method sets the HTTP Content-Length
+     * header.
      *
      * @param length The new content length
      */
+    @Override
     public void setContentLengthLong(long length) {
-
-        if (isCommitted())
-            return;
-
         // Ignore any call from an included servlet
-        if (included)
+        if (isCommitted() || included || usingWriter) {
             return;
+        }
 
-        if (usingWriter)
-            return;
-
-        coyoteResponse.setContentLengthLong(length);
-
+        grizzlyResponse.setContentLengthLong(length);
     }
 
-
     /**
      * Set the content type for this Response.
      *
      * @param type The new content type
      */
+    @Override
     public void setContentType(String type) {
-
-        if (isCommitted())
-            return;
-
         // Ignore any call from an included servlet
-        if (included)
+        if (isCommitted() || included) {
             return;
+        }
 
         // Ignore charset if getWriter() has already been called
         if (usingWriter) {
@@ -862,7 +785,7 @@
             }
         }
 
-        coyoteResponse.setContentType(type);
+        grizzlyResponse.setContentType(type);
 
         // Check to see if content type contains charset
         if (type != null) {
@@ -873,205 +796,161 @@
                 while (index < len && Character.isWhitespace(type.charAt(index))) {
                     index++;
                 }
-                if (index+7 < len
-                        && type.charAt(index) == 'c'
-                        && type.charAt(index+1) == 'h'
-                        && type.charAt(index+2) == 'a'
-                        && type.charAt(index+3) == 'r'
-                        && type.charAt(index+4) == 's'
-                        && type.charAt(index+5) == 'e'
-                        && type.charAt(index+6) == 't'
-                        && type.charAt(index+7) == '=') {
+                if (index + 7 < len &&
+                    type.charAt(index)     == 'c' &&
+                    type.charAt(index + 1) == 'h' &&
+                    type.charAt(index + 2) == 'a' &&
+                    type.charAt(index + 3) == 'r' &&
+                    type.charAt(index + 4) == 's' &&
+                    type.charAt(index + 5) == 'e' &&
+                    type.charAt(index + 6) == 't' &&
+                    type.charAt(index + 7) == '=') {
                     isCharacterEncodingSet = true;
                 }
             }
         }
-
-        isContentTypeSet = true;
     }
 
-
     /**
-     * Set the Locale that is appropriate for this response, including
-     * setting the appropriate character encoding.
+     * Set the Locale that is appropriate for this response, including setting the appropriate character encoding.
      *
      * @param locale The new locale
      */
+    @Override
     public void setLocale(Locale locale) {
-
-        if (isCommitted())
-            return;
-
         // Ignore any call from an included servlet
-        if (included)
+        if (isCommitted() || included) {
             return;
+        }
 
-        coyoteResponse.setLocale(locale);
+        grizzlyResponse.setLocale(locale);
 
         // Ignore any call made after the getWriter has been invoked.
         // The default should be used
-        if (usingWriter)
+        if (usingWriter) {
             return;
+        }
 
         if (isCharacterEncodingSet) {
             return;
         }
 
-        CharsetMapper cm = getContext().getCharsetMapper();
-        String charset = cm.getCharset( locale );
-        if ( charset != null ){
-            coyoteResponse.setCharacterEncoding(charset);
+        String charset = getContext().getCharsetMapper().getCharset(locale);
+        if (charset != null) {
+            grizzlyResponse.setCharacterEncoding(charset);
         }
-
     }
 
-
     // --------------------------------------------------- HttpResponse Methods
 
-
     /**
-     * Return the value for the specified header, or <code>null</code> if this
-     * header has not been set.  If more than one value was added for this
-     * name, only the first is returned; use {@link #getHeaders(String)} to
-     * retrieve all of them.
+     * Return the value for the specified header, or <code>null</code> if this header has not been set. If more than one
+     * value was added for this name, only the first is returned; use {@link #getHeaders(String)} to retrieve all of them.
      *
      * @param name Header name to look up
      */
+    @Override
     public String getHeader(String name) {
-        return coyoteResponse.getHeader(name);
+        return grizzlyResponse.getHeader(name);
     }
 
-
     /**
-     * @return a (possibly empty) <code>Collection</code> of the names
-     * of the headers of this response
+     * @return a (possibly empty) <code>Collection</code> of the names of the headers of this response
      */
+    @Override
     public Collection<String> getHeaderNames() {
-        final Collection<String> result = new ArrayList<String>();
-        for (final String headerName : coyoteResponse.getResponse().getHeaders().names()) {
-            result.add(headerName);
+        final Collection<String> headerNames = new ArrayList<>();
+        for (String headerName : grizzlyResponse.getResponse().getHeaders().names()) {
+            headerNames.add(headerName);
         }
 
-        return result;
+        return headerNames;
     }
 
-
     /**
      * @param name the name of the response header whose values to return
      *
-     * @return a (possibly empty) <code>Collection</code> of the values
-     * of the response header with the given name
+     * @return a (possibly empty) <code>Collection</code> of the values of the response header with the given name
      */
+    @Override
     public Collection<String> getHeaders(String name) {
-        final Collection<String> result = new ArrayList<String>();
-        for (final String headerValue : coyoteResponse.getResponse().getHeaders().values(name)) {
-            result.add(headerValue);
+        final Collection<String> headers = new ArrayList<>();
+        for (String headerValue : grizzlyResponse.getResponse().getHeaders().values(name)) {
+            headers.add(headerValue);
         }
 
-        return result;
+        return headers;
     }
 
-
     /**
-     * Return the error message that was set with <code>sendError()</code>
-     * for this Response.
+     * Return the error message that was set with <code>sendError()</code> for this Response.
      */
+    @Override
     public String getMessage() {
-        return coyoteResponse.getMessage();
+        return grizzlyResponse.getMessage();
     }
 
-
     /**
      * Return the HTTP status code associated with this Response.
      */
+    @Override
     public int getStatus() {
-        return coyoteResponse.getStatus();
+        return grizzlyResponse.getStatus();
     }
 
-
     /**
-     * Reset this response, and specify the values for the HTTP status code
-     * and corresponding message.
+     * Reset this response, and specify the values for the HTTP status code and corresponding message.
      *
-     * @exception IllegalStateException if this response has already been
-     *  committed
+     * @exception IllegalStateException if this response has already been committed
      */
+    @Override
     public void reset(int status, String message) {
         reset();
         setStatus(status, message);
     }
 
-
     // -------------------------------------------- HttpServletResponse Methods
 
-
     /**
-     * Add the specified Cookie to those that will be included with
-     * this Response.
+     * Add the specified Cookie to those that will be included with this Response.
      *
      * @param cookie Cookie to be added
      */
+    @Override
     public void addCookie(final Cookie cookie) {
-
-        if (isCommitted())
-            return;
-
         // Ignore any call from an included servlet
-        if (included)
+        if (isCommitted() || included) {
             return;
-
-        /* GlassFish 898
-        final StringBuilder sb = new StringBuilder();
-        if (SecurityUtil.isPackageProtectionEnabled()) {
-            AccessController.doPrivileged(new PrivilegedAction<Void>() {
-                public Void run(){
-                    ServerCookie.appendCookieValue
-                        (sb, cookie.getVersion(), cookie.getName(),
-                         cookie.getValue(), cookie.getPath(),
-                         cookie.getDomain(), cookie.getComment(),
-                         cookie.getMaxAge(), cookie.getSecure());
-                    return null;
-                }
-            });
-        } else {
-            ServerCookie.appendCookieValue
-                (sb, cookie.getVersion(), cookie.getName(), cookie.getValue(),
-                     cookie.getPath(), cookie.getDomain(), cookie.getComment(),
-                     cookie.getMaxAge(), cookie.getSecure());
         }
-        */
-        // START GlassFish 898
-        String cookieValue = getCookieString(cookie);
-        // END GlassFish 898
 
-        // the header name is Set-Cookie for both "old" and v.1 ( RFC2109 )
+        String cookieValue = getCookieString(cookie);
+
+        // The header name is Set-Cookie for both "old" and v.1 (RFC2109)
         // RFC2965 is not supported by browsers and the Servlet spec
-        // asks for 2109.
-        /* GlassFish 898
-        addHeader("Set-Cookie", sb.toString());
-        */
-        // START GlassFish 898
+        // asks for RFC6265 (which obsoletes both RFC2965 and RFC2109)
         addHeader("Set-Cookie", cookieValue);
-        // END GlassFish 898
     }
 
     /**
-     * Special method for adding a session cookie as we should be overriding
-     * any previous
+     * Special method for adding a session cookie as we should be overriding any previous
+     *
      * @param cookie
      */
+    @Override
     public void addSessionCookieInternal(final Cookie cookie) {
-        if (isCommitted())
+        if (isCommitted()) {
             return;
+        }
 
         String name = cookie.getName();
         final String headername = "Set-Cookie";
         final String startsWith = name + "=";
         final String cookieString = getCookieString(cookie);
         boolean set = false;
-        MimeHeaders headers = coyoteResponse.getResponse().getHeaders();
-        int n = headers.size();
-        for (int i = 0; i < n; i++) {
+
+        MimeHeaders headers = grizzlyResponse.getResponse().getHeaders();
+        int headersSize = headers.size();
+        for (int i = 0; i < headersSize; i++) {
             if (headers.getName(i).toString().equals(headername)) {
                 if (headers.getValue(i).toString().startsWith(startsWith)) {
                     headers.getValue(i).setString(cookieString);
@@ -1079,11 +958,10 @@
                 }
             }
         }
+
         if (!set) {
             addHeader(headername, cookieString);
         }
-
-
     }
 
     /**
@@ -1092,246 +970,173 @@
      * @param name Name of the header to set
      * @param value Date value to be set
      */
+    @Override
     public void addDateHeader(String name, long value) {
-
-        if (name == null || name.length() == 0) {
-            return;
-        }
-
-        if (isCommitted())
-            return;
-
         // Ignore any call from an included servlet
-        if (included) {
+        if (name == null || name.length() == 0 || isCommitted() || included) {
             return;
         }
 
         if (format == null) {
-            format = new SimpleDateFormat(HTTP_RESPONSE_DATE_HEADER,
-                                          Locale.US);
+            format = new SimpleDateFormat(HTTP_RESPONSE_DATE_HEADER, Locale.US);
             format.setTimeZone(TimeZone.getTimeZone("GMT"));
         }
 
         addHeader(name, FastHttpDateFormat.formatDate(value, format));
-
     }
 
-
     /**
      * Add the specified header to the specified value.
      *
      * @param name Name of the header to set
      * @param value Value to be set
      */
+    @Override
     public void addHeader(String name, String value) {
-
-        if (name == null || name.length() == 0 || value == null) {
+        // Ignore any call from an included servlet
+        if (name == null || name.length() == 0 || value == null || isCommitted() || included) {
             return;
         }
 
-        if (isCommitted())
-            return;
-
-        // Ignore any call from an included servlet
-        if (included)
-            return;
-
-        coyoteResponse.addHeader(name, value);
-
+        grizzlyResponse.addHeader(name, value);
     }
 
-
     /**
      * Add the specified integer header to the specified value.
      *
      * @param name Name of the header to set
      * @param value Integer value to be set
      */
+    @Override
     public void addIntHeader(String name, int value) {
-
-        if (name == null || name.length() == 0) {
+        // Ignore any call from an included servlet
+        if (name == null || name.length() == 0 || isCommitted() || included) {
             return;
         }
 
-        if (isCommitted())
-            return;
-
-        // Ignore any call from an included servlet
-        if (included)
-            return;
-
         addHeader(name, "" + value);
-
     }
 
-
     /**
      * Has the specified header been set already in this response?
      *
      * @param name Name of the header to check
      */
+    @Override
     public boolean containsHeader(String name) {
-        return coyoteResponse.containsHeader(name);
+        return grizzlyResponse.containsHeader(name);
     }
 
-
     @Override
     public Supplier<Map<String, String>> getTrailerFields() {
-        return coyoteResponse.getTrailers();
+        return grizzlyResponse.getTrailers();
     }
 
-
     @Override
     public void setTrailerFields(Supplier<Map<String, String>> supplier) {
-        coyoteResponse.setTrailers(supplier);
+        grizzlyResponse.setTrailers(supplier);
     }
 
-
     /**
-     * Encode the session identifier associated with this response
-     * into the specified redirect URL, if necessary.
+     * Encode the session identifier associated with this response into the specified redirect URL, if necessary.
      *
      * @param url URL to be encoded
      */
+    @Override
     public String encodeRedirectURL(String url) {
-        if (isEncodeable(toAbsolute(url))) {
-            String sessionVersion = null;
-            Map<String, String> sessionVersions =
-                request.getSessionVersionsRequestAttribute();
-            if (sessionVersions != null) {
-                sessionVersion = RequestUtil.createSessionVersionString(
-                    sessionVersions);
-            }
-            return toEncoded(url,
-                              request.getSessionInternal().getIdInternal(),
-                              sessionVersion);
-        } else {
+        if (!isEncodeable(toAbsolute(url))) {
             return url;
         }
+
+        String sessionVersion = null;
+        Map<String, String> sessionVersions = connectorRequest.getSessionVersionsRequestAttribute();
+        if (sessionVersions != null) {
+            sessionVersion = RequestUtil.createSessionVersionString(sessionVersions);
+        }
+
+        return toEncoded(url, connectorRequest.getSessionInternal().getIdInternal(), sessionVersion);
     }
 
-
     /**
-     * Encode the session identifier associated with this response
-     * into the specified redirect URL, if necessary.
-     *
-     * @param url URL to be encoded
-     *
-     * @deprecated As of Version 2.1 of the Java Servlet API, use
-     *  <code>encodeRedirectURL()</code> instead.
-     */
-    public String encodeRedirectUrl(String url) {
-        return encodeRedirectURL(url);
-    }
-
-
-    /**
-     * Encode the session identifier associated with this response
-     * into the specified URL, if necessary.
+     * Encode the session identifier associated with this response into the specified URL, if necessary.
      *
      * @param url URL to be encoded
      */
+    @Override
     public String encodeURL(String url) {
         String absolute = toAbsolute(url);
-        if (isEncodeable(absolute)) {
-            // W3c spec clearly said
-            if (url.equalsIgnoreCase("")){
-                url = absolute;
-            } else if (url.equals(absolute) && !hasPath(url)) {
-                url += '/';
-            }
-            String sessionVersion = null;
-            Map<String, String> sessionVersions =
-                request.getSessionVersionsRequestAttribute();
-            if (sessionVersions != null) {
-                sessionVersion = RequestUtil.createSessionVersionString(
-                    sessionVersions);
-            }
-            return toEncoded(url,
-                              request.getSessionInternal().getIdInternal(),
-                              sessionVersion);
-        } else {
+        if (!isEncodeable(absolute)) {
             return url;
         }
+
+        // W3c spec clearly said
+        if (url.equalsIgnoreCase("")) {
+            url = absolute;
+        } else if (url.equals(absolute) && !hasPath(url)) {
+            url += '/';
+        }
+
+        String sessionVersion = null;
+        Map<String, String> sessionVersions = connectorRequest.getSessionVersionsRequestAttribute();
+        if (sessionVersions != null) {
+            sessionVersion = RequestUtil.createSessionVersionString(sessionVersions);
+        }
+
+        return toEncoded(url, connectorRequest.getSessionInternal().getIdInternal(), sessionVersion);
     }
 
-
     /**
-     * Encode the session identifier associated with this response
-     * into the specified URL, if necessary.
-     *
-     * @param url URL to be encoded
-     *
-     * @deprecated As of Version 2.1 of the Java Servlet API, use
-     *  <code>encodeURL()</code> instead.
-     */
-    public String encodeUrl(String url) {
-        return encodeURL(url);
-    }
-
-
-    /**
-     * Apply URL Encoding to the given URL without adding session identifier
-     * et al associated to this response.
+     * Apply URL Encoding to the given URL without adding session identifier et al associated to this response.
      *
      * @param url URL to be encoded
      */
+    @Override
     public String encode(String url) {
         return urlEncoder.encodeURL(url);
     }
 
-
     /**
      * Send an acknowledgment of a request.
      *
      * @exception IOException if an input/output error occurs
      */
-    public void sendAcknowledgement()
-        throws IOException {
-
-        if (isCommitted())
-            return;
-
+    @Override
+    public void sendAcknowledgement() throws IOException {
         // Ignore any call from an included servlet
-        if (included)
+        if (isCommitted() || included) {
             return;
+        }
 
-        coyoteResponse.sendAcknowledgement();
-
+        grizzlyResponse.sendAcknowledgement();
     }
 
-
     /**
-     * Send an error response with the specified status and a
-     * default message.
+     * Send an error response with the specified status and a default message.
      *
      * @param status HTTP status code to send
      *
-     * @exception IllegalStateException if this response has
-     *  already been committed
+     * @exception IllegalStateException if this response has already been committed
      * @exception IOException if an input/output error occurs
      */
-    public void sendError(int status)
-        throws IOException {
+    @Override
+    public void sendError(int status) throws IOException {
         sendError(status, null);
     }
 
-
     /**
      * Send an error response with the specified status and message.
      *
      * @param status HTTP status code to send
      * @param message Corresponding message to send
      *
-     * @exception IllegalStateException if this response has
-     *  already been committed
+     * @exception IllegalStateException if this response has already been committed
      * @exception IOException if an input/output error occurs
      */
-    public void sendError(int status, String message)
-        throws IOException {
-
-        if (isCommitted())
-            throw new IllegalStateException(rb.getString(LogFacade.CANNOT_CALL_SEND_ERROR_EXCEPTION));
+    @Override
+    public void sendError(int status, String message) throws IOException {
+        if (isCommitted()) {
+            throw new IllegalStateException(rb.getString(CANNOT_CALL_SEND_ERROR_EXCEPTION));
+        }
 
         // Ignore any call from an included servlet
         if (included) {
@@ -1340,71 +1145,63 @@
 
         setError();
 
-        coyoteResponse.setStatus(status);
-        // use encoding in GlassFish
-        coyoteResponse.getResponse().setHtmlEncodingCustomReasonPhrase(false);
-        coyoteResponse.setDetailMessage(HtmlEntityEncoder.encodeXSS(message));
+        grizzlyResponse.setStatus(status);
+
+        // Use encoding in GlassFish
+        grizzlyResponse.getResponse().setHtmlEncodingCustomReasonPhrase(false);
+        grizzlyResponse.setDetailMessage(encodeXSS(message));
 
         // Clear any data content that has been buffered
         resetBuffer();
 
         // Cause the response to be finished (from the application perspective)
         setSuspended(true);
-
     }
 
-
     /**
      * Sends a temporary redirect to the specified redirect location URL.
      *
      * @param location Location URL to redirect to
      *
-     * @throws IllegalStateException if this response has
-     *  already been committed
+     * @throws IllegalStateException if this response has already been committed
      * @throws IOException if an input/output error occurs
      */
+    @Override
     public void sendRedirect(String location) throws IOException {
         sendRedirect(location, true);
     }
 
-
     /**
-     * Sends a temporary or permanent redirect to the specified redirect
-     * location URL.
+     * Sends a temporary or permanent redirect to the specified redirect location URL.
      *
      * @param location Location URL to redirect to
-     * @param isTemporary true if the redirect is supposed to be temporary,
-     * false if permanent
+     * @param isTemporary true if the redirect is supposed to be temporary, false if permanent
      *
-     * @throws IllegalStateException if this response has
-     *  already been committed
+     * @throws IllegalStateException if this response has already been committed
      * @throws IOException if an input/output error occurs
      */
-    public void sendRedirect(String location, boolean isTemporary)
-            throws IOException {
-
-        if (isCommitted())
-            throw new IllegalStateException(rb.getString(LogFacade.CANNOT_CALL_SEND_REDIRECT_EXCEPTION));
+    public void sendRedirect(String location, boolean isTemporary) throws IOException {
+        if (isCommitted()) {
+            throw new IllegalStateException(rb.getString(CANNOT_CALL_SEND_REDIRECT_EXCEPTION));
+        }
 
         // Ignore any call from an included servlet
-        if (included)
+        if (included) {
             return;
+        }
 
         // Clear any data content that has been buffered
         resetBuffer();
 
         // Generate a temporary redirect to the specified location
         try {
-            /* RIMOD 4642650
-            String absolute = toAbsolute(location);
-            */
-            // START RIMOD 4642650
             String absolute;
-            if (getContext().getAllowRelativeRedirect())
+            if (getContext().getAllowRelativeRedirect()) {
                 absolute = location;
-            else
+            } else {
                 absolute = toAbsolute(location);
-            // END RIMOD 4642650
+            }
+
             if (isTemporary) {
                 setStatus(SC_MOVED_TEMPORARILY);
             } else {
@@ -1418,7 +1215,7 @@
             setContentType("text/html");
             setLocale(Locale.getDefault());
 
-            String href = HtmlEntityEncoder.encodeXSS(absolute);
+            String href = encodeXSS(absolute);
             StringBuilder sb = new StringBuilder(150 + href.length());
 
             sb.append("<html>\r\n");
@@ -1446,113 +1243,90 @@
 
         // Cause the response to be finished (from the application perspective)
         setSuspended(true);
-
     }
 
-
     /**
      * Set the specified date header to the specified value.
      *
      * @param name Name of the header to set
      * @param value Date value to be set
      */
+    @Override
     public void setDateHeader(String name, long value) {
-
-        if (name == null || name.length() == 0) {
-            return;
-        }
-
-        if (isCommitted())
-            return;
-
         // Ignore any call from an included servlet
-        if (included) {
+        if (name == null || name.length() == 0 || isCommitted() || included) {
             return;
         }
 
         if (format == null) {
-            format = new SimpleDateFormat(HTTP_RESPONSE_DATE_HEADER,
-                                          Locale.US);
+            format = new SimpleDateFormat(HTTP_RESPONSE_DATE_HEADER, Locale.US);
             format.setTimeZone(TimeZone.getTimeZone("GMT"));
         }
 
         setHeader(name, FastHttpDateFormat.formatDate(value, format));
-
     }
 
-
     /**
      * Set the specified header to the specified value.
      *
      * @param name Name of the header to set
      * @param value Value to be set
      */
+    @Override
     public void setHeader(String name, String value) {
-
-        if (name == null || name.length() == 0 || value == null) {
+        if (name == null || name.length() == 0 || value == null || isCommitted()) {
             return;
         }
 
-        if (isCommitted())
-            return;
-
         // Ignore any call from an included servlet
-        if (included)
+        if (included) {
             return;
+        }
 
         try {
-            String safeName = InputValidationUtil.getSafeHeaderName(name);
-            String safeValue = InputValidationUtil.getSafeHeaderValue(value);
-            coyoteResponse.setHeader(safeName, safeValue);
+            grizzlyResponse.setHeader(
+                getSafeHeaderName(name),
+                getSafeHeaderValue(value));
         } catch (Exception e) {
             try {
-                coyoteResponse.sendError(403, "Forbidden");
+                grizzlyResponse.sendError(403, "Forbidden");
             } catch (IOException ex) {
                 // just return
             }
         }
-
     }
 
-
     /**
      * Set the specified integer header to the specified value.
      *
      * @param name Name of the header to set
      * @param value Integer value to be set
      */
+    @Override
     public void setIntHeader(String name, int value) {
-
-        if (name == null || name.length() == 0) {
+        // Ignore any call from an included servlet
+        if (name == null || name.length() == 0 || isCommitted() || included) {
             return;
         }
 
-        if (isCommitted())
-            return;
-
-        // Ignore any call from an included servlet
-        if (included)
-            return;
-
         setHeader(name, "" + value);
-
     }
 
-
     /**
      * Set the HTTP status to be returned with this response.
      *
      * @param status The new HTTP status
      */
+    @Override
     public void setStatus(int status) {
         setStatus(status, null);
     }
 
+    @Override
     public void setError(int status, String message) {
         setStatus(status, message);
     }
 
-
     /**
      * Set the HTTP status and message to be returned with this response.
      *
@@ -1561,72 +1335,59 @@
      *
      */
     private void setStatus(int status, String message) {
-        if (isCommitted())
-            return;
-
         // Ignore any call from an included servlet
-        if (included)
+        if (isCommitted() || included) {
             return;
+        }
 
-        coyoteResponse.setStatus(status);
-        // use encoding in GlassFish
-        coyoteResponse.getResponse().setHtmlEncodingCustomReasonPhrase(false);
-        coyoteResponse.setDetailMessage(HtmlEntityEncoder.encodeXSS(message));
+        grizzlyResponse.setStatus(status);
+        // Use encoding in GlassFish
+        grizzlyResponse.getResponse().setHtmlEncodingCustomReasonPhrase(false);
+        grizzlyResponse.setDetailMessage(encodeXSS(message));
     }
 
-
     // ------------------------------------------------------ Protected Methods
 
-
     /**
-     * Return <code>true</code> if the specified URL should be encoded with
-     * a session identifier.  This will be true if all of the following
-     * conditions are met:
+     * Return <code>true</code> if the specified URL should be encoded with a session identifier. This will be true if all
+     * of the following conditions are met:
      * <ul>
      * <li>The request we are responding to asked for a valid session
      * <li>The requested session ID was not received via a cookie
-     * <li>The specified URL points back to somewhere within the web
-     *     application that is responding to this request
+     * <li>The specified URL points back to somewhere within the web application that is responding to this request
      * </ul>
      *
      * @param location Absolute URL to be validated
      */
     protected boolean isEncodeable(final String location) {
-
-        if (location == null)
-            return false;
-
         // Is this an intra-document reference?
-        if (location.startsWith("#"))
+        if (location == null || location.startsWith("#")) {
             return false;
+        }
 
         // Are we in a valid session that is not using cookies?
-        final Request hreq = request;
-        final Session session = hreq.getSessionInternal(false);
+        final Session session = connectorRequest.getSessionInternal(false);
         if (session == null) {
             return false;
         }
-        if (hreq.isRequestedSessionIdFromCookie() ||
-            getContext() != null && !getContext().isEnableURLRewriting()) {
+
+        if (connectorRequest.isRequestedSessionIdFromCookie() || getContext() != null && !getContext().isEnableURLRewriting()) {
             return false;
         }
 
         if (SecurityUtil.isPackageProtectionEnabled()) {
-            return (
-                AccessController.doPrivileged(new PrivilegedAction<Boolean>() {
-
+            return (AccessController.doPrivileged(new PrivilegedAction<Boolean>() {
                 @Override
-                public Boolean run(){
-                    return Boolean.valueOf(doIsEncodeable(hreq, session, location));
+                public Boolean run() {
+                    return Boolean.valueOf(doIsEncodeable(connectorRequest, session, location));
                 }
             })).booleanValue();
         } else {
-            return doIsEncodeable(hreq, session, location);
+            return doIsEncodeable(connectorRequest, session, location);
         }
     }
 
-    private boolean doIsEncodeable(Request hreq, Session session,
-                                   String location){
+    private boolean doIsEncodeable(Request hreq, Session session, String location) {
         // Is this a valid absolute URL?
         URL url = null;
         try {
@@ -1636,26 +1397,31 @@
         }
 
         // Does this URL match down to (and including) the context path?
-        if (!hreq.getScheme().equalsIgnoreCase(url.getProtocol()))
+        if (!hreq.getScheme().equalsIgnoreCase(url.getProtocol()) || !hreq.getServerName().equalsIgnoreCase(url.getHost())) {
             return false;
-        if (!hreq.getServerName().equalsIgnoreCase(url.getHost()))
-            return false;
+        }
+
         int serverPort = hreq.getServerPort();
         if (serverPort == -1) {
-            if ("https".equals(hreq.getScheme()))
+            if ("https".equals(hreq.getScheme())) {
                 serverPort = 443;
-            else
+            } else {
                 serverPort = 80;
+            }
         }
+
         int urlPort = url.getPort();
         if (urlPort == -1) {
-            if ("https".equals(url.getProtocol()))
+            if ("https".equals(url.getProtocol())) {
                 urlPort = 443;
-            else
+            } else {
                 urlPort = 80;
+            }
         }
-        if (serverPort != urlPort)
+
+        if (serverPort != urlPort) {
             return false;
+        }
 
         Context ctx = getContext();
         if (ctx != null) {
@@ -1665,6 +1431,7 @@
                 if (file == null || !file.startsWith(contextPath)) {
                     return false;
                 }
+
                 String sessionParamName = ctx.getSessionParameterName();
                 if (file.contains(";" + sessionParamName + "=" + session.getIdInternal())) {
                     return false;
@@ -1674,82 +1441,76 @@
 
         // This URL belongs to our web application, so it is encodeable
         return true;
-
     }
 
-
     /**
-     * Convert (if necessary) and return the absolute URL that represents the
-     * resource referenced by this possibly relative URL.  If this URL is
-     * already absolute, return it unchanged.
+     * Convert (if necessary) and return the absolute URL that represents the resource referenced by this possibly relative
+     * URL. If this URL is already absolute, return it unchanged.
      *
      * @param location URL to be (possibly) converted and then returned
      *
-     * @exception IllegalArgumentException if a MalformedURLException is
-     *  thrown when converting the relative URL to an absolute one
+     * @exception IllegalArgumentException if a MalformedURLException is thrown when converting the relative URL to an
+     * absolute one
      */
     protected String toAbsolute(String location) {
-
-        if (location == null)
+        if (location == null) {
             return location;
+        }
 
         boolean leadingSlash = location.startsWith("/");
 
         if (location.startsWith("//")) {
             // Scheme relative, network-path reference in RFC 3986
-            redirectURLCC.recycle();
+            redirectURLCharChunk.recycle();
+
             // Add the scheme
             String scheme = getRedirectScheme();
             try {
-                redirectURLCC.append(scheme, 0, scheme.length());
-                redirectURLCC.append(':');
-                redirectURLCC.append(location, 0, location.length());
-                return redirectURLCC.toString();
+                redirectURLCharChunk.append(scheme, 0, scheme.length());
+                redirectURLCharChunk.append(':');
+                redirectURLCharChunk.append(location, 0, location.length());
+
+                return redirectURLCharChunk.toString();
             } catch (IOException e) {
-                IllegalArgumentException iae =
-                    new IllegalArgumentException(location);
-                iae.initCause(e);
-                throw iae;
+                throw new IllegalArgumentException(location, e);
             }
 
-        } else if (leadingSlash || (location.indexOf("://") == -1)) {
+        }
 
-            redirectURLCC.recycle();
+        if (leadingSlash || location.indexOf("://") == -1) {
+            redirectURLCharChunk.recycle();
 
             String scheme = getRedirectScheme();
-
-            String name = request.getServerName();
-            int port = request.getServerPort();
+            String name = connectorRequest.getServerName();
+            int port = connectorRequest.getServerPort();
 
             try {
-                redirectURLCC.append(scheme, 0, scheme.length());
-                redirectURLCC.append("://", 0, 3);
-                redirectURLCC.append(name, 0, name.length());
-                if (scheme.equals("http") && port != 80
-                    || scheme.equals("https") && port != 443) {
-                    redirectURLCC.append(':');
+                redirectURLCharChunk.append(scheme, 0, scheme.length());
+                redirectURLCharChunk.append("://", 0, 3);
+                redirectURLCharChunk.append(name, 0, name.length());
+                if (scheme.equals("http") && port != 80 || scheme.equals("https") && port != 443) {
+                    redirectURLCharChunk.append(':');
                     String portS = port + "";
-                    redirectURLCC.append(portS, 0, portS.length());
+                    redirectURLCharChunk.append(portS, 0, portS.length());
                 }
+
                 if (!leadingSlash) {
-                    String relativePath = request.getDecodedRequestURI();
-                    int pos = relativePath.lastIndexOf('/');
-                    relativePath = relativePath.substring(0, pos);
+                    String relativePath = connectorRequest.getDecodedRequestURI();
+                    relativePath = relativePath.substring(0, relativePath.lastIndexOf('/'));
 
                     String encodedURI = null;
                     final String frelativePath = relativePath;
 
-                     if (SecurityUtil.isPackageProtectionEnabled() ){
-                        try{
-                            encodedURI = AccessController.doPrivileged(
-                                new PrivilegedExceptionAction<String>(){
-                                    public String run() throws IOException{
-                                        return urlEncoder.encodeURL(frelativePath);
-                                    }
-                           });
-                        } catch (PrivilegedActionException pae){
-                            IllegalArgumentException iae =
-                                new IllegalArgumentException(location);
+                    if (SecurityUtil.isPackageProtectionEnabled()) {
+                        try {
+                            encodedURI = AccessController.doPrivileged(new PrivilegedExceptionAction<String>() {
+                                @Override
+                                public String run() throws IOException {
+                                    return urlEncoder.encodeURL(frelativePath);
+                                }
+                            });
+                        } catch (PrivilegedActionException pae) {
+                            IllegalArgumentException iae = new IllegalArgumentException(location);
                             iae.initCause(pae.getCause());
                             throw iae;
                         }
@@ -1757,53 +1518,39 @@
                         encodedURI = urlEncoder.encodeURL(relativePath);
                     }
 
-                    redirectURLCC.append(encodedURI, 0, encodedURI.length());
-                    redirectURLCC.append('/');
+                    redirectURLCharChunk.append(encodedURI, 0, encodedURI.length());
+                    redirectURLCharChunk.append('/');
                 }
-                redirectURLCC.append(location, 0, location.length());
-                normalize(redirectURLCC);
+                redirectURLCharChunk.append(location, 0, location.length());
+                normalize(redirectURLCharChunk);
             } catch (IOException e) {
-                IllegalArgumentException iae =
-                    new IllegalArgumentException(location);
-                iae.initCause(e);
-                throw iae;
+                throw new IllegalArgumentException(location, e);
             }
 
-            return redirectURLCC.toString();
-
-        } else {
-
-            return location;
-
+            return redirectURLCharChunk.toString();
         }
 
+        return location;
     }
 
-
     /**
      * Returns the scheme for a redirect if it is not specified.
      */
     private String getRedirectScheme() {
-        String scheme = request.getScheme();
+        String scheme = connectorRequest.getScheme();
 
-        // START S1AS 6170450
-        if (getConnector() != null
-                && getConnector().getAuthPassthroughEnabled()) {
+        if (getConnector() != null && getConnector().getAuthPassthroughEnabled()) {
             ProxyHandler proxyHandler = getConnector().getProxyHandler();
-            if (proxyHandler != null
-                    && proxyHandler.getSSLKeysize(request) > 0) {
+            if (proxyHandler != null && proxyHandler.getSSLKeysize(connectorRequest) > 0) {
                 scheme = "https";
             }
         }
-        // END S1AS 6170450
 
         return scheme;
     }
 
-
     /**
-     * Return the specified URL with the specified session identifier
-     * suitably encoded.
+     * Return the specified URL with the specified session identifier suitably encoded.
      *
      * @param url URL to be encoded with the session id
      * @param sessionId Session id to be included in the encoded URL
@@ -1812,74 +1559,69 @@
         return toEncoded(url, sessionId, null);
     }
 
-
     /**
-     * Return the specified URL with the specified session identifier
-     * suitably encoded.
+     * Return the specified URL with the specified session identifier suitably encoded.
      *
      * @param url URL to be encoded with the session id
      * @param sessionId Session id to be included in the encoded URL
      * @param sessionVersion Session version to be included in the encoded URL
      */
-    private String toEncoded(String url, String sessionId,
-                             String sessionVersion) {
-        if (url == null || sessionId == null)
+    private String toEncoded(String url, String sessionId, String sessionVersion) {
+        if (url == null || sessionId == null) {
             return url;
+        }
 
         String path = url;
         String query = "";
         String anchor = "";
+
         int question = url.indexOf('?');
         if (question >= 0) {
             path = url.substring(0, question);
             query = url.substring(question);
         }
+
         int pound = path.indexOf('#');
         if (pound >= 0) {
             anchor = path.substring(pound);
             path = path.substring(0, pound);
         }
 
-        StringBuilder sb = new StringBuilder(path);
-        if( sb.length() > 0 ) { // jsessionid can't be first.
+        StringBuilder urlBuilder = new StringBuilder(path);
+        if (urlBuilder.length() > 0) { // jsessionid can't be first.
             StandardContext ctx = (StandardContext) getContext();
-            String sessionParamName =
-                ctx != null ? ctx.getSessionParameterName() :
-                    Globals.SESSION_PARAMETER_NAME;
-            sb.append(";" + sessionParamName + "=");
-            sb.append(sessionId);
+            String sessionParamName = ctx != null ? ctx.getSessionParameterName() : SESSION_PARAMETER_NAME;
+            urlBuilder.append(";" + sessionParamName + "=");
+            urlBuilder.append(sessionId);
             if (ctx != null && ctx.getJvmRoute() != null) {
-                sb.append('.').append(ctx.getJvmRoute());
+                urlBuilder.append('.').append(ctx.getJvmRoute());
             }
 
-            // START SJSAS 6337561
-            String jrouteId = request.getHeader(Constants.PROXY_JROUTE);
+            String jrouteId = connectorRequest.getHeader(PROXY_JROUTE);
             if (jrouteId != null) {
-                sb.append(":");
-                sb.append(jrouteId);
+                urlBuilder.append(":");
+                urlBuilder.append(jrouteId);
             }
-            // END SJSAS 6337561
 
-            final Session session = request.getSessionInternal(false);
+            Session session = connectorRequest.getSessionInternal(false);
             if (session != null) {
-                String replicaLocation =
-                    (String) session.getNote(Globals.JREPLICA_SESSION_NOTE);
+                String replicaLocation = (String) session.getNote(JREPLICA_SESSION_NOTE);
                 if (replicaLocation != null) {
-                    sb.append(Globals.JREPLICA_PARAMETER);
-                    sb.append(replicaLocation);
+                    urlBuilder.append(JREPLICA_PARAMETER);
+                    urlBuilder.append(replicaLocation);
                 }
             }
 
             if (sessionVersion != null) {
-                sb.append(Globals.SESSION_VERSION_PARAMETER);
-                sb.append(sessionVersion);
+                urlBuilder.append(SESSION_VERSION_PARAMETER);
+                urlBuilder.append(sessionVersion);
             }
         }
 
-        sb.append(anchor);
-        sb.append(query);
-        return sb.toString();
+        urlBuilder.append(anchor);
+        urlBuilder.append(query);
 
+        return urlBuilder.toString();
     }
 
     /**
@@ -1889,7 +1631,6 @@
         return new CoyoteWriter(outbuf);
     }
 
-    // START GlassFish 898
     /**
      * Gets the string representation of the given cookie.
      *
@@ -1899,59 +1640,59 @@
      */
     protected String getCookieString(final Cookie cookie) {
         String cookieValue = null;
-        final StringBuilder sb = new StringBuilder();
 
-        // TODO:  default these values for now.  update later.
-        final boolean versionOneStrictCompliance = CookieUtils.COOKIE_VERSION_ONE_STRICT_COMPLIANCE;
-        final boolean alwaysAddExpires = CookieUtils.ALWAYS_ADD_EXPIRES;
-        final boolean rfc6265Support = CookieUtils.RFC_6265_SUPPORT_ENABLED;
         if (SecurityUtil.isPackageProtectionEnabled()) {
-            cookieValue = AccessController.doPrivileged(
-                new PrivilegedAction<String>() {
-                    public String run(){
-                        CookieSerializerUtils.serializeServerCookie(
-                            sb, versionOneStrictCompliance, rfc6265Support,
-                            alwaysAddExpires, cookie.getName(),
-                            cookie.getValue(), cookie.getVersion(), cookie.getPath(),
-                            cookie.getDomain(), cookie.getComment(),
-                            cookie.getMaxAge(), cookie.getSecure(),
-                            cookie.isHttpOnly());
-                        return sb.toString();
-                    }
-                });
+            cookieValue = AccessController.doPrivileged(new PrivilegedAction<String>() {
+                @Override
+                public String run() {
+                    return CookieHeaderGenerator.generateHeader(
+                            cookie.getName(),
+                            cookie.getValue(),
+                            cookie.getMaxAge(),
+                            cookie.getDomain(),
+                            cookie.getPath(),
+                            cookie.getSecure(),
+                            cookie.isHttpOnly(),
+                            cookie.getAttributes());
+                }
+            });
         } else {
-            CookieSerializerUtils.serializeServerCookie(
-                sb, versionOneStrictCompliance, rfc6265Support,
-                alwaysAddExpires, cookie.getName(),
-                cookie.getValue(), cookie.getVersion(), cookie.getPath(),
-                cookie.getDomain(), cookie.getComment(),
-                cookie.getMaxAge(), cookie.getSecure(),
-                cookie.isHttpOnly());
-            cookieValue = sb.toString();
+            cookieValue =
+                CookieHeaderGenerator.generateHeader(
+                    cookie.getName(),
+                    cookie.getValue(),
+                    cookie.getMaxAge(),
+                    cookie.getDomain(),
+                    cookie.getPath(),
+                    cookie.getSecure(),
+                    cookie.isHttpOnly(),
+                    cookie.getAttributes());
         }
 
         return cookieValue;
     }
-    // END GlassFish 898
 
-
-    // START GlassFish 896
     /**
-     * Removes any Set-Cookie response headers whose value contains the
-     * string JSESSIONID
+     * Removes any Set-Cookie response headers whose value contains the string JSESSIONID
      */
     public void removeSessionCookies() {
         String matchExpression = "^" + getContext().getSessionCookieName() + "=.*";
-        coyoteResponse.getResponse().getHeaders().removeHeaderMatches("Set-Cookie", matchExpression);
-        matchExpression = "^" +
-            org.apache.catalina.authenticator.Constants.SINGLE_SIGN_ON_COOKIE + "=.*";
-        coyoteResponse.getResponse().getHeaders().removeHeaderMatches("Set-Cookie", matchExpression);
+        grizzlyResponse.getResponse().getHeaders().removeHeaderMatches("Set-Cookie", matchExpression);
+
+        matchExpression = "^" + org.apache.catalina.authenticator.Constants.SINGLE_SIGN_ON_COOKIE + "=.*";
+        grizzlyResponse.getResponse().getHeaders().removeHeaderMatches("Set-Cookie", matchExpression);
     }
-    // END GlassFish 896
+
+    public void setUpgrade(boolean upgrade) {
+        this.upgrade = upgrade;
+    }
+
+    void disableWriteHandler() {
+        outputBuffer.disableWriteHandler();
+    }
 
     /*
-     * Removes /./ and /../ sequences from absolute URLs.
-     * Code borrowed heavily from CoyoteAdapter.normalize()
+     * Removes /./ and /../ sequences from absolute URLs. Code borrowed heavily from CoyoteAdapter.normalize()
      */
     private void normalize(CharChunk cc) {
         // Strip query string and/or fragment first as doing it this way makes
@@ -1960,10 +1701,10 @@
         if (truncate == -1) {
             truncate = cc.indexOf('#');
         }
+
         char[] truncateCC = null;
         if (truncate > -1) {
-            truncateCC = Arrays.copyOfRange(cc.getBuffer(),
-                    cc.getStart() + truncate, cc.getEnd());
+            truncateCC = Arrays.copyOfRange(cc.getBuffer(), cc.getStart() + truncate, cc.getEnd());
             cc.setEnd(cc.getStart() + truncate);
         }
 
@@ -1995,8 +1736,7 @@
             if (index < 0) {
                 break;
             }
-            copyChars(c, start + index, start + index + 2,
-                      end - start - index - 2);
+            copyChars(c, start + index, start + index + 2, end - start - index - 2);
             end = end - 2;
             cc.setEnd(end);
         }
@@ -2014,13 +1754,12 @@
                 throw new IllegalArgumentException();
             }
             int index2 = -1;
-            for (pos = start + index - 1; (pos >= 0) && (index2 < 0); pos --) {
+            for (pos = start + index - 1; (pos >= 0) && (index2 < 0); pos--) {
                 if (c[pos] == (byte) '/') {
                     index2 = pos;
                 }
             }
-            copyChars(c, start + index2, start + index + 3,
-                      end - start - index - 3);
+            copyChars(c, start + index2, start + index + 3, end - start - index - 3);
             end = end + index2 - index - 3;
             cc.setEnd(end);
             index = index2;
@@ -2062,22 +1801,13 @@
         if (connector != null && connector.getContainer() != null) {
             logger = connector.getContainer().getLogger();
         }
+
         String localName = "Response";
         if (logger != null) {
-            logger.log(localName + " " + message, t,
-                org.apache.catalina.Logger.WARNING);
+            logger.log(localName + " " + message, t, WARNING);
         } else {
             log.log(Level.WARNING, localName + " " + message, t);
         }
     }
 
-
-    public void setUpgrade(boolean upgrade) {
-        this.upgrade = upgrade;
-    }
-
-    void disableWriteHandler() {
-        outputBuffer.disableWriteHandler();
-    }
 }
-
diff --git a/appserver/web/web-core/src/main/java/org/apache/catalina/connector/ResponseFacade.java b/appserver/web/web-core/src/main/java/org/apache/catalina/connector/ResponseFacade.java
index 29001be..c18cbd6 100644
--- a/appserver/web/web-core/src/main/java/org/apache/catalina/connector/ResponseFacade.java
+++ b/appserver/web/web-core/src/main/java/org/apache/catalina/connector/ResponseFacade.java
@@ -1,4 +1,5 @@
 /*
+ * Copyright (c) 2022, 2022 Contributors to the Eclipse Foundation.
  * Copyright (c) 1997-2018 Oracle and/or its affiliates. All rights reserved.
  * Copyright 2004 The Apache Software Foundation
  *
@@ -17,47 +18,53 @@
 
 package org.apache.catalina.connector;
 
-import org.apache.catalina.LogFacade;
-import org.apache.catalina.security.SecurityUtil;
+import static org.apache.catalina.LogFacade.NULL_RESPONSE_OBJECT;
 
-import jakarta.servlet.ServletOutputStream;
-import jakarta.servlet.http.Cookie;
-import jakarta.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.io.PrintWriter;
-import java.security.*;
+import java.io.UnsupportedEncodingException;
+import java.nio.charset.UnsupportedCharsetException;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.security.PrivilegedActionException;
+import java.security.PrivilegedExceptionAction;
 import java.util.Collection;
 import java.util.Locale;
 import java.util.Map;
 import java.util.ResourceBundle;
 import java.util.function.Supplier;
 
+import org.apache.catalina.LogFacade;
+import org.apache.catalina.security.SecurityUtil;
+
+import jakarta.servlet.ServletOutputStream;
+import jakarta.servlet.http.Cookie;
+import jakarta.servlet.http.HttpServletResponse;
 
 /**
- * Facade class that wraps a Coyote response object.
- * All methods are delegated to the wrapped response.
+ * Facade class that wraps a Coyote response object. All methods are delegated to the wrapped response.
  *
  * @author Remy Maucherat
  * @author Jean-Francois Arcand
- * @version $Revision: 1.9 $ $Date: 2007/05/05 05:32:43 $
  */
-
-
-public class ResponseFacade
-    implements HttpServletResponse {
+public class ResponseFacade implements HttpServletResponse {
 
     private static final ResourceBundle rb = LogFacade.getLogger().getResourceBundle();
 
+    // ----------------------------------------------- Class/Instance Variables
 
+    /**
+     * The wrapped response.
+     */
+    protected Response response;
 
     // ----------------------------------------------------------- DoPrivileged
 
-    private final class SetContentTypePrivilegedAction
-            implements PrivilegedAction<Void> {
+    private final class SetContentTypePrivilegedAction implements PrivilegedAction<Void> {
 
         private String contentType;
 
-        public SetContentTypePrivilegedAction(String contentType){
+        public SetContentTypePrivilegedAction(String contentType) {
             this.contentType = contentType;
         }
 
@@ -68,10 +75,8 @@
         }
     }
 
-
     // ----------------------------------------------------------- Constructors
 
-
     /**
      * Construct a wrapper for the specified response.
      *
@@ -81,19 +86,8 @@
         this.response = response;
     }
 
-
-    // ----------------------------------------------- Class/Instance Variables
-
-
-    /**
-     * The wrapped response.
-     */
-    protected Response response = null;
-
-
     // --------------------------------------------------------- Public Methods
 
-
     /**
      * Prevent cloning the facade.
      */
@@ -102,7 +96,6 @@
         throw new CloneNotSupportedException();
     }
 
-
     /**
      * Clear facade.
      */
@@ -110,119 +103,90 @@
         response = null;
     }
 
-
     public void finish() {
-
-        // Disallow operation if the object has gone out of scope
-        if (response == null) {
-            throw new IllegalStateException(rb.getString(LogFacade.NULL_RESPONSE_OBJECT));
-        }
+        checkResponseNull();
 
         response.setSuspended(true);
-
     }
 
-
     public boolean isFinished() {
-
-        // Disallow operation if the object has gone out of scope
-        if (response == null) {
-            throw new IllegalStateException(rb.getString(LogFacade.NULL_RESPONSE_OBJECT));
-        }
+        checkResponseNull();
 
         return response.isSuspended();
     }
 
-
     // ------------------------------------------------ ServletResponse Methods
 
     @Override
     public String getCharacterEncoding() {
-
-        // Disallow operation if the object has gone out of scope
-        if (response == null) {
-            throw new IllegalStateException(rb.getString(LogFacade.NULL_RESPONSE_OBJECT));
-        }
+        checkResponseNull();
 
         return response.getCharacterEncoding();
     }
 
     @Override
     public ServletOutputStream getOutputStream() throws IOException {
-
-        // Disallow operation if the object has gone out of scope
-        if (response == null) {
-            throw new IllegalStateException(rb.getString(LogFacade.NULL_RESPONSE_OBJECT));
-        }
-
-        //        if (isFinished())
-        //            throw new IllegalStateException
-        //                (/*sm.getString("responseFacade.finished")*/);
+        checkResponseNull();
 
         ServletOutputStream sos = response.getOutputStream();
-        if (isFinished())
+        if (isFinished()) {
             response.setSuspended(true);
-        return (sos);
+        }
+
+        return sos;
     }
 
     @Override
     public PrintWriter getWriter() throws IOException {
+        checkResponseNull();
 
-        // Disallow operation if the object has gone out of scope
-        if (response == null) {
-            throw new IllegalStateException(rb.getString(LogFacade.NULL_RESPONSE_OBJECT));
+        try {
+            PrintWriter writer = response.getWriter();
+            if (isFinished()) {
+                response.setSuspended(true);
+            }
+
+            return writer;
+        } catch (UnsupportedCharsetException e) {
+            // Servlet 6 states we should throw an UnsupportedEncodingException, but our backend
+            // naturally throws an UnsupportedCharsetException.
+            UnsupportedEncodingException unsupportedEncodingException = new UnsupportedEncodingException();
+            unsupportedEncodingException.initCause(e);
+            throw unsupportedEncodingException;
         }
-
-        //        if (isFinished())
-        //            throw new IllegalStateException
-        //                (/*sm.getString("responseFacade.finished")*/);
-
-        PrintWriter writer = response.getWriter();
-        if (isFinished())
-            response.setSuspended(true);
-        return (writer);
     }
 
     @Override
     public void setContentLength(int len) {
+        checkResponseNull();
 
-        // Disallow operation if the object has gone out of scope
-        if (response == null) {
-            throw new IllegalStateException(rb.getString(LogFacade.NULL_RESPONSE_OBJECT));
-        }
-
-        if (isCommitted())
+        if (isCommitted()) {
             return;
+        }
 
         response.setContentLength(len);
     }
 
     @Override
     public void setContentLengthLong(long len) {
+        checkResponseNull();
 
-        // Disallow operation if the object has gone out of scope
-        if (response == null) {
-            throw new IllegalStateException(rb.getString(LogFacade.NULL_RESPONSE_OBJECT));
-        }
-
-        if (isCommitted())
+        if (isCommitted()) {
             return;
+        }
 
         response.setContentLengthLong(len);
     }
 
     @Override
     public void setContentType(String type) {
+        checkResponseNull();
 
-        // Disallow operation if the object has gone out of scope
-        if (response == null) {
-            throw new IllegalStateException(rb.getString(LogFacade.NULL_RESPONSE_OBJECT));
+        if (isCommitted()) {
+            return;
         }
 
-        if (isCommitted())
-            return;
-
-        if (SecurityUtil.isPackageProtectionEnabled()){
+        if (SecurityUtil.isPackageProtectionEnabled()) {
             AccessController.doPrivileged(new SetContentTypePrivilegedAction(type));
         } else {
             response.setContentType(type);
@@ -231,405 +195,294 @@
 
     @Override
     public void setBufferSize(int size) {
-
-        // Disallow operation if the object has gone out of scope
-        if (response == null) {
-            throw new IllegalStateException(rb.getString(LogFacade.NULL_RESPONSE_OBJECT));
-        }
-
-        if (isCommitted())
-            throw new IllegalStateException
-                (/*sm.getString("responseBase.reset.ise")*/);
+        checkResponseNull();
+        checkCommitted();
 
         response.setBufferSize(size);
     }
 
     @Override
     public int getBufferSize() {
-
-        // Disallow operation if the object has gone out of scope
-        if (response == null) {
-            throw new IllegalStateException(rb.getString(LogFacade.NULL_RESPONSE_OBJECT));
-        }
+        checkResponseNull();
 
         return response.getBufferSize();
     }
 
     @Override
     public void flushBuffer() throws IOException {
+        checkResponseNull();
 
-        // Disallow operation if the object has gone out of scope
-        if (response == null) {
-            throw new IllegalStateException(rb.getString(LogFacade.NULL_RESPONSE_OBJECT));
+        if (isFinished()) {
+            return;
         }
 
-        if (isFinished())
-            //            throw new IllegalStateException
-            //                (/*sm.getString("responseFacade.finished")*/);
-            return;
-
-        if (SecurityUtil.isPackageProtectionEnabled()){
-            try{
-                AccessController.doPrivileged(
-                        new PrivilegedExceptionAction<Void>(){
+        if (SecurityUtil.isPackageProtectionEnabled()) {
+            try {
+                AccessController.doPrivileged(new PrivilegedExceptionAction<Void>() {
 
                     @Override
-                    public Void run() throws IOException{
+                    public Void run() throws IOException {
                         response.setAppCommitted(true);
 
                         response.flushBuffer();
                         return null;
                     }
                 });
-            } catch(PrivilegedActionException e){
+            } catch (PrivilegedActionException e) {
                 Exception ex = e.getException();
-                if (ex instanceof IOException){
-                    throw (IOException)ex;
+                if (ex instanceof IOException) {
+                    throw (IOException) ex;
                 }
             }
         } else {
             response.setAppCommitted(true);
-
             response.flushBuffer();
         }
     }
 
     @Override
     public void resetBuffer() {
-
-        // Disallow operation if the object has gone out of scope
-        if (response == null) {
-            throw new IllegalStateException(rb.getString(LogFacade.NULL_RESPONSE_OBJECT));
-        }
-
-        if (isCommitted())
-            throw new IllegalStateException
-                (/*sm.getString("responseBase.reset.ise")*/);
+        checkResponseNull();
+        checkCommitted();
 
         response.resetBuffer();
     }
 
     @Override
     public boolean isCommitted() {
-
-        // Disallow operation if the object has gone out of scope
-        if (response == null) {
-            throw new IllegalStateException(rb.getString(LogFacade.NULL_RESPONSE_OBJECT));
-        }
+        checkResponseNull();
 
         return (response.isAppCommitted());
     }
 
     @Override
     public void reset() {
-
-        // Disallow operation if the object has gone out of scope
-        if (response == null) {
-            throw new IllegalStateException(rb.getString(LogFacade.NULL_RESPONSE_OBJECT));
-        }
-
-        if (isCommitted())
-            throw new IllegalStateException
-                (/*sm.getString("responseBase.reset.ise")*/);
+        checkResponseNull();
+        checkCommitted();
 
         response.reset();
     }
 
     @Override
     public void setLocale(Locale loc) {
+        checkResponseNull();
 
-        // Disallow operation if the object has gone out of scope
-        if (response == null) {
-            throw new IllegalStateException(rb.getString(LogFacade.NULL_RESPONSE_OBJECT));
-        }
-
-        if (isCommitted())
+        if (isCommitted()) {
             return;
+        }
 
         response.setLocale(loc);
     }
 
     @Override
     public Locale getLocale() {
-
-        // Disallow operation if the object has gone out of scope
-        if (response == null) {
-            throw new IllegalStateException(rb.getString(LogFacade.NULL_RESPONSE_OBJECT));
-        }
+        checkResponseNull();
 
         return response.getLocale();
     }
 
     @Override
     public void addCookie(Cookie cookie) {
+        checkResponseNull();
 
-        // Disallow operation if the object has gone out of scope
-        if (response == null) {
-            throw new IllegalStateException(rb.getString(LogFacade.NULL_RESPONSE_OBJECT));
-        }
-
-        if (isCommitted())
+        if (isCommitted()) {
             return;
+        }
 
         response.addCookie(cookie);
     }
 
     @Override
     public boolean containsHeader(String name) {
-
-        // Disallow operation if the object has gone out of scope
-        if (response == null) {
-            throw new IllegalStateException(rb.getString(LogFacade.NULL_RESPONSE_OBJECT));
-        }
+        checkResponseNull();
 
         return response.containsHeader(name);
     }
 
     @Override
     public String encodeURL(String url) {
-
-        // Disallow operation if the object has gone out of scope
-        if (response == null) {
-            throw new IllegalStateException(rb.getString(LogFacade.NULL_RESPONSE_OBJECT));
-        }
+        checkResponseNull();
 
         return response.encodeURL(url);
     }
 
     @Override
     public String encodeRedirectURL(String url) {
-
-        // Disallow operation if the object has gone out of scope
-        if (response == null) {
-            throw new IllegalStateException(rb.getString(LogFacade.NULL_RESPONSE_OBJECT));
-        }
+        checkResponseNull();
 
         return response.encodeRedirectURL(url);
     }
 
     @Override
     public void sendError(int sc, String msg) throws IOException {
-
-        // Disallow operation if the object has gone out of scope
-        if (response == null) {
-            throw new IllegalStateException(rb.getString(LogFacade.NULL_RESPONSE_OBJECT));
-        }
-
-        if (isCommitted())
-            throw new IllegalStateException
-                (/*sm.getString("responseBase.reset.ise")*/);
+        checkResponseNull();
+        checkCommitted();
 
         response.setAppCommitted(true);
-
         response.sendError(sc, msg);
     }
 
     @Override
     public void sendError(int sc) throws IOException {
-
-        // Disallow operation if the object has gone out of scope
-        if (response == null) {
-            throw new IllegalStateException(rb.getString(LogFacade.NULL_RESPONSE_OBJECT));
-        }
-
-        if (isCommitted())
-            throw new IllegalStateException
-                (/*sm.getString("responseBase.reset.ise")*/);
+        checkResponseNull();
+        checkCommitted();
 
         response.setAppCommitted(true);
-
         response.sendError(sc);
     }
 
     @Override
     public void sendRedirect(String location) throws IOException {
-
-        // Disallow operation if the object has gone out of scope
-        if (response == null) {
-            throw new IllegalStateException(rb.getString(LogFacade.NULL_RESPONSE_OBJECT));
-        }
-
-        if (isCommitted())
-            throw new IllegalStateException
-                (/*sm.getString("responseBase.reset.ise")*/);
+        checkResponseNull();
+        checkCommitted();
 
         response.setAppCommitted(true);
-
         response.sendRedirect(location);
     }
 
     @Override
     public void setDateHeader(String name, long date) {
+        checkResponseNull();
 
-        // Disallow operation if the object has gone out of scope
-        if (response == null) {
-            throw new IllegalStateException(rb.getString(LogFacade.NULL_RESPONSE_OBJECT));
-        }
-
-        if (isCommitted())
+        if (isCommitted()) {
             return;
+        }
 
         response.setDateHeader(name, date);
     }
 
     @Override
     public void addDateHeader(String name, long date) {
+        checkResponseNull();
 
-        // Disallow operation if the object has gone out of scope
-        if (response == null) {
-            throw new IllegalStateException(rb.getString(LogFacade.NULL_RESPONSE_OBJECT));
-        }
-
-        if (isCommitted())
+        if (isCommitted()) {
             return;
+        }
 
         response.addDateHeader(name, date);
     }
 
     @Override
     public void setHeader(String name, String value) {
+        checkResponseNull();
 
-        // Disallow operation if the object has gone out of scope
-        if (response == null) {
-            throw new IllegalStateException(rb.getString(LogFacade.NULL_RESPONSE_OBJECT));
-        }
-
-        if (isCommitted())
+        if (isCommitted()) {
             return;
+        }
 
         response.setHeader(name, value);
     }
 
     @Override
     public void addHeader(String name, String value) {
+        checkResponseNull();
 
-        // Disallow operation if the object has gone out of scope
-        if (response == null) {
-            throw new IllegalStateException(rb.getString(LogFacade.NULL_RESPONSE_OBJECT));
-        }
-
-        if (isCommitted())
+        if (isCommitted()) {
             return;
+        }
 
         response.addHeader(name, value);
     }
 
     @Override
     public void setIntHeader(String name, int value) {
+        checkResponseNull();
 
-        // Disallow operation if the object has gone out of scope
-        if (response == null) {
-            throw new IllegalStateException(rb.getString(LogFacade.NULL_RESPONSE_OBJECT));
-        }
-
-        if (isCommitted())
+        if (isCommitted()) {
             return;
+        }
 
         response.setIntHeader(name, value);
     }
 
     @Override
     public void addIntHeader(String name, int value) {
+        checkResponseNull();
 
-        // Disallow operation if the object has gone out of scope
-        if (response == null) {
-            throw new IllegalStateException(rb.getString(LogFacade.NULL_RESPONSE_OBJECT));
-        }
-
-        if (isCommitted())
+        if (isCommitted()) {
             return;
+        }
 
         response.addIntHeader(name, value);
     }
 
     @Override
     public void setStatus(int sc) {
+        checkResponseNull();
 
-        // Disallow operation if the object has gone out of scope
-        if (response == null) {
-            throw new IllegalStateException(rb.getString(LogFacade.NULL_RESPONSE_OBJECT));
-        }
-
-        if (isCommitted())
+        if (isCommitted()) {
             return;
+        }
 
         response.setStatus(sc);
     }
 
     @Override
     public String getContentType() {
-
-        // Disallow operation if the object has gone out of scope
-        if (response == null) {
-            throw new IllegalStateException(rb.getString(LogFacade.NULL_RESPONSE_OBJECT));
-        }
+        checkResponseNull();
 
         return response.getContentType();
     }
 
     @Override
     public void setCharacterEncoding(String arg0) {
-
-        // Disallow operation if the object has gone out of scope
-        if (response == null) {
-            throw new IllegalStateException(rb.getString(LogFacade.NULL_RESPONSE_OBJECT));
-        }
+        checkResponseNull();
 
         response.setCharacterEncoding(arg0);
     }
 
-
-    // START SJSAS 6374990
     @Override
     public int getStatus() {
-
-        // Disallow operation if the object has gone out of scope
-        if (response == null) {
-            throw new IllegalStateException(rb.getString(LogFacade.NULL_RESPONSE_OBJECT));
-        }
+        checkResponseNull();
 
         return response.getStatus();
     }
 
-    // END SJSAS 6374990
-
     @Override
     public String getHeader(String name) {
-        if (response == null) {
-            throw new IllegalStateException(rb.getString(LogFacade.NULL_RESPONSE_OBJECT));
-        }
+        checkResponseNull();
+
         return response.getHeader(name);
     }
 
     @Override
     public Collection<String> getHeaders(String name) {
-        if (response == null) {
-            throw new IllegalStateException(rb.getString(LogFacade.NULL_RESPONSE_OBJECT));
-        }
+        checkResponseNull();
+
         return response.getHeaders(name);
     }
 
     @Override
     public Collection<String> getHeaderNames() {
-        if (response == null) {
-            throw new IllegalStateException(rb.getString(LogFacade.NULL_RESPONSE_OBJECT));
-        }
+        checkResponseNull();
+
         return response.getHeaderNames();
     }
 
     @Override
     public Supplier<Map<String, String>> getTrailerFields() {
-        if (response == null) {
-            throw new IllegalStateException(rb.getString(LogFacade.NULL_RESPONSE_OBJECT));
-        }
+        checkResponseNull();
+
         return response.getTrailerFields();
     }
 
     @Override
     public void setTrailerFields(Supplier<Map<String, String>> supplier) {
-        if (response == null) {
-            throw new IllegalStateException(rb.getString(LogFacade.NULL_RESPONSE_OBJECT));
-        }
+        checkResponseNull();
+
         response.setTrailerFields(supplier);
     }
+
+    private void checkResponseNull() {
+        if (response == null) {
+            throw new IllegalStateException(rb.getString(NULL_RESPONSE_OBJECT));
+        }
+    }
+
+    private void checkCommitted() {
+        if (isCommitted()) {
+            throw new IllegalStateException();
+        }
+    }
+
 }
diff --git a/appserver/web/web-core/src/main/java/org/apache/catalina/core/ApplicationContext.java b/appserver/web/web-core/src/main/java/org/apache/catalina/core/ApplicationContext.java
index 4eb84a1..14e20c4 100644
--- a/appserver/web/web-core/src/main/java/org/apache/catalina/core/ApplicationContext.java
+++ b/appserver/web/web-core/src/main/java/org/apache/catalina/core/ApplicationContext.java
@@ -1,4 +1,5 @@
 /*
+ * Copyright (c) 2022, 2022 Contributors to the Eclipse Foundation.
  * Copyright (c) 1997-2018 Oracle and/or its affiliates. All rights reserved.
  * Copyright 2004 The Apache Software Foundation
  *
@@ -93,16 +94,6 @@
     }
 
 
-    // ----------------------------------------------------- Class Variables
-
-    // START PWC 1.2
-    /*
-    private static final SecurityPermission GET_UNWRAPPED_CONTEXT_PERMISSION =
-        new SecurityPermission("getUnwrappedContext");
-    */
-    // END PWC 1.2
-
-
     // ----------------------------------------------------- Instance Variables
 
     /**
@@ -243,7 +234,7 @@
      */
     @Override
     public Enumeration<String> getInitParameterNames() {
-        return (new Enumerator<String>(parameters.keySet()));
+        return new Enumerator<String>(parameters.keySet());
     }
 
     /**
@@ -267,7 +258,7 @@
      */
     @Override
     public int getMajorVersion() {
-        return (Constants.MAJOR_VERSION);
+        return Constants.MAJOR_VERSION;
     }
 
     /**
@@ -275,7 +266,7 @@
      */
     @Override
     public int getMinorVersion() {
-        return (Constants.MINOR_VERSION);
+        return Constants.MINOR_VERSION;
     }
 
     /**
@@ -284,10 +275,6 @@
      */
     @Override
     public int getEffectiveMajorVersion() {
-        if (isRestricted) {
-            throw new UnsupportedOperationException(
-                    rb.getString(LogFacade.UNSUPPORTED_OPERATION_EXCEPTION));
-        }
         return context.getEffectiveMajorVersion();
     }
 
@@ -297,10 +284,6 @@
      */
     @Override
     public int getEffectiveMinorVersion() {
-        if (isRestricted) {
-            throw new UnsupportedOperationException(
-                    rb.getString(LogFacade.UNSUPPORTED_OPERATION_EXCEPTION));
-        }
         return context.getEffectiveMinorVersion();
     }
 
@@ -803,10 +786,6 @@
      */
     @Override
     public Set<SessionTrackingMode> getDefaultSessionTrackingModes() {
-        if (isRestricted) {
-            throw new UnsupportedOperationException(
-                    rb.getString(LogFacade.UNSUPPORTED_OPERATION_EXCEPTION));
-        }
         return context.getDefaultSessionTrackingModes();
     }
 
@@ -819,10 +798,6 @@
      */
     @Override
     public Set<SessionTrackingMode> getEffectiveSessionTrackingModes() {
-        if (isRestricted) {
-            throw new UnsupportedOperationException(
-                    rb.getString(LogFacade.UNSUPPORTED_OPERATION_EXCEPTION));
-        }
         return context.getEffectiveSessionTrackingModes();
     }
 
@@ -885,19 +860,11 @@
      */
     @Override
     public JspConfigDescriptor getJspConfigDescriptor() {
-        if (isRestricted) {
-            throw new UnsupportedOperationException(
-                    rb.getString(LogFacade.UNSUPPORTED_OPERATION_EXCEPTION));
-        }
         return context.getJspConfigDescriptor();
     }
 
     @Override
     public ClassLoader getClassLoader() {
-        if (isRestricted) {
-            throw new UnsupportedOperationException(
-                    rb.getString(LogFacade.UNSUPPORTED_OPERATION_EXCEPTION));
-        }
         return context.getClassLoader();
     }
 
@@ -912,19 +879,11 @@
 
     @Override
     public String getVirtualServerName() {
-        if (isRestricted) {
-            throw new UnsupportedOperationException(
-                    rb.getString(LogFacade.UNSUPPORTED_OPERATION_EXCEPTION));
-        }
         return context.getVirtualServerName();
     }
 
     @Override
     public int getSessionTimeout() {
-        if (isRestricted) {
-            throw new UnsupportedOperationException(
-                    rb.getString(LogFacade.UNSUPPORTED_OPERATION_EXCEPTION));
-        }
         return context.getSessionTimeout();
     }
 
@@ -939,10 +898,6 @@
 
     @Override
     public String getRequestCharacterEncoding() {
-        if (isRestricted) {
-            throw new UnsupportedOperationException(
-                    rb.getString(LogFacade.UNSUPPORTED_OPERATION_EXCEPTION));
-        }
         return context.getRequestCharacterEncoding();
     }
 
@@ -957,10 +912,6 @@
 
     @Override
     public String getResponseCharacterEncoding() {
-        if (isRestricted) {
-            throw new UnsupportedOperationException(
-                    rb.getString(LogFacade.UNSUPPORTED_OPERATION_EXCEPTION));
-        }
         return context.getResponseCharacterEncoding();
     }
 
@@ -973,26 +924,6 @@
         context.setResponseCharacterEncoding(encoding);
     }
 
-    // START PWC 1.2
-    /**
-     * Gets the underlying StandardContext to which this ApplicationContext is
-     * delegating.
-     *
-     * @return The underlying StandardContext
-     */
-    /*
-    public StandardContext getUnwrappedContext() {
-
-        SecurityManager sm = System.getSecurityManager();
-        if (sm != null) {
-            sm.checkPermission(GET_UNWRAPPED_CONTEXT_PERMISSION);
-        }
-
-        return this.context;
-    }
-    */
-    // END PWC 1.2
-
 
     // -------------------------------------------------------- Package Methods
 
diff --git a/appserver/web/web-core/src/main/java/org/apache/catalina/core/ApplicationDispatcher.java b/appserver/web/web-core/src/main/java/org/apache/catalina/core/ApplicationDispatcher.java
index 2ab36a7..cff441a 100644
--- a/appserver/web/web-core/src/main/java/org/apache/catalina/core/ApplicationDispatcher.java
+++ b/appserver/web/web-core/src/main/java/org/apache/catalina/core/ApplicationDispatcher.java
@@ -1036,12 +1036,6 @@
             }
             //END OF github/javaee/glassfish/issues/21846
 
-            //START OF github/javaee/glassfish/issues/22079
-            if (DispatcherType.ASYNC.equals(state.dispatcherType)) {
-                this.mappingForDispatch = hcurrent.getHttpServletMapping();
-            }
-            //END OF github/javaee/glassfish/issues/22079
-
             wrapper = new ApplicationHttpRequest
                 (hcurrent, context, crossContext, mappingForDispatch, state.dispatcherType);
         } else {
diff --git a/appserver/web/web-core/src/main/java/org/apache/catalina/core/ApplicationPushBuilder.java b/appserver/web/web-core/src/main/java/org/apache/catalina/core/ApplicationPushBuilder.java
index ce8429f..b8c6d96 100644
--- a/appserver/web/web-core/src/main/java/org/apache/catalina/core/ApplicationPushBuilder.java
+++ b/appserver/web/web-core/src/main/java/org/apache/catalina/core/ApplicationPushBuilder.java
@@ -1,4 +1,5 @@
 /*
+ * Copyright (c) 2022, 2022 Contributors to the Eclipse Foundation.
  * Copyright (c) 2017-2018 Oracle and/or its affiliates. All rights reserved.
  * Copyright 2004 The Apache Software Foundation
  *
@@ -104,7 +105,7 @@
         }
         if (current instanceof Request) {
             catalinaRequest = ((Request) current);
-            coyoteRequest = catalinaRequest.getCoyoteRequest();
+            coyoteRequest = catalinaRequest.getGrizzlyRequest();
         } else {
             String msg = MessageFormat.format(
                     rb.getString(LogFacade.NO_PUSH_COYOTE_REQUEST_EXCEPTION), current.getClass().getName());
diff --git a/appserver/web/web-core/src/main/java/org/apache/catalina/core/SessionCookieConfigImpl.java b/appserver/web/web-core/src/main/java/org/apache/catalina/core/SessionCookieConfigImpl.java
index 5a6f8a9..6aa6b39 100644
--- a/appserver/web/web-core/src/main/java/org/apache/catalina/core/SessionCookieConfigImpl.java
+++ b/appserver/web/web-core/src/main/java/org/apache/catalina/core/SessionCookieConfigImpl.java
@@ -17,22 +17,31 @@
 
 package org.apache.catalina.core;
 
-import org.apache.catalina.LogFacade;
+import static java.lang.String.CASE_INSENSITIVE_ORDER;
+import static java.util.Collections.unmodifiableMap;
+import static org.apache.catalina.LogFacade.SESSION_COOKIE_CONFIG_ALREADY_INIT;
+import static org.apache.catalina.core.Constants.COOKIE_DOMAIN_ATTR;
+import static org.apache.catalina.core.Constants.COOKIE_HTTP_ONLY_ATTR;
+import static org.apache.catalina.core.Constants.COOKIE_MAX_AGE_ATTR;
+import static org.apache.catalina.core.Constants.COOKIE_PATH_ATTR;
+import static org.apache.catalina.core.Constants.COOKIE_SECURE_ATTR;
 
 import java.text.MessageFormat;
-import java.util.Collections;
 import java.util.Map;
 import java.util.ResourceBundle;
 import java.util.TreeMap;
 
+import org.apache.catalina.LogFacade;
+
 import jakarta.servlet.SessionCookieConfig;
 
 /**
- * Class that may be used to configure various properties of cookies
- * used for session tracking purposes.
+ * Class that may be used to configure various properties of cookies used for session tracking purposes.
  */
 public class SessionCookieConfigImpl implements SessionCookieConfig {
 
+    private static final ResourceBundle rb = LogFacade.getLogger().getResourceBundle();
+
     private static final int DEFAULT_MAX_AGE = -1;
     private static final boolean DEFAULT_HTTP_ONLY = false;
     private static final boolean DEFAULT_SECURE = false;
@@ -40,12 +49,9 @@
 
     private String name = DEFAULT_NAME;
 
-    private final Map<String,String> attributes = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
+    private final Map<String, String> attributes = new TreeMap<>(CASE_INSENSITIVE_ORDER);
     private final StandardContext ctx;
 
-    private static final ResourceBundle rb = LogFacade.getLogger().getResourceBundle();
-
-
     /**
      * Constructor
      */
@@ -53,215 +59,156 @@
         this.ctx = ctx;
     }
 
-
     /**
      * @param name the cookie name to use
      *
-     * @throws IllegalStateException if the <tt>ServletContext</tt>
-     * from which this <tt>SessionCookieConfig</tt> was acquired has
-     * already been initialized
+     * @throws IllegalStateException if the <tt>ServletContext</tt> from which this <tt>SessionCookieConfig</tt> was
+     * acquired has already been initialized
      */
     @Override
     public void setName(String name) {
-        if (ctx.isContextInitializedCalled()) {
-            String msg = MessageFormat.format(rb.getString(LogFacade.SESSION_COOKIE_CONFIG_ALREADY_INIT),
-                                              new Object[] {"name", ctx.getName()});
-            throw new IllegalStateException(msg);
-        }
+        checkContextInitialized("name");
 
         this.name = name;
         ctx.setSessionCookieName(name);
     }
 
-
     /**
-     * @return the cookie name set via {@link #setName}, or
-     * <tt>JSESSIONID</tt> if {@link #setName} was never called
+     * @return the cookie name set via {@link #setName}, or <tt>JSESSIONID</tt> if {@link #setName} was never called
      */
     @Override
     public String getName() {
         return name;
     }
 
-
     /**
      * @param domain the cookie domain to use
      *
-     * @throws IllegalStateException if the <tt>ServletContext</tt>
-     * from which this <tt>SessionCookieConfig</tt> was acquired has
-     * already been initialized
+     * @throws IllegalStateException if the <tt>ServletContext</tt> from which this <tt>SessionCookieConfig</tt> was
+     * acquired has already been initialized
      */
     @Override
     public void setDomain(String domain) {
-        if (ctx.isContextInitializedCalled()) {
-            String msg = MessageFormat.format(rb.getString(LogFacade.SESSION_COOKIE_CONFIG_ALREADY_INIT),
-                                              new Object[] {"dnmain", ctx.getName()});
-            throw new IllegalStateException(msg);
-        }
-        setAttribute(Constants.COOKIE_DOMAIN_ATTR, domain);
+        checkContextInitialized("domain");
+        setAttribute(COOKIE_DOMAIN_ATTR, domain);
     }
 
-
     /**
-     * @return the cookie domain set via {@link #setDomain}, or
-     * <tt>null</tt> if {@link #setDomain} was never called
+     * @return the cookie domain set via {@link #setDomain}, or <tt>null</tt> if {@link #setDomain} was never called
      */
     @Override
     public String getDomain() {
-        return getAttribute(Constants.COOKIE_DOMAIN_ATTR);
+        return getAttribute(COOKIE_DOMAIN_ATTR);
     }
 
-
     /**
      * @param path the cookie path to use
      *
-     * @throws IllegalStateException if the <tt>ServletContext</tt>
-     * from which this <tt>SessionCookieConfig</tt> was acquired has
-     * already been initialized
+     * @throws IllegalStateException if the <tt>ServletContext</tt> from which this <tt>SessionCookieConfig</tt> was
+     * acquired has already been initialized
      */
     @Override
     public void setPath(String path) {
-        if (ctx.isContextInitializedCalled()) {
-            String msg = MessageFormat.format(rb.getString(LogFacade.SESSION_COOKIE_CONFIG_ALREADY_INIT),
-                                              new Object[] {"path", ctx.getName()});
-            throw new IllegalStateException(msg);
-        }
-        setAttribute(Constants.COOKIE_PATH_ATTR, path);
+        checkContextInitialized("path");
+        setAttribute(COOKIE_PATH_ATTR, path);
     }
 
-
     /**
-     * @return the cookie path set via {@link #setPath}, or the context
-     * path of the <tt>ServletContext</tt> from which this
-     * <tt>SessionCookieConfig</tt> was acquired if {@link #setPath}
-     * was never called
+     * @return the cookie path set via {@link #setPath}, or the context path of the <tt>ServletContext</tt> from which this
+     * <tt>SessionCookieConfig</tt> was acquired if {@link #setPath} was never called
      */
     @Override
     public String getPath() {
-        return getAttribute(Constants.COOKIE_PATH_ATTR);
+        return getAttribute(COOKIE_PATH_ATTR);
     }
 
-
     /**
      * @param comment the cookie comment to use
      *
-     * @throws IllegalStateException if the <tt>ServletContext</tt>
-     * from which this <tt>SessionCookieConfig</tt> was acquired has
-     * already been initialized
+     * @throws IllegalStateException if the <tt>ServletContext</tt> from which this <tt>SessionCookieConfig</tt> was
+     * acquired has already been initialized
      */
     @Override
     public void setComment(String comment) {
-        if (ctx.isContextInitializedCalled()) {
-            String msg = MessageFormat.format(rb.getString(LogFacade.SESSION_COOKIE_CONFIG_ALREADY_INIT),
-                                              new Object[] {"comment", ctx.getName()});
-            throw new IllegalStateException(msg);
-        }
+        checkContextInitialized("comment");
         setAttribute(Constants.COOKIE_COMMENT_ATTR, comment);
     }
 
-
     /**
-     * @return the cookie comment set via {@link #setComment}, or
-     * <tt>null</tt> if {@link #setComment} was never called
+     * @return the cookie comment set via {@link #setComment}, or <tt>null</tt> if {@link #setComment} was never called
      */
     @Override
     public String getComment() {
         return getAttribute(Constants.COOKIE_COMMENT_ATTR);
     }
 
-
     /**
-     * @param httpOnly true if the session tracking cookies created
-     * on behalf of the <tt>ServletContext</tt> from which this
-     * <tt>SessionCookieConfig</tt> was acquired shall be marked as
-     * <i>HttpOnly</i>, false otherwise
+     * @param httpOnly true if the session tracking cookies created on behalf of the <tt>ServletContext</tt> from which this
+     * <tt>SessionCookieConfig</tt> was acquired shall be marked as <i>HttpOnly</i>, false otherwise
      *
-     * @throws IllegalStateException if the <tt>ServletContext</tt>
-     * from which this <tt>SessionCookieConfig</tt> was acquired has
-     * already been initialized
+     * @throws IllegalStateException if the <tt>ServletContext</tt> from which this <tt>SessionCookieConfig</tt> was
+     * acquired has already been initialized
      */
     @Override
     public void setHttpOnly(boolean httpOnly) {
-        if (ctx.isContextInitializedCalled()) {
-            String msg = MessageFormat.format(rb.getString(LogFacade.SESSION_COOKIE_CONFIG_ALREADY_INIT),
-                                              new Object[] {"httpOnly", ctx.getName()});
-            throw new IllegalStateException(msg);
-        }
-        setAttribute(Constants.COOKIE_HTTP_ONLY_ATTR, String.valueOf(httpOnly));
+        checkContextInitialized("httpOnly");
+        setAttribute(COOKIE_HTTP_ONLY_ATTR, String.valueOf(httpOnly));
     }
 
-
     /**
-     * @return true if the session tracking cookies created on behalf of the
-     * <tt>ServletContext</tt> from which this <tt>SessionCookieConfig</tt>
-     * was acquired will be marked as <i>HttpOnly</i>, false otherwise
+     * @return true if the session tracking cookies created on behalf of the <tt>ServletContext</tt> from which this
+     * <tt>SessionCookieConfig</tt> was acquired will be marked as <i>HttpOnly</i>, false otherwise
      */
     @Override
     public boolean isHttpOnly() {
-        String value = getAttribute(Constants.COOKIE_HTTP_ONLY_ATTR);
+        String value = getAttribute(COOKIE_HTTP_ONLY_ATTR);
         return value == null ? DEFAULT_HTTP_ONLY : Boolean.parseBoolean(value);
     }
 
-
     /**
-     * @param secure true if the session tracking cookies created on
-     * behalf of the <tt>ServletContext</tt> from which this
-     * <tt>SessionCookieConfig</tt> was acquired shall be marked as
-     * <i>secure</i> even if the request that initiated the corresponding
-     * session is using plain HTTP instead of HTTPS, and false if they
-     * shall be marked as <i>secure</i> only if the request that initiated
-     * the corresponding session was also secure
+     * @param secure true if the session tracking cookies created on behalf of the <tt>ServletContext</tt> from which this
+     * <tt>SessionCookieConfig</tt> was acquired shall be marked as <i>secure</i> even if the request that initiated the
+     * corresponding session is using plain HTTP instead of HTTPS, and false if they shall be marked as <i>secure</i> only
+     * if the request that initiated the corresponding session was also secure
      *
-     * @throws IllegalStateException if the <tt>ServletContext</tt>
-     * from which this <tt>SessionCookieConfig</tt> was acquired has
-     * already been initialized
+     * @throws IllegalStateException if the <tt>ServletContext</tt> from which this <tt>SessionCookieConfig</tt> was
+     * acquired has already been initialized
      */
     @Override
     public void setSecure(boolean secure) {
-        if (ctx.isContextInitializedCalled()) {
-            String msg = MessageFormat.format(rb.getString(LogFacade.SESSION_COOKIE_CONFIG_ALREADY_INIT),
-                                              new Object[] {"secure", ctx.getName()});
-            throw new IllegalStateException(msg);
-        }
-        setAttribute(Constants.COOKIE_SECURE_ATTR, String.valueOf(secure));
+        checkContextInitialized("secure");
+        setAttribute(COOKIE_SECURE_ATTR, String.valueOf(secure));
     }
 
-
     /**
-     * @return true if the session tracking cookies created on behalf of the
-     * <tt>ServletContext</tt> from which this <tt>SessionCookieConfig</tt>
-     * was acquired will be marked as <i>secure</i> even if the request
-     * that initiated the corresponding session is using plain HTTP
-     * instead of HTTPS, and false if they will be marked as <i>secure</i>
-     * only if the request that initiated the corresponding session was
-     * also secure
+     * @return true if the session tracking cookies created on behalf of the <tt>ServletContext</tt> from which this
+     * <tt>SessionCookieConfig</tt> was acquired will be marked as <i>secure</i> even if the request that initiated the
+     * corresponding session is using plain HTTP instead of HTTPS, and false if they will be marked as <i>secure</i> only if
+     * the request that initiated the corresponding session was also secure
      */
     @Override
     public boolean isSecure() {
-        String value = getAttribute(Constants.COOKIE_SECURE_ATTR);
+        String value = getAttribute(COOKIE_SECURE_ATTR);
         return value == null ? DEFAULT_SECURE : Boolean.parseBoolean(value);
     }
 
-
     @Override
     public void setMaxAge(int maxAge) {
-        if (ctx.isContextInitializedCalled()) {
-            String msg = MessageFormat.format(rb.getString(LogFacade.SESSION_COOKIE_CONFIG_ALREADY_INIT),
-                                              new Object[] {"maxAge", ctx.getName()});
-            throw new IllegalStateException(msg);
-        }
-        setAttribute(Constants.COOKIE_MAX_AGE_ATTR, String.valueOf(maxAge));
+        checkContextInitialized("maxAge");
+        setAttribute(COOKIE_MAX_AGE_ATTR, String.valueOf(maxAge));
     }
 
-
     @Override
     public int getMaxAge() {
-        String value = getAttribute(Constants.COOKIE_MAX_AGE_ATTR);
+        String value = getAttribute(COOKIE_MAX_AGE_ATTR);
         return value == null ? DEFAULT_MAX_AGE : Integer.parseInt(value);
     }
 
     @Override
     public void setAttribute(String name, String value) {
+        checkContextInitialized("attribute");
+        checkValid(name, value);
+
         this.attributes.put(name, value);
     }
 
@@ -272,6 +219,23 @@
 
     @Override
     public Map<String, String> getAttributes() {
-        return Collections.unmodifiableMap(this.attributes);
+        return unmodifiableMap(this.attributes);
+    }
+
+    private void checkContextInitialized(String parameter) {
+        if (ctx.isContextInitializedCalled()) {
+            throw new IllegalStateException(MessageFormat.format(rb.getString(SESSION_COOKIE_CONFIG_ALREADY_INIT),
+                new Object[] { parameter, ctx.getName() }));
+        }
+    }
+
+    private void checkValid(String name, String value) {
+        if (name == null) {
+            throw new IllegalArgumentException(name + " cannot be null");
+        }
+
+        if (name.equals("DEFAULT_MAX_AGE")) {
+            Integer.parseInt(value);
+        }
     }
 }
diff --git a/appserver/web/web-glue/src/main/java/com/sun/enterprise/web/VirtualServer.java b/appserver/web/web-glue/src/main/java/com/sun/enterprise/web/VirtualServer.java
index 76d61c4..1c9e96b 100644
--- a/appserver/web/web-glue/src/main/java/com/sun/enterprise/web/VirtualServer.java
+++ b/appserver/web/web-glue/src/main/java/com/sun/enterprise/web/VirtualServer.java
@@ -1,4 +1,5 @@
 /*
+ * Copyright (c) 2022, 2022 Contributors to the Eclipse Foundation.
  * Copyright (c) 1997, 2018 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
@@ -16,6 +17,123 @@
 
 package com.sun.enterprise.web;
 
+import static com.sun.enterprise.web.Constants.DEFAULT_WEB_MODULE_NAME;
+import static com.sun.enterprise.web.Constants.ERROR_REPORT_VALVE;
+import static java.util.logging.Level.FINE;
+import static java.util.logging.Level.SEVERE;
+import static java.util.logging.Level.WARNING;
+import static org.glassfish.api.web.Constants.ADMIN_VS;
+import static org.glassfish.web.LogFacade.ALLOW_ACCESS;
+import static org.glassfish.web.LogFacade.CODE_FILTERS_NULL;
+import static org.glassfish.web.LogFacade.DENY_ACCESS;
+import static org.glassfish.web.LogFacade.ENABLE_SSO;
+import static org.glassfish.web.LogFacade.IGNORE_INVALID_REALM;
+import static org.glassfish.web.LogFacade.INVALID_AUTH_REALM;
+import static org.glassfish.web.LogFacade.INVALID_LISTENER_VIRTUAL_SERVER;
+import static org.glassfish.web.LogFacade.MODIFYING_WEB_XML;
+import static org.glassfish.web.LogFacade.NOT_A_VALVE;
+import static org.glassfish.web.LogFacade.NULL_VIRTUAL_SERVER_PROPERTY;
+import static org.glassfish.web.LogFacade.REDIRECT_BOTH_URL_AND_URL_PREFIX;
+import static org.glassfish.web.LogFacade.REDIRECT_MISSING_URL_OR_URL_PREFIX;
+import static org.glassfish.web.LogFacade.REDIRECT_MULTIPLE_ELEMENT;
+import static org.glassfish.web.LogFacade.SEND_ERROR_MULTIPLE_ELEMENT;
+import static org.glassfish.web.LogFacade.SSO_MAX_INACTIVE_SET;
+import static org.glassfish.web.LogFacade.SSO_REAP_INTERVAL_SET;
+import static org.glassfish.web.LogFacade.UNABLE_RECONFIGURE_ACCESS_LOG;
+import static org.glassfish.web.LogFacade.UNABLE_TO_LOAD_EXTENSION_SEVERE;
+import static org.glassfish.web.LogFacade.VS_DEFAULT_WEB_MODULE;
+import static org.glassfish.web.LogFacade.VS_DEFAULT_WEB_MODULE_DISABLED;
+
+import java.io.File;
+import java.io.IOException;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.ResourceBundle;
+import java.util.logging.Handler;
+import java.util.logging.LogManager;
+import java.util.logging.LogRecord;
+import java.util.logging.Logger;
+
+import javax.xml.XMLConstants;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.transform.OutputKeys;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+
+import org.apache.catalina.Container;
+import org.apache.catalina.ContainerListener;
+import org.apache.catalina.LifecycleException;
+import org.apache.catalina.LifecycleListener;
+import org.apache.catalina.Pipeline;
+import org.apache.catalina.Realm;
+import org.apache.catalina.Valve;
+import org.apache.catalina.authenticator.AuthenticatorBase;
+import org.apache.catalina.authenticator.SingleSignOn;
+import org.apache.catalina.connector.Request;
+import org.apache.catalina.connector.Response;
+import org.apache.catalina.core.StandardContext;
+import org.apache.catalina.core.StandardHost;
+import org.apache.catalina.deploy.ErrorPage;
+import org.apache.catalina.valves.RemoteAddrValve;
+import org.apache.catalina.valves.RemoteHostValve;
+import org.glassfish.api.ActionReport;
+import org.glassfish.api.admin.ServerEnvironment;
+import org.glassfish.api.deployment.DeployCommandParameters;
+import org.glassfish.api.deployment.OpsParams;
+import org.glassfish.api.deployment.UndeployCommandParameters;
+import org.glassfish.api.deployment.archive.ArchiveHandler;
+import org.glassfish.api.deployment.archive.ReadableArchive;
+import org.glassfish.deployment.common.ApplicationConfigInfo;
+import org.glassfish.deployment.common.DeploymentContextImpl;
+import org.glassfish.deployment.common.DeploymentUtils;
+import org.glassfish.embeddable.GlassFishException;
+import org.glassfish.embeddable.web.ConfigException;
+import org.glassfish.embeddable.web.Context;
+import org.glassfish.embeddable.web.WebListener;
+import org.glassfish.embeddable.web.config.VirtualServerConfig;
+import org.glassfish.grizzly.Buffer;
+import org.glassfish.grizzly.Connection;
+import org.glassfish.grizzly.ConnectionProbe;
+import org.glassfish.grizzly.config.GenericGrizzlyListener;
+import org.glassfish.grizzly.config.dom.NetworkListener;
+import org.glassfish.grizzly.filterchain.FilterChainContext;
+import org.glassfish.grizzly.http.HttpCodecFilter;
+import org.glassfish.grizzly.http.HttpPacket;
+import org.glassfish.grizzly.http.HttpProbe;
+import org.glassfish.grizzly.http.HttpRequestPacket;
+import org.glassfish.grizzly.http.HttpResponsePacket;
+import org.glassfish.grizzly.http.util.HttpStatus;
+import org.glassfish.hk2.api.ServiceLocator;
+import org.glassfish.internal.api.ClassLoaderHierarchy;
+import org.glassfish.internal.api.Globals;
+import org.glassfish.internal.api.ServerContext;
+import org.glassfish.internal.data.ApplicationInfo;
+import org.glassfish.internal.data.ApplicationRegistry;
+import org.glassfish.internal.deployment.Deployment;
+import org.glassfish.internal.deployment.ExtendedDeploymentContext;
+import org.glassfish.web.LogFacade;
+import org.glassfish.web.admin.monitor.RequestProbeProvider;
+import org.glassfish.web.deployment.archivist.WebArchivist;
+import org.glassfish.web.deployment.descriptor.WebBundleDescriptorImpl;
+import org.glassfish.web.loader.WebappClassLoader;
+import org.glassfish.web.valve.GlassFishValve;
+import org.jvnet.hk2.config.Transaction;
+import org.jvnet.hk2.config.TransactionFailure;
+import org.jvnet.hk2.config.types.Property;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
 import com.sun.enterprise.config.serverbeans.ApplicationRef;
 import com.sun.enterprise.config.serverbeans.Applications;
 import com.sun.enterprise.config.serverbeans.AuthRealm;
@@ -40,109 +158,18 @@
 import com.sun.enterprise.web.session.SessionCookieConfig;
 import com.sun.web.security.RealmAdapter;
 
-import org.apache.catalina.*;
-import org.apache.catalina.authenticator.AuthenticatorBase;
-import org.apache.catalina.authenticator.SingleSignOn;
-import org.apache.catalina.core.StandardContext;
-import org.apache.catalina.core.StandardHost;
-import org.apache.catalina.connector.Response;
-import org.apache.catalina.connector.Request;
-import org.apache.catalina.deploy.ErrorPage;
-import org.apache.catalina.valves.RemoteAddrValve;
-import org.apache.catalina.valves.RemoteHostValve;
-
-import org.glassfish.api.ActionReport;
-import org.glassfish.api.admin.ServerEnvironment;
-import org.glassfish.api.deployment.DeployCommandParameters;
-import org.glassfish.api.deployment.OpsParams;
-import org.glassfish.api.deployment.UndeployCommandParameters;
-import org.glassfish.api.deployment.archive.ArchiveHandler;
-import org.glassfish.api.deployment.archive.ReadableArchive;
-import org.glassfish.deployment.common.ApplicationConfigInfo;
-import org.glassfish.deployment.common.DeploymentContextImpl;
-import org.glassfish.deployment.common.DeploymentUtils;
-import org.glassfish.embeddable.CommandRunner;
-import org.glassfish.embeddable.GlassFishException;
-import org.glassfish.embeddable.web.Context;
-import org.glassfish.embeddable.web.ConfigException;
-import org.glassfish.embeddable.web.WebListener;
-import org.glassfish.embeddable.web.config.VirtualServerConfig;
-import org.glassfish.grizzly.Buffer;
-import org.glassfish.grizzly.Connection;
-import org.glassfish.grizzly.ConnectionProbe;
-import org.glassfish.grizzly.config.GenericGrizzlyListener;
-import org.glassfish.grizzly.config.dom.NetworkListener;
-import org.glassfish.grizzly.http.ContentEncoding;
-import org.glassfish.grizzly.http.HttpContent;
-import org.glassfish.grizzly.http.HttpCodecFilter;
-import org.glassfish.grizzly.http.HttpProbe;
-import org.glassfish.grizzly.http.HttpHeader;
-import org.glassfish.grizzly.http.HttpPacket;
-import org.glassfish.grizzly.http.HttpRequestPacket;
-import org.glassfish.grizzly.http.HttpResponsePacket;
-import org.glassfish.grizzly.http.TransferEncoding;
-import org.glassfish.grizzly.http.util.HttpStatus;
-import org.glassfish.grizzly.filterchain.FilterChainContext;
-import org.glassfish.hk2.api.ServiceLocator;
-import org.glassfish.hk2.api.ServiceLocatorFactory;
-import org.glassfish.web.LogFacade;
-import org.glassfish.web.admin.monitor.RequestProbeProvider;
-import org.glassfish.web.deployment.archivist.WebArchivist;
-import org.glassfish.web.deployment.descriptor.WebBundleDescriptorImpl;
-
-import org.glassfish.internal.api.ClassLoaderHierarchy;
-import org.glassfish.internal.api.ServerContext;
-import org.glassfish.internal.api.Globals;
-import org.glassfish.internal.data.ApplicationInfo;
-import org.glassfish.internal.data.ApplicationRegistry;
-import org.glassfish.internal.deployment.Deployment;
-import org.glassfish.internal.deployment.ExtendedDeploymentContext;
-import org.glassfish.web.loader.WebappClassLoader;
-import org.glassfish.web.valve.GlassFishValve;
-
-import org.jvnet.hk2.config.Transaction;
-import org.jvnet.hk2.config.TransactionFailure;
-import org.jvnet.hk2.config.types.Property;
-
-import java.io.File;
-import java.io.IOException;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-import java.util.*;
-import java.util.logging.Handler;
-import java.util.logging.Level;
-import java.util.logging.LogManager;
-import java.util.logging.Logger;
-import java.util.logging.LogRecord;
-
 import jakarta.servlet.http.Cookie;
 import jakarta.servlet.http.HttpServletRequest;
-import javax.xml.XMLConstants;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.transform.OutputKeys;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.dom.DOMSource;
-import javax.xml.transform.stream.StreamResult;
-
-import org.w3c.dom.*;
-
 
 /**
- * Standard implementation of a virtual server (aka virtual host) in
- * the iPlanet Application Server.
+ * Standard implementation of a virtual server (aka virtual host) in the iPlanet Application Server.
  */
 
-public class VirtualServer extends StandardHost
-        implements org.glassfish.embeddable.web.VirtualServer {
+public class VirtualServer extends StandardHost implements org.glassfish.embeddable.web.VirtualServer {
 
-    private static final String STATE = "state";
-    private static final String SSO_MAX_IDLE ="sso-max-inactive-seconds";
-    private static final String SSO_REAP_INTERVAL ="sso-reap-interval-seconds";
-    private static final String SSO_COOKIE_SECURE ="sso-cookie-secure";
+    private static final String SSO_MAX_IDLE = "sso-max-inactive-seconds";
+    private static final String SSO_REAP_INTERVAL = "sso-reap-interval-seconds";
     private static final String DISABLED = "disabled";
-    private static final String OFF = "off";
     private static final String ON = "on";
 
     /**
@@ -155,12 +182,10 @@
      */
     protected static final ResourceBundle rb = DEFAULT_LOGGER.getResourceBundle();
 
-
     // ------------------------------------------------------------ Constructor
 
     /**
-     * Default constructor that simply gets a handle to the web container
-     * subsystem's logger.
+     * Default constructor that simply gets a handle to the web container subsystem's logger.
      */
     public VirtualServer() {
         origPipeline = pipeline;
@@ -172,27 +197,24 @@
     // ----------------------------------------------------- Instance Variables
 
     /*
-     * The custom pipeline of this VirtualServer, which implements the
-     * following virtual server features:
+     * The custom pipeline of this VirtualServer, which implements the following virtual server features:
      *
-     * - state (disabled/off)
-     * - redirects
+     * - state (disabled/off) - redirects
      */
     private VirtualServerPipeline vsPipeline;
 
     /*
      * The original (standard) pipeline of this VirtualServer.
      *
-     * Only one (custom or original) pipeline may be active at any given time.
-     * Any updates (such as adding or removing valves) to the currently
-     * active pipeline are propagated to the other.
+     * Only one (custom or original) pipeline may be active at any given time. Any updates (such as adding or removing
+     * valves) to the currently active pipeline are propagated to the other.
      */
     private Pipeline origPipeline;
 
     /**
      * The id of this virtual server as specified in the configuration.
      */
-    private String _id = null;
+    private String _id;
 
     /**
      * The logger to use for logging this virtual server
@@ -202,8 +224,7 @@
     /**
      * The descriptive information about this implementation.
      */
-    private static final String _info =
-        "com.sun.enterprise.web.VirtualServer/1.0";
+    private static final String _info = "com.sun.enterprise.web.VirtualServer/1.0";
 
     /**
      * The config bean associated with this VirtualServer
@@ -216,16 +237,14 @@
     private MimeMap mimeMap;
 
     /*
-     * Indicates whether symbolic links from this virtual server's docroot
-     * are followed. This setting is inherited by all web modules deployed on
-     * this virtual server, unless overridden by a web modules allowLinking
-     * property in sun-web.xml.
+     * Indicates whether symbolic links from this virtual server's docroot are followed. This setting is inherited by all
+     * web modules deployed on this virtual server, unless overridden by a web modules allowLinking property in sun-web.xml.
      */
-    private boolean allowLinking = false;
+    private boolean allowLinking;
 
     private String[] cacheControls;
 
-    private ClassLoaderHierarchy clh;
+    private ClassLoaderHierarchy classLoaderHierarchy;
 
     private Domain domain;
 
@@ -239,19 +258,17 @@
     /*
      * The accesslog valve of this VirtualServer.
      *
-     * This valve is activated, that is, added to this virtual server's
-     * pipeline, only when access logging has been enabled. When acess logging
-     * has been disabled, this valve is removed from this virtual server's
-     * pipeline.
+     * This valve is activated, that is, added to this virtual server's pipeline, only when access logging has been enabled.
+     * When acess logging has been disabled, this valve is removed from this virtual server's pipeline.
      */
     private PEAccessLogValve accessLogValve;
 
     // The value of the ssoCookieSecure property
-    private String ssoCookieSecure = null;
+    private String ssoCookieSecure;
 
-    private boolean ssoCookieHttpOnly = false;
+    private boolean ssoCookieHttpOnly;
 
-    private String defaultContextPath = null;
+    private String defaultContextPath;
 
     private ServerContext serverContext;
 
@@ -261,23 +278,28 @@
 
     private WebContainer webContainer;
 
-    private boolean ssoFailoverEnabled = false;
+    private boolean ssoFailoverEnabled;
 
-    private volatile FileLoggerHandler fileLoggerHandler = null;
+    private volatile FileLoggerHandler fileLoggerHandler;
 
-    private volatile FileLoggerHandlerFactory fileLoggerHandlerFactory = null;
+    private volatile FileLoggerHandlerFactory fileLoggerHandlerFactory;
 
-    private Deployment deployment = null;
+    private Deployment deployment;
 
-    private ArchiveFactory factory = null;
+    private ArchiveFactory factory;
 
-    private ActionReport report = null;
+    private ActionReport report;
+
+    private VirtualServerConfig config;
+
+    private List<WebListener> listeners = new ArrayList<>();
 
     // ------------------------------------------------------------- Properties
 
     /**
      * Return the virtual server identifier.
      */
+    @Override
     public String getID() {
         return _id;
     }
@@ -287,6 +309,7 @@
      *
      * @param id New identifier for this virtual server
      */
+    @Override
     public void setID(String id) {
         _id = id;
     }
@@ -311,21 +334,19 @@
     /**
      * Gets the value of the allowLinking property of this virtual server.
      *
-     * @return true if symbolic links from this virtual server's docroot (as
-     * well as symbolic links from archives of web modules deployed on this
-     * virtual server) are followed, false otherwise
+     * @return true if symbolic links from this virtual server's docroot (as well as symbolic links from archives of web
+     * modules deployed on this virtual server) are followed, false otherwise
      */
     public boolean getAllowLinking() {
         return allowLinking;
     }
 
     /**
-     * Sets the allowLinking property of this virtual server, which determines
-     * whether symblic links from this virtual server's docroot are followed.
+     * Sets the allowLinking property of this virtual server, which determines whether symblic links from this virtual
+     * server's docroot are followed.
      *
-     * This property is inherited by all web modules deployed on this virtual
-     * server, unless overridden by the allowLinking property in a web module's
-     * sun-web.xml.
+     * This property is inherited by all web modules deployed on this virtual server, unless overridden by the allowLinking
+     * property in a web module's sun-web.xml.
      *
      * @param allowLinking Value of allowLinking property
      */
@@ -336,37 +357,36 @@
     /**
      * Gets the config bean associated with this VirtualServer.
      */
-    public com.sun.enterprise.config.serverbeans.VirtualServer getBean(){
+    public com.sun.enterprise.config.serverbeans.VirtualServer getBean() {
         return vsBean;
     }
 
     /**
      * Sets the config bean for this VirtualServer
      */
-    public void setBean(
-            com.sun.enterprise.config.serverbeans.VirtualServer vsBean){
+    public void setBean(com.sun.enterprise.config.serverbeans.VirtualServer vsBean) {
         this.vsBean = vsBean;
     }
 
     /**
      * Gets the mime map associated with this VirtualServer.
      */
-    public MimeMap getMimeMap(){
+    public MimeMap getMimeMap() {
         return mimeMap;
     }
 
     /**
      * Sets the mime map for this VirtualServer
      */
-    public void setMimeMap(MimeMap mimeMap){
+    public void setMimeMap(MimeMap mimeMap) {
         this.mimeMap = mimeMap;
     }
 
     /**
      * Gets the Cache-Control configuration of this VirtualServer.
      *
-     * @return Cache-Control configuration of this VirtualServer, or null if
-     * no such configuration exists for this VirtualServer
+     * @return Cache-Control configuration of this VirtualServer, or null if no such configuration exists for this
+     * VirtualServer
      */
     public String[] getCacheControls() {
         return cacheControls;
@@ -375,8 +395,7 @@
     /**
      * Sets the Cache-Control configuration for this VirtualServer
      *
-     * @param cacheControls Cache-Control configuration settings for this
-     * VirtualServer
+     * @param cacheControls Cache-Control configuration settings for this VirtualServer
      */
     public void setCacheControls(String[] cacheControls) {
         this.cacheControls = cacheControls;
@@ -386,6 +405,7 @@
         this.services = services;
     }
 
+    @Override
     public String getInfo() {
         return _info;
     }
@@ -399,7 +419,7 @@
     }
 
     public void setClassLoaderHierarchy(ClassLoaderHierarchy clh) {
-        this.clh = clh;
+        this.classLoaderHierarchy = clh;
     }
 
     public void setDomain(Domain domain) {
@@ -410,11 +430,10 @@
     public Container findChild(String contextRoot) {
         if (defaultContextPath != null && "/".equals(contextRoot)) {
             return super.findChild(defaultContextPath);
-        } else {
-            return super.findChild(contextRoot);
         }
-    }
 
+        return super.findChild(contextRoot);
+    }
 
     // --------------------------------------------------------- Public Methods
 
@@ -425,11 +444,9 @@
      * @param hreq the HttpServletRequest that has initiated the SSO session
      */
     @Override
-    public void configureSingleSignOnCookieSecure(Cookie ssoCookie,
-                                                  HttpServletRequest hreq) {
+    public void configureSingleSignOnCookieSecure(Cookie ssoCookie, HttpServletRequest hreq) {
         super.configureSingleSignOnCookieSecure(ssoCookie, hreq);
-        if (ssoCookieSecure != null &&
-                !ssoCookieSecure.equals(SessionCookieConfig.DYNAMIC_SECURE)) {
+        if (ssoCookieSecure != null && !ssoCookieSecure.equals(SessionCookieConfig.DYNAMIC_SECURE)) {
             ssoCookie.setSecure(Boolean.parseBoolean(ssoCookieSecure));
         }
     }
@@ -439,13 +456,12 @@
         ssoCookie.setHttpOnly(ssoCookieHttpOnly);
     }
 
-
     // ------------------------------------------------------ Lifecycle Methods
 
     /**
-     * Adds the given valve to the currently active pipeline, keeping the
-     * pipeline that is not currently active in sync.
+     * Adds the given valve to the currently active pipeline, keeping the pipeline that is not currently active in sync.
      */
+    @Override
     public synchronized void addValve(GlassFishValve valve) {
         super.addValve(valve);
         if (pipeline == vsPipeline) {
@@ -455,11 +471,11 @@
         }
     }
 
-
     /**
-     * Adds the given Tomcat-style valve to the currently active pipeline,
-     * keeping the pipeline that is not currently active in sync.
+     * Adds the given Tomcat-style valve to the currently active pipeline, keeping the pipeline that is not currently active
+     * in sync.
      */
+    @Override
     public synchronized void addValve(Valve valve) {
         super.addValve(valve);
         if (pipeline == vsPipeline) {
@@ -469,11 +485,10 @@
         }
     }
 
-
     /**
-     * Removes the given valve from the currently active pipeline, keeping the
-     * valve that is not currently active in sync.
+     * Removes the given valve from the currently active pipeline, keeping the valve that is not currently active in sync.
      */
+    @Override
     public synchronized void removeValve(GlassFishValve valve) {
         super.removeValve(valve);
         if (pipeline == vsPipeline) {
@@ -484,196 +499,173 @@
     }
 
     private ConfigBeansUtilities getConfigBeansUtilities() {
-        if (services == null) return null;
+        if (services == null) {
+            return null;
+        }
+
         return services.getService(ConfigBeansUtilities.class);
     }
 
     // ------------------------------------------------------ Protected Methods
 
     /**
-     * Gets the context root of the web module that the user/configuration
-     * has designated as the default-web-module for this virtual server.
+     * Gets the context root of the web module that the user/configuration has designated as the default-web-module for this
+     * virtual server.
      *
-     * The default-web-module for a virtual server is specified via the
-     * 'default-web-module' attribute of the 'virtual-server' element in
-     * server.xml. This is an optional attribute and if the configuration
-     * does not specify another web module (standalone or part of a
-     * j2ee-application) that is configured at a context-root="", then
-     * a default web module will be created and loaded. The value for this
-     * attribute is either "${standalone-web-module-name}" or
+     * The default-web-module for a virtual server is specified via the 'default-web-module' attribute of the
+     * 'virtual-server' element in server.xml. This is an optional attribute and if the configuration does not specify
+     * another web module (standalone or part of a j2ee-application) that is configured at a context-root="", then a default
+     * web module will be created and loaded. The value for this attribute is either "${standalone-web-module-name}" or
      * "${j2ee-app-name}:${web-module-uri}".
      *
-     * @return null if the default-web-module has not been specified or
-     *              if the web module specified either could not be found or
-     *              is disabled or does not specify this virtual server (if
-     *              it specifies a value for the virtual-servers attribute) or
-     *              if there was an error loading its deployment descriptors.
+     * @return null if the default-web-module has not been specified or if the web module specified either could not be
+     * found or is disabled or does not specify this virtual server (if it specifies a value for the virtual-servers
+     * attribute) or if there was an error loading its deployment descriptors.
      */
-    protected String getDefaultContextPath(Domain domain,
-            ApplicationRegistry appRegistry) {
-
+    protected String getDefaultContextPath(Domain domain, ApplicationRegistry appRegistry) {
         String contextRoot = null;
-        String wmID = getDefaultWebModuleID();
+        String webModuleID = getDefaultWebModuleID();
 
-        if (wmID != null) {
-            // Check if the default-web-module is part of a
-            // j2ee-application
+        if (webModuleID != null) {
+            // Check if the default-web-module is part of a Jakarta EE application
             Applications appsBean = domain.getApplications();
-            WebModuleConfig wmInfo = findWebModuleInJ2eeApp(appsBean, wmID,
-                                                            appRegistry);
+            WebModuleConfig wmInfo = findWebModuleInJ2eeApp(appsBean, webModuleID, appRegistry);
             if (wmInfo == null) {
                 ConfigBeansUtilities cbu = getConfigBeansUtilities();
                 if (cbu == null) {
                     contextRoot = null;
-                }
-                else {
-                    contextRoot = cbu.getContextRoot(wmID);
+                } else {
+                    contextRoot = cbu.getContextRoot(webModuleID);
                 }
             } else {
                 contextRoot = wmInfo.getContextPath();
             }
 
             if (contextRoot == null) {
-                Object[] params = { wmID, getID() };
-                _logger.log(Level.SEVERE, LogFacade.VS_DEFAULT_WEB_MODULE_NOT_FOUND, params);
+                Object[] params = { webModuleID, getID() };
+                _logger.log(SEVERE, LogFacade.VS_DEFAULT_WEB_MODULE_NOT_FOUND, params);
             }
         }
 
         return contextRoot;
     }
 
-    protected WebModuleConfig getDefaultWebModule(Domain domain,
-            WebArchivist webArchivist, ApplicationRegistry appRegistry) {
+    protected WebModuleConfig getDefaultWebModule(Domain domain, WebArchivist webArchivist, ApplicationRegistry appRegistry) {
+        WebModuleConfig webModuleConfig = null;
 
-        WebModuleConfig wmInfo = null;
-
-        String wmID = getDefaultWebModuleID();
-        if (wmID != null) {
-            // Check if the default-web-module is part of a
-            // j2ee-application
+        String webModuleID = getDefaultWebModuleID();
+        if (webModuleID != null) {
+            // Check if the default-web-module is part of a Jakarta EE application
             Applications appsBean = domain.getApplications();
-            wmInfo = findWebModuleInJ2eeApp(appsBean, wmID, appRegistry);
-            if (wmInfo == null) {
+            webModuleConfig = findWebModuleInJ2eeApp(appsBean, webModuleID, appRegistry);
+            if (webModuleConfig == null) {
                 ConfigBeansUtilities cbu = getConfigBeansUtilities();
                 String contextRoot = null;
                 String location = null;
                 if (cbu != null) {
-                    contextRoot = cbu.getContextRoot(wmID);
-                    location = cbu.getLocation(wmID);
+                    contextRoot = cbu.getContextRoot(webModuleID);
+                    location = cbu.getLocation(webModuleID);
                 }
 
-                if (contextRoot!=null && location != null) {
+                if (contextRoot != null && location != null) {
                     File docroot = new File(location);
-                    WebBundleDescriptorImpl wbd = webArchivist.getDefaultWebXmlBundleDescriptor();
-                    wmInfo = new WebModuleConfig();
-                    wbd.setName(Constants.DEFAULT_WEB_MODULE_NAME);
-                    wbd.setContextRoot(contextRoot);
-                    wmInfo.setLocation(docroot);
-                    wmInfo.setDescriptor(wbd);
-                    wmInfo.setParentLoader(EmbeddedWebContainer.class.getClassLoader());
+                    WebBundleDescriptorImpl webBundleDescriptor = webArchivist.getDefaultWebXmlBundleDescriptor();
+                    webModuleConfig = new WebModuleConfig();
+                    webBundleDescriptor.setName(DEFAULT_WEB_MODULE_NAME);
+                    webBundleDescriptor.setContextRoot(contextRoot);
+                    webModuleConfig.setLocation(docroot);
+                    webModuleConfig.setDescriptor(webBundleDescriptor);
+                    webModuleConfig.setParentLoader(EmbeddedWebContainer.class.getClassLoader());
                     WebappClassLoader cloader = AccessController.doPrivileged(new PrivilegedAction<WebappClassLoader>() {
                         @Override
                         public WebappClassLoader run() {
                             return new WebappClassLoader(EmbeddedWebContainer.class.getClassLoader());
                         }
                     });
-                    wmInfo.setAppClassLoader(cloader);
+                    webModuleConfig.setAppClassLoader(cloader);
                 }
             }
 
-            if (wmInfo == null) {
-                _logger.log(Level.SEVERE, LogFacade.VS_DEFAULT_WEB_MODULE_NOT_FOUND, new Object[] {wmID, getID()});
+            if (webModuleConfig == null) {
+                _logger.log(SEVERE, LogFacade.VS_DEFAULT_WEB_MODULE_NOT_FOUND, new Object[] { webModuleID, getID() });
             }
         }
 
-        return wmInfo;
+        return webModuleConfig;
     }
 
-
     /**
-     * If a default web module has not yet been configured and added to this
-     * virtual server's list of web modules then return the configuration
-     * information needed in order to create a default web module for this
-     * virtual server.
+     * If a default web module has not yet been configured and added to this virtual server's list of web modules then
+     * return the configuration information needed in order to create a default web module for this virtual server.
      *
-     * This method should be invoked only after all the standalone modules
-     * and the modules within j2ee-application elements have been added to
-     * this virtual server's list of modules (only then will one know whether
-     * the user has already configured a default web module or not).
+     * This method should be invoked only after all the standalone modules and the modules within j2ee-application elements
+     * have been added to this virtual server's list of modules (only then will one know whether the user has already
+     * configured a default web module or not).
      */
-    public WebModuleConfig createSystemDefaultWebModuleIfNecessary(
-            WebArchivist webArchivist) {
-
-        WebModuleConfig wmInfo = null;
+    public WebModuleConfig createSystemDefaultWebModuleIfNecessary(WebArchivist webArchivist) {
+        WebModuleConfig webModuleConfig = null;
 
         // Add a default context only if one hasn't already been loaded
         // and then too only if docroot is not null
         //
         String docroot = getAppBase();
-        if (getDefaultWebModuleID() == null && findChild("") == null
-                && docroot != null) {
+        if (getDefaultWebModuleID() == null && findChild("") == null && docroot != null) {
 
-            WebBundleDescriptorImpl wbd =
-                webArchivist.getDefaultWebXmlBundleDescriptor();
-            wmInfo = new WebModuleConfig();
-            wbd.setModuleID(Constants.DEFAULT_WEB_MODULE_NAME);
-            wbd.setContextRoot("");
-            wmInfo.setLocation(new File(docroot));
-            wmInfo.setDescriptor(wbd);
-            wmInfo.setParentLoader(
-                serverContext.getCommonClassLoader());
+            WebBundleDescriptorImpl webBundleDescriptor = webArchivist.getDefaultWebXmlBundleDescriptor();
+            webModuleConfig = new WebModuleConfig();
+            webBundleDescriptor.setModuleID(DEFAULT_WEB_MODULE_NAME);
+            webBundleDescriptor.setContextRoot("");
+            webModuleConfig.setLocation(new File(docroot));
+            webModuleConfig.setDescriptor(webBundleDescriptor);
+            webModuleConfig.setParentLoader(serverContext.getCommonClassLoader());
             WebappClassLoader loader = AccessController.doPrivileged(new PrivilegedAction<WebappClassLoader>() {
                 @Override
                 public WebappClassLoader run() {
                     return new WebappClassLoader(serverContext.getCommonClassLoader());
                 }
             });
+
             loader.start();
-            wmInfo.setAppClassLoader(loader);
-            if ( wbd.getApplication() == null ) {
+            webModuleConfig.setAppClassLoader(loader);
+
+            if (webBundleDescriptor.getApplication() == null) {
                 Application application = Application.createApplication();
                 application.setVirtual(true);
-                application.setName(Constants.DEFAULT_WEB_MODULE_NAME);
-                wbd.setApplication(application);
+                application.setName(DEFAULT_WEB_MODULE_NAME);
+                webBundleDescriptor.setApplication(application);
             }
         }
 
-        return wmInfo;
-
+        return webModuleConfig;
     }
 
     /**
-     * Returns the id of the default web module for this virtual server
-     * as specified in the 'default-web-module' attribute of the
-     * 'virtual-server' element.
+     * Returns the id of the default web module for this virtual server as specified in the 'default-web-module' attribute
+     * of the 'virtual-server' element.
      */
     protected String getDefaultWebModuleID() {
-        String wmID = vsBean.getDefaultWebModule();
-        if ("".equals(wmID)) {
-            wmID = null;
-        }
-        if (wmID != null && _logger.isLoggable(Level.FINE)) {
-            Object[] params = { wmID, _id };
-            _logger.log(Level.FINE, LogFacade.VS_DEFAULT_WEB_MODULE, params);
+        String webModuleID = vsBean.getDefaultWebModule();
+        if ("".equals(webModuleID)) {
+            webModuleID = null;
         }
 
-        return wmID;
+        if (webModuleID != null && _logger.isLoggable(FINE)) {
+            Object[] params = { webModuleID, _id };
+            _logger.log(FINE, VS_DEFAULT_WEB_MODULE, params);
+        }
+
+        return webModuleID;
     }
 
     /**
-     * Finds and returns information about a web module embedded within a
-     * J2EE application, which is identified by a string of the form
-     * <code>a:b</code> or <code>a#b</code>, where <code>a</code> is the name
-     * of the J2EE application and <code>b</code> is the name of the embedded
-     * web module.
+     * Finds and returns information about a web module embedded within a J2EE application, which is identified by a string
+     * of the form <code>a:b</code> or <code>a#b</code>, where <code>a</code> is the name of the J2EE application and
+     * <code>b</code> is the name of the embedded web module.
      *
-     * @return null if <code>id</code> does not identify a web module embedded
-     * within a J2EE application.
+     * @return null if <code>id</code> does not identify a web module embedded within a J2EE application.
      */
-    protected WebModuleConfig findWebModuleInJ2eeApp(Applications appsBean,
-            String id, ApplicationRegistry appRegistry) {
-
-        WebModuleConfig wmInfo = null;
+    protected WebModuleConfig findWebModuleInJ2eeApp(Applications appsBean, String id, ApplicationRegistry appRegistry) {
+        WebModuleConfig webModuleConfig = null;
 
         // Check for ':' separator
         int separatorIndex = id.indexOf(Constants.NAME_SEPARATOR);
@@ -686,13 +678,11 @@
             String moduleID = id.substring(separatorIndex + 1);
 
             com.sun.enterprise.config.serverbeans.Application appBean =
-                appsBean.getModule(
-                com.sun.enterprise.config.serverbeans.Application.class, appID);
+                appsBean.getModule(com.sun.enterprise.config.serverbeans.Application.class, appID);
 
             if ((appBean != null) && Boolean.valueOf(appBean.getEnabled())) {
                 String location = appBean.getLocation();
-                String moduleDir = DeploymentUtils.getRelativeEmbeddedModulePath(
-                                                            location, moduleID);
+                String moduleDir = DeploymentUtils.getRelativeEmbeddedModulePath(location, moduleID);
 
                 ApplicationInfo appInfo = appRegistry.get(appID);
                 Application app = null;
@@ -701,70 +691,62 @@
                 } else {
                     // XXX ApplicaionInfo is NULL after restart
                     Object[] params = { id, getID() };
-                    _logger.log(Level.SEVERE, LogFacade.VS_DEFAULT_WEB_MODULE_DISABLED,
-                            params);
-                    return wmInfo;
+                    _logger.log(SEVERE, VS_DEFAULT_WEB_MODULE_DISABLED, params);
+                    return webModuleConfig;
                 }
 
-                WebBundleDescriptorImpl wbd = app.getModuleByTypeAndUri(WebBundleDescriptorImpl.class, moduleID);
-                String webUri = wbd.getModuleDescriptor().getArchiveUri();
-                String contextRoot = wbd.getModuleDescriptor().getContextRoot();
+                WebBundleDescriptorImpl webBundleDescriptor = app.getModuleByTypeAndUri(WebBundleDescriptorImpl.class, moduleID);
+                String webUri = webBundleDescriptor.getModuleDescriptor().getArchiveUri();
+                String contextRoot = webBundleDescriptor.getModuleDescriptor().getContextRoot();
+
                 if (moduleID.equals(webUri)) {
                     StringBuilder dir = new StringBuilder(location);
                     dir.append(File.separator);
                     dir.append(moduleDir);
                     File docroot = new File(dir.toString());
-                    wmInfo = new WebModuleConfig();
-                    wbd.setName(moduleID);
-                    wbd.setContextRoot(contextRoot);
-                    wmInfo.setDescriptor(wbd);
-                    wmInfo.setLocation(docroot);
-                    wmInfo.setParentLoader(EmbeddedWebContainer.class.getClassLoader());
+                    webModuleConfig = new WebModuleConfig();
+                    webBundleDescriptor.setName(moduleID);
+                    webBundleDescriptor.setContextRoot(contextRoot);
+                    webModuleConfig.setDescriptor(webBundleDescriptor);
+                    webModuleConfig.setLocation(docroot);
+                    webModuleConfig.setParentLoader(EmbeddedWebContainer.class.getClassLoader());
                     WebappClassLoader cloader = AccessController.doPrivileged(new PrivilegedAction<WebappClassLoader>() {
                         @Override
                         public WebappClassLoader run() {
                             return new WebappClassLoader(EmbeddedWebContainer.class.getClassLoader());
                         }
                     });
-                    wmInfo.setAppClassLoader(cloader);
+                    webModuleConfig.setAppClassLoader(cloader);
 
                 }
             } else {
                 Object[] params = { id, getID() };
-                _logger.log(Level.SEVERE, LogFacade.VS_DEFAULT_WEB_MODULE_DISABLED,
-                            params);
+                _logger.log(SEVERE, VS_DEFAULT_WEB_MODULE_DISABLED, params);
             }
         }
 
-        return wmInfo;
+        return webModuleConfig;
     }
 
     /**
-     * Virtual servers are maintained in the reference contained
-     * in Server element. First, we need to find the server
-     * and then get the virtual server from the correct reference
+     * Virtual servers are maintained in the reference contained in Server element. First, we need to find the server and
+     * then get the virtual server from the correct reference
      *
      * @param appName Name of the app to get vs
      *
      * @return virtual servers as a string (separated by space or comma)
      *
-    private String getVirtualServers(String appName) {
-        String ret = null;
-        Server server = Globals.getDefaultHabitat().forContract(Server.class).get();
-        for (ApplicationRef appRef : server.getApplicationRef()) {
-            if (appRef.getRef().equals(appName)) {
-                return appRef.getVirtualServers();
-            }
-        }
-
-        return ret;
-    } */
-
+     * private String getVirtualServers(String appName) { String ret = null; Server server =
+     * Globals.getDefaultHabitat().forContract(Server.class).get(); for (ApplicationRef appRef : server.getApplicationRef())
+     * { if (appRef.getRef().equals(appName)) { return appRef.getVirtualServers(); } }
+     *
+     * return ret; }
+     */
 
     /**
      * Delete all aliases.
      */
-    public void clearAliases(){
+    public void clearAliases() {
         aliases = new String[0];
     }
 
@@ -815,14 +797,8 @@
     /**
      * Configures this virtual server.
      */
-    public void configure(
-                    String vsID,
-                    com.sun.enterprise.config.serverbeans.VirtualServer vsBean,
-                    String vsDocroot,
-                    String vsLogFile,
-                    MimeMap vsMimeMap,
-                    String logServiceFile,
-                    String logLevel) {
+    public void configure(String vsID, com.sun.enterprise.config.serverbeans.VirtualServer vsBean, String vsDocroot, String vsLogFile,
+            MimeMap vsMimeMap, String logServiceFile, String logLevel) {
         setDebug(debug);
         setAppBase(vsDocroot);
         setName(vsID);
@@ -833,12 +809,12 @@
         String defaultContextXmlLocation = Constants.DEFAULT_CONTEXT_XML;
         String defaultWebXmlLocation = Constants.DEFAULT_WEB_XML;
 
-        //Begin EE: 4920692 Make the default-web.xml be relocatable
+        // Begin EE: 4920692 Make the default-web.xml be relocatable
         Property prop = vsBean.getProperty("default-web-xml");
         if (prop != null) {
             defaultWebXmlLocation = prop.getValue();
         }
-        //End EE: 4920692 Make the default-web.xml be relocatable
+        // End EE: 4920692 Make the default-web.xml be relocatable
 
         // allowLinking
         boolean allowLinking = false;
@@ -872,8 +848,7 @@
     /**
      * Configures the valve_ and listener_ properties of this VirtualServer.
      */
-    protected void configureCatalinaProperties(){
-
+    protected void configureCatalinaProperties() {
         List<Property> props = vsBean.getProperty();
         if (props == null) {
             return;
@@ -884,9 +859,7 @@
             String propName = prop.getName();
             String propValue = prop.getValue();
             if (propName == null || propValue == null) {
-                _logger.log(Level.WARNING,
-                        LogFacade.NULL_VIRTUAL_SERVER_PROPERTY,
-                        getName());
+                _logger.log(WARNING, NULL_VIRTUAL_SERVER_PROPERTY, getName());
             }
 
             if (propName != null) {
@@ -894,76 +867,34 @@
                     addValve(propValue);
                 } else if (propName.startsWith("listener_")) {
                     addListener(propValue);
-                } else if (propName.equals("securePagesWithPragma")){
+                } else if (propName.equals("securePagesWithPragma")) {
                     setSecurePagesWithPragma(Boolean.valueOf(propValue));
                 }
             }
         }
     }
 
-
     /*
      * Configures this virtual server with the specified log file.
      *
-     * @param logFile The value of the virtual server's log-file attribute in
-     * the domain.xml
+     * @param logFile The value of the virtual server's log-file attribute in the domain.xml
      */
     synchronized void setLogFile(String logFile, String logLevel, String logServiceFile) {
 
-        /** catalina file logger code
-        String logPrefix = logFile;
-        String logDir = null;
-        String logSuffix = null;
-
-        if (logPrefix == null || logPrefix.equals("")) {
-            return;
-        }
-
-        int index = logPrefix.lastIndexOf(File.separatorChar);
-        if (index != -1) {
-            logDir = logPrefix.substring(0, index);
-            logPrefix = logPrefix.substring(index+1);
-        }
-
-        index = logPrefix.indexOf('.');
-        if (index != -1) {
-            logSuffix = logPrefix.substring(index);
-            logPrefix = logPrefix.substring(0, index);
-        }
-
-        logPrefix += "_";
-
-        FileLogger contextLogger = new FileLogger();
-        if (logDir != null) {
-            contextLogger.setDirectory(logDir);
-        }
-        contextLogger.setPrefix(logPrefix);
-        if (logSuffix != null) {
-            contextLogger.setSuffix(logSuffix);
-        }
-        contextLogger.setTimestamp(true);
-        contextLogger.setLevel(logLevel);
-         */
-
-
         /*
-         * Configure separate logger for this virtual server only if
-         * 'log-file' attribute of this <virtual-server> and 'file'
+         * Configure separate logger for this virtual server only if 'log-file' attribute of this <virtual-server> and 'file'
          * attribute of <log-service> are different (See 6189219).
          */
-        boolean noCustomLog = (logFile == null ||
-            (logServiceFile != null && new File(logFile).equals(
-                    new File(logServiceFile))));
+        boolean noCustomLog = (logFile == null || (logServiceFile != null && new File(logFile).equals(new File(logServiceFile))));
 
-        if ((fileLoggerHandler == null && noCustomLog) ||
-                (fileLoggerHandler != null && logFile != null &&
-                logFile.equals(fileLoggerHandler.getLogFile()))) {
+        if ((fileLoggerHandler == null && noCustomLog)
+                || (fileLoggerHandler != null && logFile != null && logFile.equals(fileLoggerHandler.getLogFile()))) {
             return;
         }
 
         Logger newLogger = null;
         FileLoggerHandler oldHandler = fileLoggerHandler;
-        //remove old handler
+        // remove old handler
         if (oldHandler != null) {
             _logger.removeHandler(oldHandler);
         }
@@ -986,7 +917,7 @@
                                 record.setResourceBundle(bundle);
                             }
                         }
-                        record.setThreadID((int)Thread.currentThread().getId());
+                        record.setThreadID((int) Thread.currentThread().getId());
                         super.log(record);
                     }
 
@@ -1000,7 +931,7 @@
                     public synchronized void addHandler(Handler handler) {
                         super.addHandler(handler);
                         if (handler instanceof FileLoggerHandler) {
-                            ((FileLoggerHandler)handler).associate();
+                            ((FileLoggerHandler) handler).associate();
                         }
                     }
 
@@ -1021,13 +952,13 @@
                             }
                             if (hasHandler) {
                                 super.removeHandler(handler);
-                                ((FileLoggerHandler)handler).disassociate();
+                                ((FileLoggerHandler) handler).disassociate();
                             }
                         }
                     }
                 };
 
-                synchronized(Logger.class) {
+                synchronized (Logger.class) {
                     LogManager.getLogManager().addLogger(newLogger);
                 }
             }
@@ -1068,10 +999,9 @@
      */
     void configureAliases() {
         List hosts = StringUtils.parseStringList(vsBean.getHosts(), ",");
-        for (int i=0; i < hosts.size(); i++ ){
-            String alias = hosts.get(i).toString();
-            if ( !alias.equalsIgnoreCase("localhost") &&
-                    !alias.equalsIgnoreCase("localhost.localdomain")){
+        for (Object host : hosts) {
+            String alias = host.toString();
+            if (!alias.equalsIgnoreCase("localhost") && !alias.equalsIgnoreCase("localhost.localdomain")) {
                 addAlias(alias);
             }
         }
@@ -1079,8 +1009,7 @@
 
     void configureAliases(String... hosts) {
         for (String host : hosts) {
-            if ( !host.equalsIgnoreCase("localhost") &&
-                    !host.equalsIgnoreCase("localhost.localdomain")){
+            if (!host.equalsIgnoreCase("localhost") && !host.equalsIgnoreCase("localhost.localdomain")) {
                 addAlias(host);
             }
         }
@@ -1089,15 +1018,15 @@
     /**
      * Configures this virtual server with its authentication realm.
      *
-     * Checks if this virtual server specifies any authRealm property, and
-     * if so, ensures that its value identifies a valid realm.
+     * Checks if this virtual server specifies any authRealm property, and if so, ensures that its value identifies a valid
+     * realm.
      *
      * @param securityService The security-service element from domain.xml
      */
     void configureAuthRealm(SecurityService securityService) {
         List<Property> properties = vsBean.getProperty();
         if (properties != null && properties.size() > 0) {
-            for (Property p: properties) {
+            for (Property p : properties) {
                 if (p != null && "authRealm".equals(p.getName())) {
                     authRealmName = p.getValue();
                     if (authRealmName != null) {
@@ -1105,8 +1034,7 @@
                         List<AuthRealm> rs = securityService.getAuthRealm();
                         if (rs != null && rs.size() > 0) {
                             for (AuthRealm r : rs) {
-                                if (r != null &&
-                                        r.getName().equals(authRealmName)) {
+                                if (r != null && r.getName().equals(authRealmName)) {
                                     realm = r;
                                     break;
                                 }
@@ -1114,8 +1042,7 @@
                         }
 
                         if (realm == null) {
-                            _logger.log(Level.SEVERE, LogFacade.INVALID_AUTH_REALM,
-                                new Object[] {getID(), authRealmName});
+                            _logger.log(SEVERE, INVALID_AUTH_REALM, new Object[] { getID(), authRealmName });
                         }
                     }
                     break;
@@ -1127,16 +1054,15 @@
     /**
      * Gets the value of the authRealm property of this virtual server.
      *
-     * @return The value of the authRealm property of this virtual server,
-     * or null of this virtual server does not have any such property
+     * @return The value of the authRealm property of this virtual server, or null of this virtual server does not have any
+     * such property
      */
     String getAuthRealmName() {
         return authRealmName;
     }
 
     /**
-     * Adds the <code>Valve</code> with the given class name to this
-     * VirtualServer.
+     * Adds the <code>Valve</code> with the given class name to this VirtualServer.
      *
      * @param valveName The valve's fully qualified class nam
      */
@@ -1147,44 +1073,46 @@
         } else if (valve instanceof GlassFishValve) {
             addValve((GlassFishValve) valve);
         } else {
-            _logger.log(Level.WARNING, LogFacade.NOT_A_VALVE, valveName);
+            _logger.log(WARNING, NOT_A_VALVE, valveName);
         }
     }
 
     /**
-     * Adds the Catalina listener with the given class name to this
-     * VirtualServer.
+     * Adds the Catalina listener with the given class name to this VirtualServer.
      *
      * @param listenerName The fully qualified class name of the listener
      */
     protected void addListener(String listenerName) {
         Object listener = safeLoadInstance(listenerName);
-
-        if ( listener == null ) return;
+        if (listener == null) {
+            return;
+        }
 
         if (listener instanceof ContainerListener) {
-            addContainerListener((ContainerListener)listener);
-        } else if (listener instanceof LifecycleListener){
-            addLifecycleListener((LifecycleListener)listener);
+            addContainerListener((ContainerListener) listener);
+        } else if (listener instanceof LifecycleListener) {
+            addLifecycleListener((LifecycleListener) listener);
         } else {
-            _logger.log(Level.SEVERE, LogFacade.INVALID_LISTENER_VIRTUAL_SERVER,
-                new Object[] {listenerName, getID()});
+            _logger.log(SEVERE, INVALID_LISTENER_VIRTUAL_SERVER, new Object[] { listenerName, getID() });
         }
     }
 
     @Override
     protected Object loadInstance(String className) throws Exception {
         // See IT 11674 for why CommonClassLoader must be used
-        Class clazz = serverContext.getCommonClassLoader().loadClass(className);
-        return clazz.newInstance();
+        return serverContext.getCommonClassLoader()
+                            .loadClass(className)
+                            .getDeclaredConstructor()
+                            .newInstance();
     }
 
-    private Object safeLoadInstance(String className){
-        try{
+    private Object safeLoadInstance(String className) {
+        try {
             return loadInstance(className);
-        } catch (Throwable ex){
-            _logger.log(Level.SEVERE, LogFacade.UNABLE_TO_LOAD_EXTENSION_SEVERE, ex);
+        } catch (Throwable ex) {
+            _logger.log(SEVERE, UNABLE_TO_LOAD_EXTENSION_SEVERE, ex);
         }
+
         return null;
     }
 
@@ -1192,7 +1120,6 @@
      * Configures this VirtualServer with its send-error properties.
      */
     void configureErrorPage() {
-
         ErrorPage errorPage = null;
 
         List<Property> props = vsBean.getProperty();
@@ -1204,9 +1131,7 @@
             String propName = prop.getName();
             String propValue = prop.getValue();
             if (propName == null || propValue == null) {
-                _logger.log(Level.WARNING,
-                        LogFacade.NULL_VIRTUAL_SERVER_PROPERTY,
-                        getID());
+                _logger.log(WARNING, NULL_VIRTUAL_SERVER_PROPERTY, getID());
                 continue;
             }
 
@@ -1222,38 +1147,32 @@
             String status = null;
 
             String[] errorParams = propValue.split(" ");
-            for (int j=0; j<errorParams.length; j++) {
+            for (String errorParam : errorParams) {
 
-                if (errorParams[j].startsWith("path=")) {
+                if (errorParam.startsWith("path=")) {
                     if (path != null) {
-                        _logger.log(Level.WARNING,
-                                LogFacade.SEND_ERROR_MULTIPLE_ELEMENT,
-                                new Object[] { propValue, getID(), "path" });
+                        _logger.log(WARNING, SEND_ERROR_MULTIPLE_ELEMENT, new Object[] { propValue, getID(), "path" });
                     }
-                    path = errorParams[j].substring("path=".length());
+                    path = errorParam.substring("path=".length());
                 }
 
-                if (errorParams[j].startsWith("reason=")) {
+                if (errorParam.startsWith("reason=")) {
                     if (reason != null) {
-                        _logger.log(Level.WARNING,
-                                LogFacade.SEND_ERROR_MULTIPLE_ELEMENT,
-                                new Object[] { propValue, getID(), "reason" });
+                        _logger.log(WARNING, SEND_ERROR_MULTIPLE_ELEMENT, new Object[] { propValue, getID(), "reason" });
                     }
-                    reason = errorParams[j].substring("reason=".length());
+                    reason = errorParam.substring("reason=".length());
                 }
 
-                if (errorParams[j].startsWith("code=")) {
+                if (errorParam.startsWith("code=")) {
                     if (status != null) {
-                        _logger.log(Level.WARNING,
-                                LogFacade.SEND_ERROR_MULTIPLE_ELEMENT,
-                                new Object[] { propValue, getID(), "code" });
+                        _logger.log(WARNING, SEND_ERROR_MULTIPLE_ELEMENT, new Object[] { propValue, getID(), "code" });
                     }
-                    status = errorParams[j].substring("code=".length());
+                    status = errorParam.substring("code=".length());
                 }
             }
 
             if (path == null || path.length() == 0) {
-                _logger.log(Level.WARNING, LogFacade.SEND_ERROR_MISSING_PATH, new Object[] { propValue, getID() });
+                _logger.log(WARNING, LogFacade.SEND_ERROR_MISSING_PATH, new Object[] { propValue, getID() });
             }
 
             errorPage = new ErrorPage();
@@ -1270,7 +1189,6 @@
      * Configures this VirtualServer with its redirect properties.
      */
     void configureRedirect() {
-
         vsPipeline.clearRedirects();
 
         List<Property> props = vsBean.getProperty();
@@ -1283,9 +1201,7 @@
             String propName = prop.getName();
             String propValue = prop.getValue();
             if (propName == null || propValue == null) {
-                _logger.log(Level.WARNING,
-                        LogFacade.NULL_VIRTUAL_SERVER_PROPERTY,
-                        getID());
+                _logger.log(WARNING, NULL_VIRTUAL_SERVER_PROPERTY, getID());
                 continue;
             }
 
@@ -1302,64 +1218,47 @@
             String escape = null;
 
             String[] redirectParams = propValue.split(" ");
-            for (int j=0; j<redirectParams.length; j++) {
+            for (String redirectParam : redirectParams) {
 
-                if (redirectParams[j].startsWith("from=")) {
+                if (redirectParam.startsWith("from=")) {
                     if (from != null) {
-                        _logger.log(Level.WARNING,
-                                LogFacade.REDIRECT_MULTIPLE_ELEMENT,
-                                new Object[] { propValue, getID(), "from" });
+                        _logger.log(WARNING, REDIRECT_MULTIPLE_ELEMENT, new Object[] { propValue, getID(), "from" });
                     }
-                    from = redirectParams[j].substring("from=".length());
+                    from = redirectParam.substring("from=".length());
                 }
 
-                if (redirectParams[j].startsWith("url=")) {
+                if (redirectParam.startsWith("url=")) {
                     if (url != null) {
-                        _logger.log(Level.WARNING,
-                                LogFacade.REDIRECT_MULTIPLE_ELEMENT,
-                                new Object[] { propValue, getID(), "url" });
+                        _logger.log(WARNING, REDIRECT_MULTIPLE_ELEMENT, new Object[] { propValue, getID(), "url" });
                     }
-                    url = redirectParams[j].substring("url=".length());
+                    url = redirectParam.substring("url=".length());
                 }
 
-                if (redirectParams[j].startsWith("url-prefix=")) {
+                if (redirectParam.startsWith("url-prefix=")) {
                     if (urlPrefix != null) {
-                        _logger.log(Level.WARNING,
-                                LogFacade.REDIRECT_MULTIPLE_ELEMENT,
-                                new Object[] { propValue, getID(), "url-prefix" });
+                        _logger.log(WARNING, REDIRECT_MULTIPLE_ELEMENT, new Object[] { propValue, getID(), "url-prefix" });
                     }
-                    urlPrefix = redirectParams[j].substring(
-                                                    "url-prefix=".length());
+                    urlPrefix = redirectParam.substring("url-prefix=".length());
                 }
 
-                if (redirectParams[j].startsWith("escape=")) {
+                if (redirectParam.startsWith("escape=")) {
                     if (escape != null) {
-                        _logger.log(Level.WARNING,
-                                LogFacade.REDIRECT_MULTIPLE_ELEMENT,
-                                new Object[] { propValue, getID(), "escape" });
+                        _logger.log(WARNING, REDIRECT_MULTIPLE_ELEMENT, new Object[] { propValue, getID(), "escape" });
                     }
-                    escape = redirectParams[j].substring("escape=".length());
+                    escape = redirectParam.substring("escape=".length());
                 }
             }
 
             if (from == null || from.length() == 0) {
-                _logger.log(Level.WARNING,
-                        LogFacade.REDIRECT_MULTIPLE_ELEMENT,
-                        new Object[] { propValue, getID() });
+                _logger.log(WARNING, REDIRECT_MULTIPLE_ELEMENT, new Object[] { propValue, getID() });
             }
 
             // Either url or url-prefix (but not both!) must be present
-            if ((url == null || url.length() == 0)
-                    && (urlPrefix == null || urlPrefix.length() == 0)) {
-                _logger.log(Level.WARNING,
-                        LogFacade.REDIRECT_MISSING_URL_OR_URL_PREFIX,
-                        new Object[] { propValue, getID() });
+            if ((url == null || url.length() == 0) && (urlPrefix == null || urlPrefix.length() == 0)) {
+                _logger.log(WARNING, REDIRECT_MISSING_URL_OR_URL_PREFIX, new Object[] { propValue, getID() });
             }
-            if (url != null && url.length() > 0
-                    && urlPrefix != null && urlPrefix.length() > 0) {
-                _logger.log(Level.WARNING,
-                        LogFacade.REDIRECT_BOTH_URL_AND_URL_PREFIX,
-                        new Object[] { propValue, getID() });
+            if (url != null && url.length() > 0 && urlPrefix != null && urlPrefix.length() > 0) {
+                _logger.log(WARNING, REDIRECT_BOTH_URL_AND_URL_PREFIX, new Object[] { propValue, getID() });
             }
 
             boolean escapeURI = true;
@@ -1369,9 +1268,7 @@
                 } else if ("no".equalsIgnoreCase(escape)) {
                     escapeURI = false;
                 } else {
-                    _logger.log(Level.WARNING,
-                        LogFacade.REDIRECT_INVALID_ESCAPE,
-                        new Object[] { propValue, getID() });
+                    _logger.log(WARNING, LogFacade.REDIRECT_INVALID_ESCAPE, new Object[] { propValue, getID() });
                 }
             }
 
@@ -1391,23 +1288,19 @@
     /**
      * Configures the SSO valve of this VirtualServer.
      */
-    void configureSingleSignOn(boolean globalSSOEnabled,
-            WebContainerFeatureFactory webContainerFeatureFactory,
-            boolean ssoFailoverEnabled) {
-
-
+    void configureSingleSignOn(boolean globalSSOEnabled, WebContainerFeatureFactory webContainerFeatureFactory, boolean ssoFailoverEnabled) {
         if (!isSSOEnabled(globalSSOEnabled)) {
             /*
              * Disable SSO
              */
-            if (_logger.isLoggable(Level.FINE)) {
-                _logger.log(Level.FINE, LogFacade.DISABLE_SSO, getID());
+            if (_logger.isLoggable(FINE)) {
+                _logger.log(FINE, LogFacade.DISABLE_SSO, getID());
             }
 
             boolean hasExistingSSO = false;
             // Remove existing SSO valve (if any)
             GlassFishValve[] valves = getValves();
-            for (int i=0; valves!=null && i<valves.length; i++) {
+            for (int i = 0; valves != null && i < valves.length; i++) {
                 if (valves[i] instanceof SingleSignOn) {
                     removeValve(valves[i]);
                     hasExistingSSO = true;
@@ -1423,17 +1316,17 @@
             /*
              * Enable SSO
              */
-            if (_logger.isLoggable(Level.FINE)) {
-                _logger.log(Level.FINE, LogFacade.ENABLE_SSO, getID());
+            if (_logger.isLoggable(FINE)) {
+                _logger.log(FINE, ENABLE_SSO, getID());
             }
 
             GlassFishSingleSignOn sso = null;
 
-            //find existing SSO (if any), in case of a reconfig
+            // find existing SSO (if any), in case of a reconfig
             GlassFishValve[] valves = getValves();
-            for (int i=0; valves!=null && i<valves.length; i++) {
+            for (int i = 0; valves != null && i < valves.length; i++) {
                 if (valves[i] instanceof GlassFishSingleSignOn) {
-                    sso = (GlassFishSingleSignOn)valves[i];
+                    sso = (GlassFishSingleSignOn) valves[i];
                     break;
                 }
             }
@@ -1445,8 +1338,7 @@
             }
 
             if (sso == null) {
-                SSOFactory ssoFactory =
-                    webContainerFeatureFactory.getSSOFactory();
+                SSOFactory ssoFactory = webContainerFeatureFactory.getSSOFactory();
                 sso = ssoFactory.createSingleSignOnValve(getName());
                 this.ssoFailoverEnabled = ssoFailoverEnabled;
                 setSingleSignOnForChildren(sso);
@@ -1456,17 +1348,17 @@
             // set max idle time if given
             Property idle = vsBean.getProperty(SSO_MAX_IDLE);
             if (idle != null && idle.getValue() != null) {
-                if (_logger.isLoggable(Level.FINE)) {
-                    _logger.log(Level.FINE, LogFacade.SSO_MAX_INACTIVE_SET, new Object[]{idle.getValue(), getID()});
+                if (_logger.isLoggable(FINE)) {
+                    _logger.log(FINE, SSO_MAX_INACTIVE_SET, new Object[] { idle.getValue(), getID() });
                 }
                 sso.setMaxInactive(Integer.parseInt(idle.getValue()));
             }
 
             // set expirer thread sleep time if given
             Property expireTime = vsBean.getProperty(SSO_REAP_INTERVAL);
-            if (expireTime !=null && expireTime.getValue() != null) {
-                if (_logger.isLoggable(Level.FINE)) {
-                    _logger.log(Level.FINE, LogFacade.SSO_REAP_INTERVAL_SET);
+            if (expireTime != null && expireTime.getValue() != null) {
+                if (_logger.isLoggable(FINE)) {
+                    _logger.log(FINE, SSO_REAP_INTERVAL_SET);
                 }
                 sso.setReapInterval(Integer.parseInt(expireTime.getValue()));
             }
@@ -1479,14 +1371,11 @@
     /**
      * Configures this VirtualServer with its state (on | off | disabled).
      */
-    void configureState(){
+    void configureState() {
         String stateValue = vsBean.getState();
-        if (!stateValue.equalsIgnoreCase(ON) &&
-                getName().equalsIgnoreCase(
-                    org.glassfish.api.web.Constants.ADMIN_VS)){
+        if (!stateValue.equalsIgnoreCase(ON) && getName().equalsIgnoreCase(org.glassfish.api.web.Constants.ADMIN_VS)) {
             throw new IllegalArgumentException(
-                "virtual-server " + org.glassfish.api.web.Constants.ADMIN_VS +
-                " state property cannot be modified");
+                "virtual-server " + ADMIN_VS + " state property cannot be modified");
         }
 
         if (stateValue.equalsIgnoreCase(DISABLED)) {
@@ -1503,11 +1392,9 @@
     /**
      * Configures the Remote Address Filter valve of this VirtualServer.
      *
-     * This valve enforces request accpetance/denial based on the string
-     * representation of the remote client's IP address.
+     * This valve enforces request accpetance/denial based on the string representation of the remote client's IP address.
      */
     void configureRemoteAddressFilterValve() {
-
         Property allow = vsBean.getProperty("allowRemoteAddress");
         Property deny = vsBean.getProperty("denyRemoteAddress");
         String allowStr = null;
@@ -1525,27 +1412,25 @@
     /**
      * Configures the Remote Address Filter valve of this VirtualServer.
      *
-     * This valve enforces request accpetance/denial based on the string
-     * representation of the remote client's IP address.
+     * This valve enforces request accpetance/denial based on the string representation of the remote client's IP address.
      */
     protected void configureRemoteAddressFilterValve(String allow, String deny) {
-
         RemoteAddrValve remoteAddrValve = null;
 
-        if (allow != null || deny != null)  {
+        if (allow != null || deny != null) {
             remoteAddrValve = new RemoteAddrValve();
         }
 
         if (allow != null) {
-            if (_logger.isLoggable(Level.FINE)) {
-                _logger.log(Level.FINE, LogFacade.ALLOW_ACCESS, new Object[]{getID(), allow});
+            if (_logger.isLoggable(FINE)) {
+                _logger.log(FINE, ALLOW_ACCESS, new Object[] { getID(), allow });
             }
             remoteAddrValve.setAllow(allow);
         }
 
         if (deny != null) {
-            if (_logger.isLoggable(Level.FINE)) {
-                _logger.log(Level.FINE, LogFacade.DENY_ACCESS, new Object[]{getID(), deny});
+            if (_logger.isLoggable(FINE)) {
+                _logger.log(FINE, DENY_ACCESS, new Object[] { getID(), deny });
             }
             remoteAddrValve.setDeny(deny);
         }
@@ -1553,7 +1438,7 @@
         if (remoteAddrValve != null) {
             // Remove existing RemoteAddrValve (if any), in case of a reconfig
             GlassFishValve[] valves = getValves();
-            for (int i=0; valves!=null && i<valves.length; i++) {
+            for (int i = 0; valves != null && i < valves.length; i++) {
                 if (valves[i] instanceof RemoteAddrValve) {
                     removeValve(valves[i]);
                     break;
@@ -1566,48 +1451,46 @@
     /**
      * Configures the Remote Host Filter valve of this VirtualServer.
      *
-     * This valve enforces request acceptance/denial based on the name of the
-     * remote host from where the request originated.
+     * This valve enforces request acceptance/denial based on the name of the remote host from where the request originated.
      */
     void configureRemoteHostFilterValve() {
-
         Property allow = vsBean.getProperty("allowRemoteHost");
         Property deny = vsBean.getProperty("denyRemoteHost");
         String allowStr = null;
         String denyStr = null;
+
         if (allow != null) {
             allowStr = allow.getValue();
         }
         if (deny != null) {
             denyStr = deny.getValue();
         }
-        configureRemoteHostFilterValve(allowStr, denyStr);
 
+        configureRemoteHostFilterValve(allowStr, denyStr);
     }
 
     void configureRemoteHostFilterValve(String allow, String deny) {
-
         RemoteHostValve remoteHostValve = null;
 
-        if (allow != null || deny != null)  {
+        if (allow != null || deny != null) {
             remoteHostValve = new RemoteHostValve();
         }
         if (allow != null) {
-            if (_logger.isLoggable(Level.FINE)) {
-                _logger.log(Level.FINE, LogFacade.ALLOW_ACCESS, new Object[]{getID(), allow});
+            if (_logger.isLoggable(FINE)) {
+                _logger.log(FINE, ALLOW_ACCESS, new Object[] { getID(), allow });
             }
             remoteHostValve.setAllow(allow);
         }
         if (deny != null) {
-            if (_logger.isLoggable(Level.FINE)) {
-                _logger.log(Level.FINE, LogFacade.DENY_ACCESS, new Object[]{getID(), deny});
+            if (_logger.isLoggable(FINE)) {
+                _logger.log(FINE, DENY_ACCESS, new Object[] { getID(), deny });
             }
             remoteHostValve.setDeny(deny);
         }
         if (remoteHostValve != null) {
             // Remove existing RemoteHostValve (if any), in case of a reconfig
             GlassFishValve[] valves = getValves();
-            for (int i=0; valves!=null && i<valves.length; i++) {
+            for (int i = 0; valves != null && i < valves.length; i++) {
                 if (valves[i] instanceof RemoteHostValve) {
                     removeValve(valves[i]);
                     break;
@@ -1629,7 +1512,7 @@
                         if (grizzlyListener.isAjpEnabled()) {
                             continue;
                         }
-                        _logger.log(Level.SEVERE, LogFacade.CODE_FILTERS_NULL, new Object[] {listener.getName(), codecFilters});
+                        _logger.log(SEVERE, CODE_FILTERS_NULL, new Object[] { listener.getName(), codecFilters });
                     } else {
                         for (HttpCodecFilter codecFilter : codecFilters) {
                             if (codecFilter.getMonitoringConfig().getProbes().length == 0) {
@@ -1658,49 +1541,40 @@
                     });
 
                 } else {
-                    _logger.log(Level.SEVERE, LogFacade.PROXY_NULL, new Object[] {listener.getName()});
+                    _logger.log(SEVERE, LogFacade.PROXY_NULL, new Object[] { listener.getName() });
                 }
 
             } catch (Exception ex) {
-                _logger.log(Level.SEVERE, LogFacade.ADD_HTTP_PROBES_ERROR, ex);
+                _logger.log(SEVERE, LogFacade.ADD_HTTP_PROBES_ERROR, ex);
             }
         }
     }
 
-
     /**
-     * Reconfigures the access log of this VirtualServer with its
-     * updated access log related properties.
+     * Reconfigures the access log of this VirtualServer with its updated access log related properties.
      */
-    void reconfigureAccessLog(String globalAccessLogBufferSize,
-                              String globalAccessLogWriteInterval,
-                              ServiceLocator services,
-                              Domain domain,
-                              boolean globalAccessLoggingEnabled) {
+    void reconfigureAccessLog(String globalAccessLogBufferSize, String globalAccessLogWriteInterval, ServiceLocator services, Domain domain, boolean globalAccessLoggingEnabled) {
         try {
             if (accessLogValve.isStarted()) {
                 accessLogValve.stop();
             }
-            boolean start = accessLogValve.updateVirtualServerProperties(
-                vsBean.getId(), vsBean, domain, services,
-                globalAccessLogBufferSize, globalAccessLogWriteInterval);
+            boolean start = accessLogValve.updateVirtualServerProperties(vsBean.getId(), vsBean, domain, services,
+                    globalAccessLogBufferSize, globalAccessLogWriteInterval);
             if (start && isAccessLoggingEnabled(globalAccessLoggingEnabled)) {
                 enableAccessLogging();
             } else {
                 disableAccessLogging();
             }
         } catch (LifecycleException le) {
-            _logger.log(Level.SEVERE, LogFacade.UNABLE_RECONFIGURE_ACCESS_LOG, le);
+            _logger.log(SEVERE, UNABLE_RECONFIGURE_ACCESS_LOG, le);
         }
     }
 
     /**
-     * Reconfigures the access log of this VirtualServer with the
-     * updated attributes of the access-log element from domain.xml.
+     * Reconfigures the access log of this VirtualServer with the updated attributes of the access-log element from
+     * domain.xml.
      */
-    void reconfigureAccessLog(
-            HttpService httpService,
-            WebContainerFeatureFactory webcontainerFeatureFactory) {
+    void reconfigureAccessLog(HttpService httpService, WebContainerFeatureFactory webcontainerFeatureFactory) {
 
         try {
             boolean restart = false;
@@ -1708,9 +1582,7 @@
                 accessLogValve.stop();
                 restart = true;
             }
-            accessLogValve.updateAccessLogAttributes(
-                httpService,
-                webcontainerFeatureFactory);
+            accessLogValve.updateAccessLogAttributes(httpService, webcontainerFeatureFactory);
             if (restart) {
                 accessLogValve.start();
                 for (HttpProbeImpl p : getHttpProbeImpl()) {
@@ -1718,7 +1590,7 @@
                 }
             }
         } catch (LifecycleException le) {
-            _logger.log(Level.SEVERE, LogFacade.UNABLE_RECONFIGURE_ACCESS_LOG, le);
+            _logger.log(SEVERE, UNABLE_RECONFIGURE_ACCESS_LOG, le);
         }
     }
 
@@ -1730,9 +1602,8 @@
     }
 
     /**
-     * Enables access logging for this virtual server, by adding its
-     * accesslog valve to its pipeline, or starting its accesslog valve
-     * if it is already present in the pipeline.
+     * Enables access logging for this virtual server, by adding its accesslog valve to its pipeline, or starting its
+     * accesslog valve if it is already present in the pipeline.
      */
     void enableAccessLogging() {
         if (!isAccessLogValveActivated()) {
@@ -1747,35 +1618,32 @@
                     p.enableAccessLogging();
                 }
             } catch (LifecycleException le) {
-                _logger.log(Level.SEVERE, LogFacade.UNABLE_RECONFIGURE_ACCESS_LOG, le);
+                _logger.log(SEVERE, UNABLE_RECONFIGURE_ACCESS_LOG, le);
             }
         }
     }
 
     /**
-     * Disables access logging for this virtual server, by removing its
-     * accesslog valve from its pipeline.
+     * Disables access logging for this virtual server, by removing its accesslog valve from its pipeline.
      */
     void disableAccessLogging() {
         removeValve(accessLogValve);
-        for (HttpProbeImpl p : getHttpProbeImpl()) {
-            p.disableAccessLogging();
+        for (HttpProbeImpl httpProbe : getHttpProbeImpl()) {
+            httpProbe.disableAccessLogging();
         }
     }
 
     /**
-     * @return true if the accesslog valve of this virtual server has been
-     * activated, that is, added to this virtual server's pipeline; false
-     * otherwise
+     * @return true if the accesslog valve of this virtual server has been activated, that is, added to this virtual
+     * server's pipeline; false otherwise
      */
     private boolean isAccessLogValveActivated() {
-
-        Pipeline p = getPipeline();
-        if (p != null) {
-            GlassFishValve[] valves = p.getValves();
+        Pipeline pipeline = getPipeline();
+        if (pipeline != null) {
+            GlassFishValve[] valves = pipeline.getValves();
             if (valves != null) {
-                for (int i=0; i<valves.length; i++) {
-                    if (valves[i] instanceof PEAccessLogValve) {
+                for (GlassFishValve element : valves) {
+                    if (element instanceof PEAccessLogValve) {
                         return true;
                     }
                 }
@@ -1788,7 +1656,7 @@
     /**
      * Configures the cache control of this VirtualServer
      */
-    void configureCacheControl(String cacheControl){
+    void configureCacheControl(String cacheControl) {
         if (cacheControl != null) {
             List<String> values = StringUtils.parseStringList(cacheControl, ",");
             if (values != null && !values.isEmpty()) {
@@ -1807,17 +1675,17 @@
         if (vsBean != null) {
             ssoEnabled = vsBean.getSsoEnabled();
         }
-        return "inherit".equals(ssoEnabled) && globalSSOEnabled
-            || ConfigBeansUtilities.toBoolean(ssoEnabled);
+
+        return "inherit".equals(ssoEnabled) && globalSSOEnabled || ConfigBeansUtilities.toBoolean(ssoEnabled);
     }
 
     private void setSingleSignOnForChildren(SingleSignOn sso) {
         for (Container container : findChildren()) {
             if (container instanceof StandardContext) {
-                StandardContext context = (StandardContext)container;
-                for (GlassFishValve valve: context.getValves()) {
+                StandardContext context = (StandardContext) container;
+                for (GlassFishValve valve : context.getValves()) {
                     if (valve instanceof AuthenticatorBase) {
-                        ((AuthenticatorBase)valve).setSingleSignOn(sso);
+                        ((AuthenticatorBase) valve).setSingleSignOn(sso);
                         break;
                     }
                 }
@@ -1828,41 +1696,34 @@
     /**
      * Determines whether access logging is enabled for this virtual server.
      *
-     * @param globalAccessLoggingEnabled The value of the
-     * accessLoggingEnabled property of the http-service element
+     * @param globalAccessLoggingEnabled The value of the accessLoggingEnabled property of the http-service element
      *
-     * @return true if access logging is enabled for this virtual server,
-     * false otherwise.
+     * @return true if access logging is enabled for this virtual server, false otherwise.
      */
     boolean isAccessLoggingEnabled(boolean globalAccessLoggingEnabled) {
         String enabled = vsBean.getAccessLoggingEnabled();
-        return "inherit".equals(enabled) && globalAccessLoggingEnabled ||
-            ConfigBeansUtilities.toBoolean(enabled);
+        return "inherit".equals(enabled) && globalAccessLoggingEnabled || ConfigBeansUtilities.toBoolean(enabled);
     }
 
     @Override
     public void setRealm(Realm realm) {
         if ((realm != null) && !(realm instanceof RealmAdapter)) {
-            _logger.log(Level.SEVERE, LogFacade.IGNORE_INVALID_REALM,
-                    new Object[] { realm.getClass().getName(),
-                        RealmAdapter.class.getName()});
+            _logger.log(SEVERE, IGNORE_INVALID_REALM,
+                    new Object[] { realm.getClass().getName(), RealmAdapter.class.getName() });
         } else {
             super.setRealm(realm);
         }
     }
 
     /**
-     * Configures the security level of the SSO cookie for this virtual
-     * server, based on the value of its sso-cookie-secure attribute
+     * Configures the security level of the SSO cookie for this virtual server, based on the value of its sso-cookie-secure
+     * attribute
      */
     private void configureSingleSignOnCookieSecure() {
         String cookieSecure = vsBean.getSsoCookieSecure();
-        if (!"true".equalsIgnoreCase(cookieSecure) &&
-                !"false".equalsIgnoreCase(cookieSecure) &&
-                !cookieSecure.equalsIgnoreCase(
-                    SessionCookieConfig.DYNAMIC_SECURE)) {
-            _logger.log(Level.WARNING, LogFacade.INVALID_SSO_COOKIE_SECURE,
-                        new Object[] {cookieSecure, getID()});
+        if (!"true".equalsIgnoreCase(cookieSecure) && !"false".equalsIgnoreCase(cookieSecure)
+                && !cookieSecure.equalsIgnoreCase(SessionCookieConfig.DYNAMIC_SECURE)) {
+            _logger.log(WARNING, LogFacade.INVALID_SSO_COOKIE_SECURE, new Object[] { cookieSecure, getID() });
         } else {
             ssoCookieSecure = cookieSecure;
         }
@@ -1875,14 +1736,13 @@
     /**
      * Configures the error report valve of this VirtualServer.
      *
-     * <p>The error report valve of a virtual server is specified through
-     * a property with name <i>errorReportValve</i>, whose value is the
-     * valve's fully qualified classname. A null or empty classname
-     * disables the error report valve and therefore the container's
-     * default error page mechanism for error responses.
+     * <p>
+     * The error report valve of a virtual server is specified through a property with name <i>errorReportValve</i>, whose
+     * value is the valve's fully qualified classname. A null or empty classname disables the error report valve and
+     * therefore the container's default error page mechanism for error responses.
      */
     void configureErrorReportValve() {
-        Property prop = vsBean.getProperty(Constants.ERROR_REPORT_VALVE);
+        Property prop = vsBean.getProperty(ERROR_REPORT_VALVE);
         if (prop != null) {
             setErrorReportValveClass(prop.getValue());
         }
@@ -1907,15 +1767,13 @@
     // ----------------------------------------------------- embedded methods
 
 
-    private VirtualServerConfig config;
-
-    private List<WebListener> listeners = new ArrayList<WebListener>();
 
     /**
      * Sets the docroot of this <tt>VirtualServer</tt>.
      *
      * @param docRoot the docroot of this <tt>VirtualServer</tt>.
      */
+    @Override
     public void setDocRoot(File docRoot) {
         this.setAppBase(docRoot.getPath());
     }
@@ -1923,46 +1781,44 @@
     /**
      * Gets the docroot of this <tt>VirtualServer</tt>.
      */
+    @Override
     public File getDocRoot() {
         return new File(getAppBase());
     }
 
     /**
-     * Sets the collection of <tt>WebListener</tt> instances from which
-     * this <tt>VirtualServer</tt> receives requests.
+     * Sets the collection of <tt>WebListener</tt> instances from which this <tt>VirtualServer</tt> receives requests.
      *
-     * @param webListeners the collection of <tt>WebListener</tt> instances from which
-     * this <tt>VirtualServer</tt> receives requests.
+     * @param webListeners the collection of <tt>WebListener</tt> instances from which this <tt>VirtualServer</tt> receives
+     * requests.
      */
-    public void setWebListeners(WebListener...  webListeners) {
+    public void setWebListeners(WebListener... webListeners) {
         if (webListeners != null) {
             listeners = Arrays.asList(webListeners);
         }
     }
 
     /**
-     * Gets the collection of <tt>WebListener</tt> instances from which
-     * this <tt>VirtualServer</tt> receives requests.
+     * Gets the collection of <tt>WebListener</tt> instances from which this <tt>VirtualServer</tt> receives requests.
      *
-     * @return the collection of <tt>WebListener</tt> instances from which
-     * this <tt>VirtualServer</tt> receives requests.
+     * @return the collection of <tt>WebListener</tt> instances from which this <tt>VirtualServer</tt> receives requests.
      */
+    @Override
     public Collection<WebListener> getWebListeners() {
         return listeners;
     }
 
     /**
-     * Registers the given <tt>Context</tt> with this <tt>VirtualServer</tt>
-     * at the given context root.
+     * Registers the given <tt>Context</tt> with this <tt>VirtualServer</tt> at the given context root.
      *
-     * <p>If this <tt>VirtualServer</tt> has already been started, the
-     * given <tt>context</tt> will be started as well.
+     * <p>
+     * If this <tt>VirtualServer</tt> has already been started, the given <tt>context</tt> will be started as well.
      */
-    public void addContext(Context context, String contextRoot)
-        throws ConfigException, GlassFishException {
+    @Override
+    public void addContext(Context context, String contextRoot) throws ConfigException, GlassFishException {
 
-        if (_logger.isLoggable(Level.FINE)) {
-           _logger.log(Level.FINE, LogFacade.VS_ADDED_CONTEXT);
+        if (_logger.isLoggable(FINE)) {
+            _logger.log(FINE, LogFacade.VS_ADDED_CONTEXT);
         }
 
         if (!(context instanceof ContextFacade)) {
@@ -1971,21 +1827,23 @@
         }
 
         if (!contextRoot.startsWith("/")) {
-            contextRoot = "/"+contextRoot;
+            contextRoot = "/" + contextRoot;
         }
         ExtendedDeploymentContext deploymentContext = null;
 
         try {
-            if (factory==null)
+            if (factory == null) {
                 factory = services.getService(ArchiveFactory.class);
+            }
 
             ContextFacade facade = (ContextFacade) context;
             File docRoot = facade.getDocRoot();
             ClassLoader classLoader = facade.getClassLoader();
             ReadableArchive archive = factory.openArchive(docRoot);
 
-            if (report==null)
+            if (report == null) {
                 report = new PlainTextActionReporter();
+            }
 
             ServerEnvironment env = services.getService(ServerEnvironment.class);
 
@@ -1996,14 +1854,14 @@
             params.virtualservers = getName();
             params.target = "server";
 
-            ExtendedDeploymentContext initialContext =
-                    new DeploymentContextImpl(report, archive, params, env);
+            ExtendedDeploymentContext initialContext = new DeploymentContextImpl(report, archive, params, env);
 
-            if (deployment==null)
+            if (deployment == null) {
                 deployment = services.getService(Deployment.class);
+            }
 
             ArchiveHandler archiveHandler = deployment.getArchiveHandler(archive);
-            if (archiveHandler==null) {
+            if (archiveHandler == null) {
                 throw new RuntimeException("Cannot find archive handler for source archive");
             }
 
@@ -2013,37 +1871,35 @@
             ApplicationInfo appInfo = deployment.get(params.name);
             ApplicationRef appRef = domain.getApplicationRefInServer(params.target, params.name);
 
-            if (appInfo!=null && appRef!=null) {
+            if (appInfo != null && appRef != null) {
                 if (appRef.getVirtualServers().contains(getName())) {
-                    throw new ConfigException(
-                            "Context with name "+params.name+" is already registered on virtual server "+getName());
+                    throw new ConfigException("Context with name " + params.name + " is already registered on virtual server " + getName());
                 } else {
                     String virtualServers = appRef.getVirtualServers();
-                    virtualServers = virtualServers + ","+getName();
+                    virtualServers = virtualServers + "," + getName();
                     params.virtualservers = virtualServers;
                     params.force = Boolean.TRUE;
-                    if (_logger.isLoggable(Level.FINE)) {
-                        _logger.log(Level.FINE, "Virtual server "+getName()+" added to context "+params.name);
+                    if (_logger.isLoggable(FINE)) {
+                        _logger.log(FINE, "Virtual server " + getName() + " added to context " + params.name);
                     }
                     return;
                 }
             }
 
-            deploymentContext = deployment.getBuilder(
-                    _logger, params, report).source(archive).archiveHandler(
-                    archiveHandler).build(initialContext);
+            deploymentContext = deployment.getBuilder(_logger, params, report).source(archive).archiveHandler(archiveHandler)
+                    .build(initialContext);
 
             Properties properties = new Properties();
             deploymentContext.getAppProps().putAll(properties);
 
             if (classLoader != null) {
-                ClassLoader parentCL = clh.createApplicationParentCL(classLoader, deploymentContext);
+                ClassLoader parentCL = classLoaderHierarchy.createApplicationParentCL(classLoader, deploymentContext);
                 ClassLoader cl = archiveHandler.getClassLoader(parentCL, deploymentContext);
                 deploymentContext.setClassLoader(cl);
             }
 
-            ApplicationConfigInfo savedAppConfig =
-                    new ApplicationConfigInfo(apps.getModule(com.sun.enterprise.config.serverbeans.Application.class, params.name));
+            ApplicationConfigInfo savedAppConfig = new ApplicationConfigInfo(
+                    apps.getModule(com.sun.enterprise.config.serverbeans.Application.class, params.name));
 
             Properties appProps = deploymentContext.getAppProps();
             String appLocation = DeploymentUtils.relativizeWithinDomainIfPossible(deploymentContext.getSource().getURI());
@@ -2057,10 +1913,10 @@
             Transaction t = deployment.prepareAppConfigChanges(deploymentContext);
             appInfo = deployment.deploy(deploymentContext);
 
-            if (appInfo!=null) {
+            if (appInfo != null) {
                 facade.setAppName(appInfo.getName());
-                if (_logger.isLoggable(Level.FINE)) {
-                    _logger.log(Level.FINE, LogFacade.VS_ADDED_CONTEXT, new Object[]{getName(), appInfo.getName()});
+                if (_logger.isLoggable(FINE)) {
+                    _logger.log(FINE, LogFacade.VS_ADDED_CONTEXT, new Object[] { getName(), appInfo.getName() });
                 }
                 deployment.registerAppInDomainXML(appInfo, deploymentContext, t);
             } else {
@@ -2080,15 +1936,14 @@
                 }
                 updateWebXml(facade, file);
             } else {
-                _logger.log(Level.SEVERE, LogFacade.APP_NOT_FOUND);
+                _logger.log(SEVERE, LogFacade.APP_NOT_FOUND);
             }
 
             ReadableArchive source = appInfo.getSource();
             UndeployCommandParameters undeployParams = new UndeployCommandParameters(params.name);
             undeployParams.origin = UndeployCommandParameters.Origin.undeploy;
             undeployParams.target = "server";
-            ExtendedDeploymentContext undeploymentContext =
-                    deployment.getBuilder(_logger, undeployParams, report).source(source).build();
+            ExtendedDeploymentContext undeploymentContext = deployment.getBuilder(_logger, undeployParams, report).source(source).build();
             deployment.undeploy(params.name, undeploymentContext);
 
             params.origin = DeployCommandParameters.Origin.load;
@@ -2097,7 +1952,7 @@
             deploymentContext = deployment.getBuilder(_logger, params, report).source(archive).build();
 
             if (classLoader != null) {
-                ClassLoader parentCL = clh.createApplicationParentCL(classLoader, deploymentContext);
+                ClassLoader parentCL = classLoaderHierarchy.createApplicationParentCL(classLoader, deploymentContext);
                 archiveHandler = deployment.getArchiveHandler(archive);
                 ClassLoader cl = archiveHandler.getClassLoader(parentCL, deploymentContext);
                 deploymentContext.setClassLoader(cl);
@@ -2109,15 +1964,15 @@
             // We can't use Deployment.enable since it doesn't take DeploymentContext with custom class loader
             deployment.updateAppEnabledAttributeInDomainXML(params.name, params.target, true);
 
-            if (_logger.isLoggable(Level.FINE)) {
-                _logger.log(Level.FINE, LogFacade.VS_ENABLED_CONTEXT, new Object[]{getName(), params.name()});
+            if (_logger.isLoggable(FINE)) {
+                _logger.log(FINE, LogFacade.VS_ENABLED_CONTEXT, new Object[] { getName(), params.name() });
             }
 
             if (delete) {
                 if (file != null) {
                     if (file.exists() && !file.delete()) {
                         String path = file.toString();
-                        _logger.log(Level.WARNING, LogFacade.UNABLE_TO_DELETE, path);
+                        _logger.log(WARNING, LogFacade.UNABLE_TO_DELETE, path);
                     }
                 }
             }
@@ -2133,7 +1988,7 @@
                     wm.setDefaultWebXml(config.getDefaultWebXml());
                 }
             } else {
-                throw new ConfigException("Deployed app not found "+contextRoot);
+                throw new ConfigException("Deployed app not found " + contextRoot);
             }
 
             if (deploymentContext != null) {
@@ -2141,7 +1996,7 @@
             }
 
         } catch (Exception ex) {
-            if (deployment!=null && deploymentContext!=null) {
+            if (deployment != null && deploymentContext != null) {
                 deploymentContext.clean();
             }
             throw new GlassFishException(ex);
@@ -2150,15 +2005,15 @@
     }
 
     /**
-     * Stops the given <tt>context</tt> and removes it from this
-     * <tt>VirtualServer</tt>.
+     * Stops the given <tt>context</tt> and removes it from this <tt>VirtualServer</tt>.
      */
+    @Override
     public void removeContext(Context context) throws GlassFishException {
         ActionReport report = services.getService(ActionReport.class, "plain");
         Deployment deployment = services.getService(Deployment.class);
         String name;
         if (context instanceof ContextFacade) {
-            name = ((ContextFacade)context).getAppName();
+            name = ((ContextFacade) context).getAppName();
         } else {
             name = context.getPath();
         }
@@ -2188,62 +2043,59 @@
             deployment.undeploy(name, deploymentContext);
             deployment.unregisterAppFromDomainXML(name, "server");
         } catch (IOException e) {
-            _logger.log(Level.SEVERE, LogFacade.REMOVE_CONTEXT_ERROR, e);
+            _logger.log(SEVERE, LogFacade.REMOVE_CONTEXT_ERROR, e);
             report.setActionExitCode(ActionReport.ExitCode.FAILURE);
             throw new GlassFishException("Cannot create context for undeployment ", e);
         } catch (TransactionFailure e) {
             throw new GlassFishException(e);
         } finally {
-            if (deploymentContext!=null) {
+            if (deploymentContext != null) {
                 deploymentContext.clean();
             }
         }
 
-        if (_logger.isLoggable(Level.FINE)) {
-            _logger.log(Level.FINE, LogFacade.REMOVED_CONTEXT, name);
+        if (_logger.isLoggable(FINE)) {
+            _logger.log(FINE, LogFacade.REMOVED_CONTEXT, name);
         }
     }
 
-
     /**
      * Finds the <tt>Context</tt> registered at the given context root.
      */
+    @Override
     public Context getContext(String contextRoot) {
         if (!contextRoot.startsWith("/")) {
-            contextRoot = "/"+contextRoot;
+            contextRoot = "/" + contextRoot;
         }
-        return (Context)findChild(contextRoot);
+        return (Context) findChild(contextRoot);
     }
 
     /**
-     * Gets the collection of <tt>Context</tt> instances registered with
-     * this <tt>VirtualServer</tt>.
+     * Gets the collection of <tt>Context</tt> instances registered with this <tt>VirtualServer</tt>.
      */
+    @Override
     public Collection<Context> getContexts() {
-        Collection<Context> ctxs = new ArrayList<Context>();
+        Collection<Context> ctxs = new ArrayList<>();
         for (Container container : findChildren()) {
             if (container instanceof Context) {
-                ctxs.add((Context)container);
+                ctxs.add((Context) container);
             }
         }
         return ctxs;
     }
 
     /**
-     * Reconfigures this <tt>VirtualServer</tt> with the given
-     * configuration.
+     * Reconfigures this <tt>VirtualServer</tt> with the given configuration.
      *
-     * <p>In order for the given configuration to take effect, this
-     * <tt>VirtualServer</tt> may be stopped and restarted.
+     * <p>
+     * In order for the given configuration to take effect, this <tt>VirtualServer</tt> may be stopped and restarted.
      */
-    public void setConfig(VirtualServerConfig config)
-        throws ConfigException {
+    @Override
+    public void setConfig(VirtualServerConfig config) throws ConfigException {
 
         this.config = config;
         configureSingleSignOn(config.isSsoEnabled(),
-                Globals.getDefaultHabitat().<PEWebContainerFeatureFactoryImpl>getService(
-                PEWebContainerFeatureFactoryImpl.class),
-                false);
+                Globals.getDefaultHabitat().<PEWebContainerFeatureFactoryImpl>getService(PEWebContainerFeatureFactoryImpl.class), false);
         if (config.isAccessLoggingEnabled()) {
             enableAccessLogging();
         } else {
@@ -2261,6 +2113,7 @@
     /**
      * Gets the current configuration of this <tt>VirtualServer</tt>.
      */
+    @Override
     public VirtualServerConfig getConfig() {
         return config;
     }
@@ -2268,9 +2121,9 @@
     @Override
     public synchronized void stop() throws LifecycleException {
         if (fileLoggerHandler != null) {
-           _logger.removeHandler(fileLoggerHandler);
-           close(fileLoggerHandler);
-           fileLoggerHandler = null;
+            _logger.removeHandler(fileLoggerHandler);
+            close(fileLoggerHandler);
+            fileLoggerHandler = null;
         }
         setLogger(_logger, "INFO");
 
@@ -2278,7 +2131,6 @@
     }
 
     public void updateWebXml(ContextFacade facade, File file) throws Exception {
-
         Map<String, String> servlets = facade.getAddedServlets();
         Map<String, String[]> mappings = facade.getServletMappings();
         List<String> listeners = facade.getListeners();
@@ -2287,8 +2139,8 @@
         Map<String, String> urlPatternFilterMappings = facade.getUrlPatternFilterMappings();
 
         if (!filters.isEmpty() || !listeners.isEmpty() || !servlets.isEmpty()) {
-            if (_logger.isLoggable(Level.FINE)) {
-                _logger.log(Level.FINE, LogFacade.MODIFYING_WEB_XML, file.getAbsolutePath());
+            if (_logger.isLoggable(FINE)) {
+                _logger.log(FINE, MODIFYING_WEB_XML, file.getAbsolutePath());
             }
 
             DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
@@ -2317,12 +2169,11 @@
             // Update <filter>
             for (Map.Entry entry : filters.entrySet()) {
                 NodeList filterList = doc.getElementsByTagName("filter-name");
-                for (int i=0; i<filterList.getLength(); i++) {
+                for (int i = 0; i < filterList.getLength(); i++) {
                     Node filterNode = filterList.item(i);
-                    if (entry.getKey().equals(filterNode.getTextContent()) &&
-                            filterNode.getParentNode().getNodeName().equals("filter")) {
+                    if (entry.getKey().equals(filterNode.getTextContent()) && filterNode.getParentNode().getNodeName().equals("filter")) {
                         NodeList children = filterNode.getParentNode().getChildNodes();
-                        for (int j=0; j<children.getLength(); j++) {
+                        for (int j = 0; j < children.getLength(); j++) {
                             Node filterClass = children.item(j);
                             if (filterClass.getNodeName().equals("filter-class")) {
                                 // If a filter with the given filter-name is already defined,
@@ -2342,8 +2193,7 @@
                     Element filterClass = doc.createElement("filter-class");
                     filterClass.setTextContent(entry.getValue().toString());
                     filter.appendChild(filterClass);
-                    Map<String, String> initParams =
-                            facade.getFilterRegistration(entry.getKey().toString()).getInitParameters();
+                    Map<String, String> initParams = facade.getFilterRegistration(entry.getKey().toString()).getInitParameters();
                     if ((initParams != null) && (!initParams.isEmpty())) {
                         Element initParam = doc.createElement("init-param");
                         for (Map.Entry param : initParams.entrySet()) {
@@ -2388,12 +2238,12 @@
             // Update <servlet>
             for (Map.Entry entry : servlets.entrySet()) {
                 NodeList servletList = doc.getElementsByTagName("servlet-name");
-                for (int i=0; i<servletList.getLength(); i++) {
+                for (int i = 0; i < servletList.getLength(); i++) {
                     Node servletNode = servletList.item(i);
-                    if (entry.getKey().equals(servletNode.getTextContent()) &&
-                            servletNode.getParentNode().getNodeName().equals("servlet")) {
+                    if (entry.getKey().equals(servletNode.getTextContent())
+                            && servletNode.getParentNode().getNodeName().equals("servlet")) {
                         NodeList children = servletNode.getParentNode().getChildNodes();
-                        for (int j=0; j<children.getLength(); j++) {
+                        for (int j = 0; j < children.getLength(); j++) {
                             Node servletClass = children.item(j);
                             if (servletClass.getNodeName().equals("servlet-class")) {
                                 // If a servlet with the given servlet-name is already defined,
@@ -2413,8 +2263,7 @@
                     Element servletClass = doc.createElement("servlet-class");
                     servletClass.setTextContent(entry.getValue().toString());
                     servlet.appendChild(servletClass);
-                    Map<String, String> initParams =
-                        facade.getServletRegistration(entry.getKey().toString()).getInitParameters();
+                    Map<String, String> initParams = facade.getServletRegistration(entry.getKey().toString()).getInitParameters();
                     if ((initParams != null) && (!initParams.isEmpty())) {
                         Element initParam = doc.createElement("init-param");
                         for (Map.Entry param : initParams.entrySet()) {
@@ -2436,12 +2285,12 @@
             // Update <servlet-mapping>
             for (Map.Entry mapping : mappings.entrySet()) {
                 NodeList servletList = doc.getElementsByTagName("servlet-name");
-                for (int i=0; i<servletList.getLength(); i++) {
+                for (int i = 0; i < servletList.getLength(); i++) {
                     Node servletNode = servletList.item(i);
-                    if (mapping.getKey().equals(servletNode.getTextContent()) &&
-                            servletNode.getParentNode().getNodeName().equals("servlet-mapping")) {
+                    if (mapping.getKey().equals(servletNode.getTextContent())
+                            && servletNode.getParentNode().getNodeName().equals("servlet-mapping")) {
                         NodeList children = servletNode.getParentNode().getChildNodes();
-                        for (int j=0; j<children.getLength(); j++) {
+                        for (int j = 0; j < children.getLength(); j++) {
                             Node urlPattern = children.item(j);
                             if (urlPattern.getNodeName().equals("url-pattern")) {
                                 // If any of the specified URL patterns are already mapped to a different Servlet,
@@ -2477,7 +2326,7 @@
             Transformer transformer = TransformerFactory.newInstance().newTransformer();
             transformer.setOutputProperty(OutputKeys.INDENT, "yes");
 
-            if (file!=null) {
+            if (file != null) {
                 DOMSource src = new DOMSource(doc);
                 StreamResult result = new StreamResult(file);
                 transformer.transform(src, result);
@@ -2486,18 +2335,13 @@
         }
     }
 
-
     private List<NetworkListener> getGrizzlyNetworkListeners() {
-        List<String> listenerList = StringUtils.parseStringList(
-                vsBean.getNetworkListeners(), ",");
-        String[] listeners = (listenerList != null) ?
-                listenerList.toArray(new String[listenerList.size()]) :
-                new String[0];
-        List<NetworkListener> networkListeners = new ArrayList<NetworkListener>();
+        List<String> listenerList = StringUtils.parseStringList(vsBean.getNetworkListeners(), ",");
+        String[] listeners = (listenerList != null) ? listenerList.toArray(new String[listenerList.size()]) : new String[0];
+        List<NetworkListener> networkListeners = new ArrayList<>();
 
         for (String listener : listeners) {
-            for (NetworkListener networkListener :
-                    serverConfig.getNetworkConfig().getNetworkListeners().getNetworkListener()) {
+            for (NetworkListener networkListener : serverConfig.getNetworkConfig().getNetworkListeners().getNetworkListener()) {
                 if (networkListener.getName().equals(listener)) {
                     networkListeners.add(networkListener);
                 }
@@ -2512,36 +2356,34 @@
         for (final NetworkListener listener : getGrizzlyNetworkListeners()) {
             final GrizzlyProxy proxy = (GrizzlyProxy) grizzlyService.lookupNetworkProxy(listener);
             if (proxy != null) {
-                 GenericGrizzlyListener grizzlyListener = (GenericGrizzlyListener) proxy.getUnderlyingListener();
-                 List<HttpCodecFilter> codecFilters = grizzlyListener.getFilters(HttpCodecFilter.class);
-                 if (codecFilters != null && !codecFilters.isEmpty()) {
-                     for (HttpCodecFilter codecFilter : codecFilters) {
-                         HttpProbe[] probes = codecFilter.getMonitoringConfig().getProbes();
-                         if (probes != null) {
-                             for (HttpProbe probe : probes) {
-                                 if (probe instanceof HttpProbeImpl) {
-                                     httpProbes.add((HttpProbeImpl)probe);
-                                 }
-                             }
-                         }
-                     }
-                 }
+                GenericGrizzlyListener grizzlyListener = (GenericGrizzlyListener) proxy.getUnderlyingListener();
+                List<HttpCodecFilter> codecFilters = grizzlyListener.getFilters(HttpCodecFilter.class);
+                if (codecFilters != null && !codecFilters.isEmpty()) {
+                    for (HttpCodecFilter codecFilter : codecFilters) {
+                        HttpProbe[] probes = codecFilter.getMonitoringConfig().getProbes();
+                        if (probes != null) {
+                            for (HttpProbe probe : probes) {
+                                if (probe instanceof HttpProbeImpl) {
+                                    httpProbes.add((HttpProbeImpl) probe);
+                                }
+                            }
+                        }
+                    }
+                }
             }
         }
 
         return httpProbes;
     }
 
-
     // ---------------------------------------------------------- Nested Classes
 
-
     private final class HttpProbeImpl extends HttpProbe.Adapter {
 
-        boolean accessLoggingEnabled = false;
-        NetworkListener listener = null;
+        boolean accessLoggingEnabled;
+        NetworkListener listener;
 
-        public HttpProbeImpl(NetworkListener listener, boolean accessLoggingEnabled)  {
+        public HttpProbeImpl(NetworkListener listener, boolean accessLoggingEnabled) {
             this.listener = listener;
             this.accessLoggingEnabled = accessLoggingEnabled;
         }
@@ -2565,32 +2407,30 @@
                     // 400 should be hardcoded since the response status isn't available for bad requests
                     responsePacket.setStatus(HttpStatus.BAD_REQUEST_400);
 
-                    org.glassfish.grizzly.http.server.Request request = org.glassfish.grizzly.http.server.Request.create();
-//                    org.glassfish.grizzly.http.server.Response response = org.glassfish.grizzly.http.server.Response.create();
-                    org.glassfish.grizzly.http.server.Response response = request.getResponse();
+                    org.glassfish.grizzly.http.server.Request grizzlyRequest = org.glassfish.grizzly.http.server.Request.create();
+                    org.glassfish.grizzly.http.server.Response grizzlyResponse = grizzlyRequest.getResponse();
 
-//                    request.initialize(response, requestPacket, FilterChainContext.create(connection), null);
-                    request.initialize(/*response,*/ requestPacket, FilterChainContext.create(connection), null);
-                    response.initialize(request, responsePacket, FilterChainContext.create(connection), null, null);
+                    grizzlyRequest.initialize(requestPacket, FilterChainContext.create(connection), null);
+                    grizzlyResponse.initialize(grizzlyRequest, responsePacket, FilterChainContext.create(connection), null, null);
 
-                    Response res = new Response();
-                    res.setCoyoteResponse(response);
+                    Response catalinaResponse = new Response();
+                    catalinaResponse.setCoyoteResponse(grizzlyResponse);
 
                     WebConnector connector = webContainer.getConnectorMap().get(listener.getName());
                     if (connector != null) {
-                        Request req = new Request();
-                        req.setCoyoteRequest(request);
-                        req.setConnector(connector);
+                        Request catalinaRequest = new Request();
+                        catalinaRequest.setGrizzlyRequest(grizzlyRequest);
+                        catalinaRequest.setConnector(connector);
                         try {
-                            accessLogValve.postInvoke(req, res);
+                            accessLogValve.postInvoke(catalinaRequest, catalinaResponse);
                         } catch (IOException ex) {
-                            _logger.log(Level.SEVERE, LogFacade.UNABLE_RECONFIGURE_ACCESS_LOG, ex);
+                            _logger.log(SEVERE, UNABLE_RECONFIGURE_ACCESS_LOG, ex);
                         }
                     } else {
-                        _logger.log(Level.SEVERE, LogFacade.UNABLE_RECONFIGURE_ACCESS_LOG);
+                        _logger.log(SEVERE, UNABLE_RECONFIGURE_ACCESS_LOG);
                     }
                 } else {
-                    _logger.log(Level.SEVERE, LogFacade.UNABLE_RECONFIGURE_ACCESS_LOG);
+                    _logger.log(SEVERE, UNABLE_RECONFIGURE_ACCESS_LOG);
                 }
             }
         }
@@ -2598,5 +2438,3 @@
     }
 
 }
-
-
diff --git a/nucleus/parent/pom.xml b/nucleus/parent/pom.xml
index 6e4cf82..ac84d55 100644
--- a/nucleus/parent/pom.xml
+++ b/nucleus/parent/pom.xml
@@ -122,7 +122,7 @@
         <!-- GlassFish Components -->
 
         <glassfish-corba.version>4.2.4</glassfish-corba.version>
-        <grizzly.version>4.0.0-M1</grizzly.version>
+        <grizzly.version>4.0.0-M2</grizzly.version>
         <grizzly.npn.version>2.0.0</grizzly.npn.version>
         <glassfish-management-api.version>3.2.3</glassfish-management-api.version>
         <pfl.version>4.1.2</pfl.version>
