Index: apache-tomcat-9.0.33-src/java/org/apache/catalina/connector/InputBuffer.java
===================================================================
--- apache-tomcat-9.0.33-src.orig/java/org/apache/catalina/connector/InputBuffer.java
+++ apache-tomcat-9.0.33-src/java/org/apache/catalina/connector/InputBuffer.java
@@ -389,10 +389,10 @@ public class InputBuffer extends Reader
         }
         int n = Math.min(to.remaining(), bb.remaining());
         int orgLimit = bb.limit();
-        bb.limit(bb.position() + n);
+        ((Buffer)bb).limit(bb.position() + n);
         to.put(bb);
-        bb.limit(orgLimit);
-        to.limit(to.position()).position(to.position() - n);
+        ((Buffer)bb).limit(orgLimit);
+        ((Buffer)to).limit(to.position()).position(to.position() - n);
         return n;
     }
 
@@ -488,11 +488,11 @@ public class InputBuffer extends Reader
         long nRead = 0;
         while (nRead < n) {
             if (cb.remaining() >= n) {
-                cb.position(cb.position() + (int) n);
+                ((Buffer)cb).position(cb.position() + (int) n);
                 nRead = n;
             } else {
                 nRead += cb.remaining();
-                cb.position(cb.limit());
+                ((Buffer)cb).position(cb.limit());
                 int nb = realReadChars();
                 if (nb < 0) {
                     break;
@@ -533,7 +533,7 @@ public class InputBuffer extends Reader
         } else {
             if ((cb.capacity() > (2 * size)) && (cb.remaining()) < (cb.position())) {
                 cb.compact();
-                cb.flip();
+                ((Buffer)cb).flip();
             }
         }
         readLimit = cb.position() + readAheadLimit + size;
@@ -554,7 +554,7 @@ public class InputBuffer extends Reader
                 markPos = -1;
                 throw new IOException();
             } else {
-                cb.position(markPos);
+                ((Buffer)cb).position(markPos);
             }
         } else {
             clear(bb);
@@ -672,10 +672,10 @@ public class InputBuffer extends Reader
 
         CharBuffer tmp = CharBuffer.allocate(newSize);
         int oldPosition = cb.position();
-        cb.position(0);
+        ((Buffer)cb).position(0);
         tmp.put(cb);
-        tmp.flip();
-        tmp.position(oldPosition);
+        ((Buffer)tmp).flip();
+        ((Buffer)tmp).position(oldPosition);
         cb = tmp;
         tmp = null;
     }
Index: apache-tomcat-9.0.33-src/java/org/apache/catalina/connector/OutputBuffer.java
===================================================================
--- apache-tomcat-9.0.33-src.orig/java/org/apache/catalina/connector/OutputBuffer.java
+++ apache-tomcat-9.0.33-src/java/org/apache/catalina/connector/OutputBuffer.java
@@ -761,10 +761,10 @@ public class OutputBuffer extends Writer
         int limit = bb.capacity();
         int fromLimit = from.limit();
         while (from.remaining() >= limit) {
-            from.limit(from.position() + limit);
+            ((Buffer)from).limit(from.position() + limit);
             realWriteBytes(from.slice());
-            from.position(from.limit());
-            from.limit(fromLimit);
+            ((Buffer)from).position(from.limit());
+            ((Buffer)from).limit(fromLimit);
         }
 
         if (from.remaining() > 0) {
Index: apache-tomcat-9.0.33-src/java/org/apache/catalina/tribes/transport/nio/NioReplicationTask.java
===================================================================
--- apache-tomcat-9.0.33-src.orig/java/org/apache/catalina/tribes/transport/nio/NioReplicationTask.java
+++ apache-tomcat-9.0.33-src/java/org/apache/catalina/tribes/transport/nio/NioReplicationTask.java
@@ -18,6 +18,7 @@
 package org.apache.catalina.tribes.transport.nio;
 import java.io.IOException;
 import java.net.SocketAddress;
+import java.nio.Buffer;
 import java.nio.ByteBuffer;
 import java.nio.channels.CancelledKeyException;
 import java.nio.channels.DatagramChannel;
@@ -80,7 +81,7 @@ public class NioReplicationTask extends
                 buffer = ByteBuffer.allocate(size);
             }
         } else {
-            buffer.clear();
+            ((Buffer)buffer).clear();
         }
         if (key == null) {
             return; // just in case
@@ -156,30 +157,30 @@ public class NioReplicationTask extends
         reader.access();
         ReadableByteChannel channel = (ReadableByteChannel) key.channel();
         int count=-1;
-        buffer.clear();         // make buffer empty
+        ((Buffer)buffer).clear();         // make buffer empty
         SocketAddress saddr = null;
 
         if (channel instanceof SocketChannel) {
             // loop while data available, channel is non-blocking
             while ((count = channel.read (buffer)) > 0) {
-                buffer.flip();      // make buffer readable
+                ((Buffer)buffer).flip();      // make buffer readable
                 if ( buffer.hasArray() )
                     reader.append(buffer.array(),0,count,false);
                 else
                     reader.append(buffer,count,false);
-                buffer.clear();     // make buffer empty
+                ((Buffer)buffer).clear();     // make buffer empty
                 //do we have at least one package?
                 if ( reader.hasPackage() ) break;
             }
         } else if (channel instanceof DatagramChannel) {
             DatagramChannel dchannel = (DatagramChannel)channel;
             saddr = dchannel.receive(buffer);
-            buffer.flip();      // make buffer readable
+            ((Buffer)buffer).flip();      // make buffer readable
             if ( buffer.hasArray() )
                 reader.append(buffer.array(),0,buffer.limit()-buffer.position(),false);
             else
                 reader.append(buffer,buffer.limit()-buffer.position(),false);
-            buffer.clear();     // make buffer empty
+            ((Buffer)buffer).clear();     // make buffer empty
             //did we get a package
             count = reader.hasPackage()?1:-1;
         }
Index: apache-tomcat-9.0.33-src/java/org/apache/catalina/tribes/transport/nio/NioSender.java
===================================================================
--- apache-tomcat-9.0.33-src.orig/java/org/apache/catalina/tribes/transport/nio/NioSender.java
+++ apache-tomcat-9.0.33-src/java/org/apache/catalina/tribes/transport/nio/NioSender.java
@@ -20,6 +20,7 @@ package org.apache.catalina.tribes.trans
 import java.io.EOFException;
 import java.io.IOException;
 import java.net.InetSocketAddress;
+import java.nio.Buffer;
 import java.nio.ByteBuffer;
 import java.nio.channels.DatagramChannel;
 import java.nio.channels.SelectionKey;
@@ -173,9 +174,9 @@ public class NioSender extends AbstractS
         if ( read == -1 ) throw new IOException(sm.getString("nioSender.unable.receive.ack"));
         //no data read
         else if ( read == 0 ) return false;
-        readbuf.flip();
+        ((Buffer)readbuf).flip();
         ackbuf.append(readbuf,read);
-        readbuf.clear();
+        ((Buffer)readbuf).clear();
         if (ackbuf.doesPackageExist() ) {
             byte[] ackcmd = ackbuf.extractDataPackage(true).getBytes();
             boolean ack = Arrays.equals(ackcmd,org.apache.catalina.tribes.transport.Constants.ACK_DATA);
@@ -225,12 +226,12 @@ public class NioSender extends AbstractS
         if ( readbuf == null ) {
             readbuf = getReadBuffer();
         } else {
-            readbuf.clear();
+            ((Buffer)readbuf).clear();
         }
         if ( writebuf == null ) {
             writebuf = getWriteBuffer();
         } else {
-            writebuf.clear();
+            ((Buffer)writebuf).clear();
         }
 
         if (isUdpBased()) {
@@ -317,8 +318,8 @@ public class NioSender extends AbstractS
         if ( isConnected() && readbuf == null) {
             readbuf = getReadBuffer();
         }
-        if ( readbuf != null ) readbuf.clear();
-        if ( writebuf != null ) writebuf.clear();
+        if ( readbuf != null ) ((Buffer)readbuf).clear();
+        if ( writebuf != null ) ((Buffer)writebuf).clear();
         current = null;
         ackbuf.clear();
         remaining = 0;
@@ -357,7 +358,7 @@ public class NioSender extends AbstractS
                 remaining = length;
                 ackbuf.clear();
                 if (writebuf != null) {
-                    writebuf.clear();
+                    ((Buffer)writebuf).clear();
                 } else {
                     writebuf = getBuffer(length);
                 }
@@ -367,7 +368,7 @@ public class NioSender extends AbstractS
 
                 // TODO use ByteBuffer.wrap to avoid copying the data.
                 writebuf.put(data,offset,length);
-                writebuf.flip();
+                ((Buffer)writebuf).flip();
                 if (isConnected()) {
                     if (isUdpBased())
                         dataChannel.register(getSelector(), SelectionKey.OP_WRITE, this);
Index: apache-tomcat-9.0.33-src/java/org/apache/coyote/ajp/AjpProcessor.java
===================================================================
--- apache-tomcat-9.0.33-src.orig/java/org/apache/coyote/ajp/AjpProcessor.java
+++ apache-tomcat-9.0.33-src/java/org/apache/coyote/ajp/AjpProcessor.java
@@ -21,6 +21,7 @@ import java.io.EOFException;
 import java.io.IOException;
 import java.io.InterruptedIOException;
 import java.net.InetAddress;
+import java.nio.Buffer;
 import java.nio.ByteBuffer;
 import java.security.NoSuchProviderException;
 import java.security.cert.CertificateFactory;
@@ -1260,7 +1261,7 @@ public class AjpProcessor extends Abstra
 
             responseMessage.reset();
             responseMessage.appendByte(Constants.JK_AJP13_SEND_BODY_CHUNK);
-            chunk.limit(chunk.position() + thisTime);
+            ((Buffer)chunk).limit(chunk.position() + thisTime);
             responseMessage.appendBytes(chunk);
             responseMessage.end();
             socketWrapper.write(blocking, responseMessage.getBuffer(), 0, responseMessage.getLen());
Index: apache-tomcat-9.0.33-src/java/org/apache/coyote/http11/filters/BufferedInputFilter.java
===================================================================
--- apache-tomcat-9.0.33-src.orig/java/org/apache/coyote/http11/filters/BufferedInputFilter.java
+++ apache-tomcat-9.0.33-src/java/org/apache/coyote/http11/filters/BufferedInputFilter.java
@@ -18,6 +18,7 @@
 package org.apache.coyote.http11.filters;
 
 import java.io.IOException;
+import java.nio.Buffer;
 import java.nio.BufferOverflowException;
 import java.nio.ByteBuffer;
 import java.nio.charset.StandardCharsets;
@@ -68,7 +69,7 @@ public class BufferedInputFilter impleme
     public void setLimit(int limit) {
         if (buffered == null) {
             buffered = ByteBuffer.allocate(limit);
-            buffered.flip();
+            ((Buffer)buffered).flip();
         }
     }
 
@@ -84,9 +85,9 @@ public class BufferedInputFilter impleme
         // save off the Request body
         try {
             while (buffer.doRead(this) >= 0) {
-                buffered.mark().position(buffered.limit()).limit(buffered.capacity());
+                ((Buffer)buffered).mark().position(buffered.limit()).limit(buffered.capacity());
                 buffered.put(tempRead);
-                buffered.limit(buffered.position()).reset();
+                ((Buffer)buffered).limit(buffered.position()).reset();
                 tempRead = null;
             }
         } catch(IOException | BufferOverflowException ioe) {
@@ -121,7 +122,7 @@ public class BufferedInputFilter impleme
             if (buffered.capacity() > 65536) {
                 buffered = null;
             } else {
-                buffered.position(0).limit(0);
+                ((Buffer)buffered).position(0).limit(0);
             }
         }
         hasRead = false;
Index: apache-tomcat-9.0.33-src/java/org/apache/coyote/http11/filters/ChunkedInputFilter.java
===================================================================
--- apache-tomcat-9.0.33-src.orig/java/org/apache/coyote/http11/filters/ChunkedInputFilter.java
+++ apache-tomcat-9.0.33-src/java/org/apache/coyote/http11/filters/ChunkedInputFilter.java
@@ -18,6 +18,7 @@ package org.apache.coyote.http11.filters
 
 import java.io.EOFException;
 import java.io.IOException;
+import java.nio.Buffer;
 import java.nio.ByteBuffer;
 import java.nio.charset.StandardCharsets;
 import java.util.Locale;
@@ -184,14 +185,14 @@ public class ChunkedInputFilter implemen
             if (readChunk != handler.getByteBuffer()) {
                 handler.setByteBuffer(readChunk.duplicate());
             }
-            readChunk.position(readChunk.limit());
+            ((Buffer)readChunk).position(readChunk.limit());
         } else {
             result = remaining;
             if (readChunk != handler.getByteBuffer()) {
                 handler.setByteBuffer(readChunk.duplicate());
                 handler.getByteBuffer().limit(readChunk.position() + remaining);
             }
-            readChunk.position(readChunk.position() + remaining);
+            ((Buffer)readChunk).position(readChunk.position() + remaining);
             remaining = 0;
             //we need a CRLF
             if ((readChunk.position() + 1) >= readChunk.limit()) {
@@ -263,7 +264,7 @@ public class ChunkedInputFilter implemen
     public void recycle() {
         remaining = 0;
         if (readChunk != null) {
-            readChunk.position(0).limit(0);
+            ((Buffer)readChunk).position(0).limit(0);
         }
         endChunk = false;
         needCRLFParse = false;
@@ -363,7 +364,7 @@ public class ChunkedInputFilter implemen
 
             // Parsing the CRLF increments pos
             if (!eol) {
-                readChunk.position(readChunk.position() + 1);
+                ((Buffer)readChunk).position(readChunk.position() + 1);
             }
         }
 
@@ -415,7 +416,7 @@ public class ChunkedInputFilter implemen
                 throwIOException(sm.getString("chunkedInputFilter.invalidCrlf"));
             }
 
-            readChunk.position(readChunk.position() + 1);
+            ((Buffer)readChunk).position(readChunk.position() + 1);
         }
     }
 
@@ -484,7 +485,7 @@ public class ChunkedInputFilter implemen
                 trailingHeaders.append(chr);
             }
 
-            readChunk.position(readChunk.position() + 1);
+            ((Buffer)readChunk).position(readChunk.position() + 1);
 
         }
         int colonPos = trailingHeaders.getEnd();
@@ -513,7 +514,7 @@ public class ChunkedInputFilter implemen
 
                 chr = readChunk.get(readChunk.position());
                 if ((chr == Constants.SP) || (chr == Constants.HT)) {
-                    readChunk.position(readChunk.position() + 1);
+                    ((Buffer)readChunk).position(readChunk.position() + 1);
                     // If we swallow whitespace, make sure it counts towards the
                     // limit placed on trailing header size
                     int newlimit = trailingHeaders.getLimit() -1;
@@ -549,7 +550,7 @@ public class ChunkedInputFilter implemen
                 }
 
                 if (!eol) {
-                    readChunk.position(readChunk.position() + 1);
+                    ((Buffer)readChunk).position(readChunk.position() + 1);
                 }
             }
 
Index: apache-tomcat-9.0.33-src/java/org/apache/coyote/http11/filters/ChunkedOutputFilter.java
===================================================================
--- apache-tomcat-9.0.33-src.orig/java/org/apache/coyote/http11/filters/ChunkedOutputFilter.java
+++ apache-tomcat-9.0.33-src/java/org/apache/coyote/http11/filters/ChunkedOutputFilter.java
@@ -18,6 +18,7 @@ package org.apache.coyote.http11.filters
 
 import java.io.IOException;
 import java.io.OutputStreamWriter;
+import java.nio.Buffer;
 import java.nio.ByteBuffer;
 import java.nio.charset.StandardCharsets;
 import java.util.HashSet;
@@ -106,12 +107,12 @@ public class ChunkedOutputFilter impleme
 
         int pos = calculateChunkHeader(result);
 
-        chunkHeader.position(pos).limit(10);
+        ((Buffer)chunkHeader).position(pos).limit(10);
         buffer.doWrite(chunkHeader);
 
         buffer.doWrite(chunk);
 
-        chunkHeader.position(8).limit(10);
+        ((Buffer)chunkHeader).position(8).limit(10);
         buffer.doWrite(chunkHeader);
 
         return result;
@@ -171,10 +172,10 @@ public class ChunkedOutputFilter impleme
         if (trailerFields == null) {
             // Write end chunk
             buffer.doWrite(endChunk);
-            endChunk.position(0).limit(endChunk.capacity());
+            ((Buffer)endChunk).position(0).limit(endChunk.capacity());
         } else {
             buffer.doWrite(lastChunk);
-            lastChunk.position(0).limit(lastChunk.capacity());
+            ((Buffer)lastChunk).position(0).limit(lastChunk.capacity());
 
            ByteArrayOutputStream baos = new ByteArrayOutputStream(1024);
            OutputStreamWriter osw = new OutputStreamWriter(baos, StandardCharsets.ISO_8859_1);
@@ -194,7 +195,7 @@ public class ChunkedOutputFilter impleme
             buffer.doWrite(ByteBuffer.wrap(baos.toByteArray()));
 
             buffer.doWrite(crlfChunk);
-            crlfChunk.position(0).limit(crlfChunk.capacity());
+            ((Buffer)crlfChunk).position(0).limit(crlfChunk.capacity());
         }
         buffer.end();
     }
Index: apache-tomcat-9.0.33-src/java/org/apache/coyote/http11/filters/IdentityInputFilter.java
===================================================================
--- apache-tomcat-9.0.33-src.orig/java/org/apache/coyote/http11/filters/IdentityInputFilter.java
+++ apache-tomcat-9.0.33-src/java/org/apache/coyote/http11/filters/IdentityInputFilter.java
@@ -18,6 +18,7 @@
 package org.apache.coyote.http11.filters;
 
 import java.io.IOException;
+import java.nio.Buffer;
 import java.nio.ByteBuffer;
 import java.nio.charset.StandardCharsets;
 
@@ -104,7 +105,7 @@ public class IdentityInputFilter impleme
                     // The chunk is longer than the number of bytes remaining
                     // in the body; changing the chunk length to the number
                     // of bytes remaining
-                    handler.getByteBuffer().limit(handler.getByteBuffer().position() + (int) remaining);
+                    ((Buffer)(handler.getByteBuffer())).limit(handler.getByteBuffer().position() + (int) remaining);
                     result = (int) remaining;
                 } else {
                     result = nRead;
@@ -116,7 +117,7 @@ public class IdentityInputFilter impleme
                 // No more bytes left to be read : return -1 and clear the
                 // buffer
                 if (handler.getByteBuffer() != null) {
-                    handler.getByteBuffer().position(0).limit(0);
+                    ((Buffer)(handler.getByteBuffer())).position(0).limit(0);
                 }
                 result = -1;
             }
Index: apache-tomcat-9.0.33-src/java/org/apache/coyote/http11/filters/IdentityOutputFilter.java
===================================================================
--- apache-tomcat-9.0.33-src.orig/java/org/apache/coyote/http11/filters/IdentityOutputFilter.java
+++ apache-tomcat-9.0.33-src/java/org/apache/coyote/http11/filters/IdentityOutputFilter.java
@@ -17,6 +17,7 @@
 package org.apache.coyote.http11.filters;
 
 import java.io.IOException;
+import java.nio.Buffer;
 import java.nio.ByteBuffer;
 
 import org.apache.coyote.Response;
@@ -64,7 +65,7 @@ public class IdentityOutputFilter implem
                     // The chunk is longer than the number of bytes remaining
                     // in the body; changing the chunk length to the number
                     // of bytes remaining
-                    chunk.limit(chunk.position() + (int) remaining);
+                    ((Buffer)chunk).limit(chunk.position() + (int) remaining);
                     result = (int) remaining;
                     remaining = 0;
                 } else {
@@ -74,8 +75,8 @@ public class IdentityOutputFilter implem
             } else {
                 // No more bytes left to be written : return -1 and clear the
                 // buffer
-                chunk.position(0);
-                chunk.limit(0);
+                ((Buffer)chunk).position(0);
+                ((Buffer)chunk).limit(0);
                 result = -1;
             }
         } else {
Index: apache-tomcat-9.0.33-src/java/org/apache/coyote/http11/filters/SavedRequestInputFilter.java
===================================================================
--- apache-tomcat-9.0.33-src.orig/java/org/apache/coyote/http11/filters/SavedRequestInputFilter.java
+++ apache-tomcat-9.0.33-src/java/org/apache/coyote/http11/filters/SavedRequestInputFilter.java
@@ -18,6 +18,7 @@
 package org.apache.coyote.http11.filters;
 
 import java.io.IOException;
+import java.nio.Buffer;
 import java.nio.ByteBuffer;
 
 import org.apache.coyote.InputBuffer;
@@ -51,7 +52,7 @@ public class SavedRequestInputFilter imp
             return -1;
 
         ByteBuffer byteBuffer = handler.getByteBuffer();
-        byteBuffer.position(byteBuffer.limit()).limit(byteBuffer.capacity());
+        ((Buffer)byteBuffer).position(byteBuffer.limit()).limit(byteBuffer.capacity());
         input.subtract(byteBuffer);
 
         return byteBuffer.remaining();
Index: apache-tomcat-9.0.33-src/java/org/apache/coyote/http11/Http11InputBuffer.java
===================================================================
--- apache-tomcat-9.0.33-src.orig/java/org/apache/coyote/http11/Http11InputBuffer.java
+++ apache-tomcat-9.0.33-src/java/org/apache/coyote/http11/Http11InputBuffer.java
@@ -18,6 +18,7 @@ package org.apache.coyote.http11;
 
 import java.io.EOFException;
 import java.io.IOException;
+import java.nio.Buffer;
 import java.nio.ByteBuffer;
 import java.nio.charset.StandardCharsets;
 import java.util.Arrays;
@@ -265,7 +266,7 @@ public class Http11InputBuffer implement
             activeFilters[i].recycle();
         }
 
-        byteBuffer.limit(0).position(0);
+        ((Buffer)byteBuffer).limit(0).position(0);
         lastActiveFilter = -1;
         parsingHeader = true;
         swallowInput = true;
@@ -295,10 +296,10 @@ public class Http11InputBuffer implement
             if (byteBuffer.remaining() > 0) {
                 // Copy leftover bytes to the beginning of the buffer
                 byteBuffer.compact();
-                byteBuffer.flip();
+                ((Buffer)byteBuffer).flip();
             } else {
                 // Reset position and limit to 0
-                byteBuffer.position(0).limit(0);
+                ((Buffer)byteBuffer).position(0).limit(0);
             }
         }
 
@@ -382,7 +383,7 @@ public class Http11InputBuffer implement
                 }
                 chr = byteBuffer.get();
             } while ((chr == Constants.CR) || (chr == Constants.LF));
-            byteBuffer.position(byteBuffer.position() - 1);
+            ((Buffer)byteBuffer).position(byteBuffer.position() - 1);
 
             parsingRequestLineStart = byteBuffer.position();
             parsingRequestLinePhase = 2;
@@ -412,7 +413,7 @@ public class Http11InputBuffer implement
                     request.method().setBytes(byteBuffer.array(), parsingRequestLineStart,
                             pos - parsingRequestLineStart);
                 } else if (!HttpParser.isToken(chr)) {
-                    byteBuffer.position(byteBuffer.position() - 1);
+                    ((Buffer)byteBuffer).position(byteBuffer.position() - 1);
                     // Avoid unknown protocol triggering an additional error
                     request.protocol().setString(Constants.HTTP_11);
                     throw new IllegalArgumentException(sm.getString("iib.invalidmethod"));
@@ -432,7 +433,7 @@ public class Http11InputBuffer implement
                 chr = byteBuffer.get();
                 if (!(chr == Constants.SP || chr == Constants.HT)) {
                     space = false;
-                    byteBuffer.position(byteBuffer.position() - 1);
+                    ((Buffer)byteBuffer).position(byteBuffer.position() - 1);
                 }
             }
             parsingRequestLineStart = byteBuffer.position();
@@ -520,7 +521,7 @@ public class Http11InputBuffer implement
                 byte chr = byteBuffer.get();
                 if (!(chr == Constants.SP || chr == Constants.HT)) {
                     space = false;
-                    byteBuffer.position(byteBuffer.position() - 1);
+                    ((Buffer)byteBuffer).position(byteBuffer.position() - 1);
                 }
             }
             parsingRequestLineStart = byteBuffer.position();
@@ -618,7 +619,7 @@ public class Http11InputBuffer implement
 
         if (swallowInput && (lastActiveFilter != -1)) {
             int extraBytes = (int) activeFilters[lastActiveFilter].end();
-            byteBuffer.position(byteBuffer.position() - extraBytes);
+            ((Buffer)byteBuffer).position(byteBuffer.position() - extraBytes);
         }
     }
 
@@ -716,7 +717,7 @@ public class Http11InputBuffer implement
                 wrapper.getSocketBufferHandler().getReadBuffer().capacity();
         if (byteBuffer == null || byteBuffer.capacity() < bufLength) {
             byteBuffer = ByteBuffer.allocate(bufLength);
-            byteBuffer.position(0).limit(0);
+            ((Buffer)byteBuffer).position(0).limit(0);
         }
     }
 
@@ -741,14 +742,14 @@ public class Http11InputBuffer implement
                 throw new IllegalArgumentException(sm.getString("iib.requestheadertoolarge.error"));
             }
         } else {
-            byteBuffer.limit(end).position(end);
+            ((Buffer)byteBuffer).limit(end).position(end);
         }
 
-        byteBuffer.mark();
+        ((Buffer)byteBuffer).mark();
         if (byteBuffer.position() < byteBuffer.limit()) {
-            byteBuffer.position(byteBuffer.limit());
+            ((Buffer)byteBuffer).position(byteBuffer.limit());
         }
-        byteBuffer.limit(byteBuffer.capacity());
+        ((Buffer)byteBuffer).limit(byteBuffer.capacity());
         SocketWrapperBase<?> socketWrapper = this.wrapper;
         int nRead = -1;
         if (socketWrapper != null) {
@@ -756,7 +757,7 @@ public class Http11InputBuffer implement
         } else {
             throw new CloseNowException(sm.getString("iib.eof.error"));
         }
-        byteBuffer.limit(byteBuffer.position()).reset();
+        ((Buffer)byteBuffer).limit(byteBuffer.position()).reset();
         if (nRead > 0) {
             return true;
         } else if (nRead == -1) {
@@ -796,10 +797,10 @@ public class Http11InputBuffer implement
             } else {
                 if (prevChr == Constants.CR) {
                     // Must have read two bytes (first was CR, second was not LF)
-                    byteBuffer.position(byteBuffer.position() - 2);
+                    ((Buffer)byteBuffer).position(byteBuffer.position() - 2);
                 } else {
                     // Must have only read one byte
-                    byteBuffer.position(byteBuffer.position() - 1);
+                    ((Buffer)byteBuffer).position(byteBuffer.position() - 1);
                 }
                 break;
             }
@@ -842,7 +843,7 @@ public class Http11InputBuffer implement
                 // Non-token characters are illegal in header names
                 // Parsing continues so the error can be reported in context
                 headerData.lastSignificantChar = pos;
-                byteBuffer.position(byteBuffer.position() - 1);
+                ((Buffer)byteBuffer).position(byteBuffer.position() - 1);
                 // skipLine() will handle the error
                 return skipLine();
             }
@@ -880,7 +881,7 @@ public class Http11InputBuffer implement
                     chr = byteBuffer.get();
                     if (!(chr == Constants.SP || chr == Constants.HT)) {
                         headerParsePos = HeaderParsePosition.HEADER_VALUE;
-                        byteBuffer.position(byteBuffer.position() - 1);
+                        ((Buffer)byteBuffer).position(byteBuffer.position() - 1);
                         break;
                     }
                 }
@@ -1111,7 +1112,7 @@ public class Http11InputBuffer implement
 
             int length = byteBuffer.remaining();
             handler.setByteBuffer(byteBuffer.duplicate());
-            byteBuffer.position(byteBuffer.limit());
+            ((Buffer)byteBuffer).position(byteBuffer.limit());
 
             return length;
         }
@@ -1133,12 +1134,12 @@ public class Http11InputBuffer implement
     @Override
     public void expand(int size) {
         if (byteBuffer.capacity() >= size) {
-            byteBuffer.limit(size);
+            ((Buffer)byteBuffer).limit(size);
         }
         ByteBuffer temp = ByteBuffer.allocate(size);
         temp.put(byteBuffer);
         byteBuffer = temp;
-        byteBuffer.mark();
+        ((Buffer)byteBuffer).mark();
         temp = null;
     }
 }
Index: apache-tomcat-9.0.33-src/java/org/apache/coyote/http11/Http11OutputBuffer.java
===================================================================
--- apache-tomcat-9.0.33-src.orig/java/org/apache/coyote/http11/Http11OutputBuffer.java
+++ apache-tomcat-9.0.33-src/java/org/apache/coyote/http11/Http11OutputBuffer.java
@@ -17,6 +17,7 @@
 package org.apache.coyote.http11;
 
 import java.io.IOException;
+import java.nio.Buffer;
 import java.nio.ByteBuffer;
 import java.util.Arrays;
 
@@ -242,7 +243,7 @@ public class Http11OutputBuffer implemen
      * headers so the error response can be written.
      */
     void resetHeaderBuffer() {
-        headerBuffer.position(0).limit(headerBuffer.capacity());
+        ((Buffer)headerBuffer).position(0).limit(headerBuffer.capacity());
     }
 
 
@@ -270,7 +271,7 @@ public class Http11OutputBuffer implemen
         // Recycle response object
         response.recycle();
         // Reset pointers
-        headerBuffer.position(0).limit(headerBuffer.capacity());
+        ((Buffer)headerBuffer).position(0).limit(headerBuffer.capacity());
         lastActiveFilter = -1;
         responseFinished = false;
         byteCount = 0;
@@ -302,7 +303,7 @@ public class Http11OutputBuffer implemen
 
         if (headerBuffer.position() > 0) {
             // Sending the response header buffer
-            headerBuffer.flip();
+            ((Buffer)headerBuffer).flip();
             try {
                 SocketWrapperBase<?> socketWrapper = this.socketWrapper;
                 if (socketWrapper != null) {
@@ -311,7 +312,7 @@ public class Http11OutputBuffer implemen
                     throw new CloseNowException(sm.getString("iob.failedwrite"));
                 }
             } finally {
-                headerBuffer.position(0).limit(headerBuffer.capacity());
+                ((Buffer)headerBuffer).position(0).limit(headerBuffer.capacity());
             }
         }
     }
Index: apache-tomcat-9.0.33-src/java/org/apache/coyote/http2/HpackDecoder.java
===================================================================
--- apache-tomcat-9.0.33-src.orig/java/org/apache/coyote/http2/HpackDecoder.java
+++ apache-tomcat-9.0.33-src/java/org/apache/coyote/http2/HpackDecoder.java
@@ -16,6 +16,7 @@
  */
 package org.apache.coyote.http2;
 
+import java.nio.Buffer;
 import java.nio.ByteBuffer;
 
 import org.apache.tomcat.util.res.StringManager;
@@ -99,10 +100,10 @@ public class HpackDecoder {
             byte b = buffer.get();
             if ((b & 0b10000000) != 0) {
                 //if the first bit is set it is an indexed header field
-                buffer.position(buffer.position() - 1); //unget the byte
+                ((Buffer)buffer).position(buffer.position() - 1); //unget the byte
                 int index = Hpack.decodeInteger(buffer, 7); //prefix is 7
                 if (index == -1) {
-                    buffer.position(originalPos);
+                    ((Buffer)buffer).position(originalPos);
                     return;
                 } else if(index == 0) {
                     throw new HpackException(
@@ -113,12 +114,12 @@ public class HpackDecoder {
                 //Literal Header Field with Incremental Indexing
                 String headerName = readHeaderName(buffer, 6);
                 if (headerName == null) {
-                    buffer.position(originalPos);
+                    ((Buffer)buffer).position(originalPos);
                     return;
                 }
                 String headerValue = readHpackString(buffer);
                 if (headerValue == null) {
-                    buffer.position(originalPos);
+                    ((Buffer)buffer).position(originalPos);
                     return;
                 }
                 emitHeader(headerName, headerValue);
@@ -127,12 +128,12 @@ public class HpackDecoder {
                 //Literal Header Field without Indexing
                 String headerName = readHeaderName(buffer, 4);
                 if (headerName == null) {
-                    buffer.position(originalPos);
+                    ((Buffer)buffer).position(originalPos);
                     return;
                 }
                 String headerValue = readHpackString(buffer);
                 if (headerValue == null) {
-                    buffer.position(originalPos);
+                    ((Buffer)buffer).position(originalPos);
                     return;
                 }
                 emitHeader(headerName, headerValue);
@@ -140,12 +141,12 @@ public class HpackDecoder {
                 //Literal Header Field never indexed
                 String headerName = readHeaderName(buffer, 4);
                 if (headerName == null) {
-                    buffer.position(originalPos);
+                    ((Buffer)buffer).position(originalPos);
                     return;
                 }
                 String headerValue = readHpackString(buffer);
                 if (headerValue == null) {
-                    buffer.position(originalPos);
+                    ((Buffer)buffer).position(originalPos);
                     return;
                 }
                 emitHeader(headerName, headerValue);
@@ -164,10 +165,10 @@ public class HpackDecoder {
         if (headerCount != 0) {
             throw new HpackException(sm.getString("hpackdecoder.tableSizeUpdateNotAtStart"));
         }
-        buffer.position(buffer.position() - 1); //unget the byte
+        ((Buffer)buffer).position(buffer.position() - 1); //unget the byte
         int size = Hpack.decodeInteger(buffer, 5);
         if (size == -1) {
-            buffer.position(originalPos);
+            ((Buffer)buffer).position(originalPos);
             return false;
         }
         if (size > maxMemorySizeHard) {
@@ -197,7 +198,7 @@ public class HpackDecoder {
     }
 
     private String readHeaderName(ByteBuffer buffer, int prefixLength) throws HpackException {
-        buffer.position(buffer.position() - 1); //unget the byte
+        ((Buffer)buffer).position(buffer.position() - 1); //unget the byte
         int index = Hpack.decodeInteger(buffer, prefixLength);
         if (index == -1) {
             return null;
Index: apache-tomcat-9.0.33-src/java/org/apache/coyote/http2/HPackHuffman.java
===================================================================
--- apache-tomcat-9.0.33-src.orig/java/org/apache/coyote/http2/HPackHuffman.java
+++ apache-tomcat-9.0.33-src/java/org/apache/coyote/http2/HPackHuffman.java
@@ -16,6 +16,7 @@
  */
 package org.apache.coyote.http2;
 
+import java.nio.Buffer;
 import java.nio.ByteBuffer;
 import java.util.Arrays;
 import java.util.HashSet;
@@ -483,7 +484,7 @@ public class HPackHuffman {
                 int rem = code.length;
                 while (rem > 0) {
                     if (!buffer.hasRemaining()) {
-                        buffer.position(start);
+                        ((Buffer)buffer).position(start);
                         return false;
                     }
                     int remainingInByte = 8 - bytePos;
@@ -504,7 +505,7 @@ public class HPackHuffman {
             }
             if (bytePos == 8) {
                 if (!buffer.hasRemaining()) {
-                    buffer.position(start);
+                    ((Buffer)buffer).position(start);
                     return false;
                 }
                 buffer.put(currentBufferByte);
@@ -514,14 +515,14 @@ public class HPackHuffman {
             if (buffer.position() - start > toEncode.length()) {
                 //the encoded version is longer than the original
                 //just return false
-                buffer.position(start);
+                ((Buffer)buffer).position(start);
                 return false;
             }
         }
         if (bytePos > 0) {
             //add the EOS bytes if we have not finished on a single byte
             if (!buffer.hasRemaining()) {
-                buffer.position(start);
+                ((Buffer)buffer).position(start);
                 return false;
             }
             buffer.put((byte) (currentBufferByte | ((0xFF) >> bytePos)));
Index: apache-tomcat-9.0.33-src/java/org/apache/coyote/http2/Hpack.java
===================================================================
--- apache-tomcat-9.0.33-src.orig/java/org/apache/coyote/http2/Hpack.java
+++ apache-tomcat-9.0.33-src/java/org/apache/coyote/http2/Hpack.java
@@ -16,6 +16,7 @@
  */
 package org.apache.coyote.http2;
 
+import java.nio.Buffer;
 import java.nio.ByteBuffer;
 
 import org.apache.tomcat.util.res.StringManager;
@@ -165,7 +166,7 @@ final class Hpack {
                 if (source.remaining() == 0) {
                     //we have run out of data
                     //reset
-                    source.position(sp);
+                    ((Buffer)source).position(sp);
                     return -1;
                 }
                 b = source.get();
Index: apache-tomcat-9.0.33-src/java/org/apache/coyote/http2/Http2AsyncParser.java
===================================================================
--- apache-tomcat-9.0.33-src.orig/java/org/apache/coyote/http2/Http2AsyncParser.java
+++ apache-tomcat-9.0.33-src/java/org/apache/coyote/http2/Http2AsyncParser.java
@@ -17,6 +17,7 @@
 package org.apache.coyote.http2;
 
 import java.io.IOException;
+import java.nio.Buffer;
 import java.nio.ByteBuffer;
 import java.nio.channels.CompletionHandler;
 import java.util.concurrent.TimeUnit;
@@ -103,7 +104,7 @@ class Http2AsyncParser extends Http2Pars
         public void completed(Long result, Void attachment) {
             if (streamException || error == null) {
                 ByteBuffer payload = buffers[2];
-                payload.flip();
+                ((Buffer)payload).flip();
                 try {
                     if (streamException) {
                         swallow(streamId, payloadSize, false, payload);
@@ -232,7 +233,7 @@ class Http2AsyncParser extends Http2Pars
         public void completed(Long result, Void attachment) {
             if (streamException || error == null) {
                 ByteBuffer payload = buffers[1];
-                payload.flip();
+                ((Buffer)payload).flip();
                 try {
                     boolean continueParsing;
                     do {
@@ -286,7 +287,7 @@ class Http2AsyncParser extends Http2Pars
                             if (payload.remaining() - 9 >= payloadSize) {
                                 continueParsing = true;
                                 // Now go over frame header
-                                payload.position(payload.position() + 9);
+                                ((Buffer)payload).position(payload.position() + 9);
                                 try {
                                     validateFrame(null, frameType, streamId, flags, payloadSize);
                                 } catch (StreamException e) {
Index: apache-tomcat-9.0.33-src/java/org/apache/coyote/http2/Http2AsyncUpgradeHandler.java
===================================================================
--- apache-tomcat-9.0.33-src.orig/java/org/apache/coyote/http2/Http2AsyncUpgradeHandler.java
+++ apache-tomcat-9.0.33-src/java/org/apache/coyote/http2/Http2AsyncUpgradeHandler.java
@@ -17,6 +17,7 @@
 package org.apache.coyote.http2;
 
 import java.io.IOException;
+import java.nio.Buffer;
 import java.nio.ByteBuffer;
 import java.nio.channels.CompletionHandler;
 import java.nio.channels.FileChannel;
@@ -216,11 +217,11 @@ public class Http2AsyncUpgradeHandler ex
         if (writeable) {
             ByteUtil.set31Bits(header, 5, stream.getIdAsInt());
             int orgLimit = data.limit();
-            data.limit(data.position() + len);
+            ((Buffer)data).limit(data.position() + len);
             socketWrapper.write(BlockingMode.BLOCK, protocol.getWriteTimeout(),
                     TimeUnit.MILLISECONDS, null, SocketWrapperBase.COMPLETE_WRITE,
                     applicationErrorCompletion, ByteBuffer.wrap(header), data);
-            data.limit(orgLimit);
+            ((Buffer)data).limit(orgLimit);
             handleAsyncException();
         }
     }
Index: apache-tomcat-9.0.33-src/java/org/apache/coyote/http2/Http2Parser.java
===================================================================
--- apache-tomcat-9.0.33-src.orig/java/org/apache/coyote/http2/Http2Parser.java
+++ apache-tomcat-9.0.33-src/java/org/apache/coyote/http2/Http2Parser.java
@@ -17,6 +17,7 @@
 package org.apache.coyote.http2;
 
 import java.io.IOException;
+import java.nio.Buffer;
 import java.nio.ByteBuffer;
 import java.nio.charset.StandardCharsets;
 
@@ -192,9 +193,9 @@ class Http2Parser {
                     input.fill(true, dest, dataLength);
                 } else {
                     int oldLimit = buffer.limit();
-                    buffer.limit(buffer.position() + dataLength);
+                    ((Buffer)buffer).limit(buffer.position() + dataLength);
                     dest.put(buffer);
-                    buffer.limit(oldLimit);
+                    ((Buffer)buffer).limit(oldLimit);
                 }
                 // Process padding before sending any notifications in case
                 // padding is invalid.
@@ -475,12 +476,12 @@ class Http2Parser {
                 input.fill(true, headerReadBuffer, toRead);
             } else {
                 int oldLimit = buffer.limit();
-                buffer.limit(buffer.position() + toRead);
+                ((Buffer)buffer).limit(buffer.position() + toRead);
                 headerReadBuffer.put(buffer);
-                buffer.limit(oldLimit);
+                ((Buffer)buffer).limit(oldLimit);
             }
             // switch to read mode
-            headerReadBuffer.flip();
+            ((Buffer)headerReadBuffer).flip();
             try {
                 hpackDecoder.decode(headerReadBuffer);
             } catch (HpackException hpe) {
@@ -550,7 +551,7 @@ class Http2Parser {
             return;
         }
         if (!mustBeZero && byteBuffer != null) {
-            byteBuffer.position(byteBuffer.position() + len);
+            ((Buffer)byteBuffer).position(byteBuffer.position() + len);
         } else {
             int read = 0;
             byte[] buffer = new byte[1024];
@@ -710,7 +711,7 @@ class Http2Parser {
         default boolean fill(boolean block, ByteBuffer data, int len) throws IOException {
             boolean result = fill(block, data.array(), data.arrayOffset() + data.position(), len);
             if (result) {
-                data.position(data.position() + len);
+                ((Buffer)data).position(data.position() + len);
             }
             return result;
         }
Index: apache-tomcat-9.0.33-src/java/org/apache/coyote/http2/Http2UpgradeHandler.java
===================================================================
--- apache-tomcat-9.0.33-src.orig/java/org/apache/coyote/http2/Http2UpgradeHandler.java
+++ apache-tomcat-9.0.33-src/java/org/apache/coyote/http2/Http2UpgradeHandler.java
@@ -18,6 +18,7 @@ package org.apache.coyote.http2;
 
 import java.io.EOFException;
 import java.io.IOException;
+import java.nio.Buffer;
 import java.nio.ByteBuffer;
 import java.nio.charset.StandardCharsets;
 import java.util.HashSet;
@@ -762,9 +763,9 @@ class Http2UpgradeHandler extends Abstra
                 try {
                     socketWrapper.write(true, header, 0, header.length);
                     int orgLimit = data.limit();
-                    data.limit(data.position() + len);
+                    ((Buffer)data).limit(data.position() + len);
                     socketWrapper.write(true, data);
-                    data.limit(orgLimit);
+                    ((Buffer)data).limit(orgLimit);
                     socketWrapper.flush(true);
                 } catch (IOException ioe) {
                     handleAppInitiatedIOException(ioe);
@@ -1830,7 +1831,7 @@ class Http2UpgradeHandler extends Abstra
             } catch (IOException ioe) {
                 handleAppInitiatedIOException(ioe);
             }
-            payload.clear();
+            ((Buffer)payload).clear();
         }
 
         @Override
Index: apache-tomcat-9.0.33-src/java/org/apache/coyote/http2/Stream.java
===================================================================
--- apache-tomcat-9.0.33-src.orig/java/org/apache/coyote/http2/Stream.java
+++ apache-tomcat-9.0.33-src/java/org/apache/coyote/http2/Stream.java
@@ -17,6 +17,7 @@
 package org.apache.coyote.http2;
 
 import java.io.IOException;
+import java.nio.Buffer;
 import java.nio.ByteBuffer;
 import java.nio.charset.StandardCharsets;
 import java.security.AccessController;
@@ -850,9 +851,9 @@ class Stream extends AbstractStream impl
                 int chunkLimit = chunk.limit();
                 while (chunk.remaining() > 0) {
                     int thisTime = Math.min(buffer.remaining(), chunk.remaining());
-                    chunk.limit(chunk.position() + thisTime);
+                    ((Buffer)chunk).limit(chunk.position() + thisTime);
                     buffer.put(chunk);
-                    chunk.limit(chunkLimit);
+                    ((Buffer)chunk).limit(chunkLimit);
                     if (chunk.remaining() > 0 && !buffer.hasRemaining()) {
                         // Only flush if we have more data to write and the buffer
                         // is full
@@ -922,7 +923,7 @@ class Stream extends AbstractStream impl
                 // Buffer is empty. Nothing to do.
                 return false;
             }
-            buffer.flip();
+            ((Buffer)buffer).flip();
             int left = buffer.remaining();
             while (left > 0) {
                 if (streamReservation == 0) {
@@ -953,7 +954,7 @@ class Stream extends AbstractStream impl
                     left -= connectionReservation;
                 }
             }
-            buffer.clear();
+            ((Buffer)buffer).clear();
             return false;
         }
 
@@ -1014,9 +1015,9 @@ class Stream extends AbstractStream impl
             int chunkLimit = src.limit();
             while (src.remaining() > 0) {
                 int thisTime = Math.min(buffer.remaining(), src.remaining());
-                src.limit(src.position() + thisTime);
+                ((Buffer)src).limit(src.position() + thisTime);
                 buffer.put(src);
-                src.limit(chunkLimit);
+                ((Buffer)src).limit(chunkLimit);
                 if (flush(false, blocking)) {
                     return true;
                 }
@@ -1104,14 +1105,14 @@ class Stream extends AbstractStream impl
                 if (inBuffer.position() > 0) {
                     // Data is available in the inBuffer. Copy it to the
                     // outBuffer.
-                    inBuffer.flip();
+                    ((Buffer)inBuffer).flip();
                     written = inBuffer.remaining();
                     if (log.isDebugEnabled()) {
                         log.debug(sm.getString("stream.inputBuffer.copy",
                                 Integer.toString(written)));
                     }
                     inBuffer.get(outBuffer, 0, written);
-                    inBuffer.clear();
+                    ((Buffer)inBuffer).clear();
                 } else if (!canRead) {
                     return -1;
                 } else {
Index: apache-tomcat-9.0.33-src/java/org/apache/tomcat/util/buf/B2CConverter.java
===================================================================
--- apache-tomcat-9.0.33-src.orig/java/org/apache/tomcat/util/buf/B2CConverter.java
+++ apache-tomcat-9.0.33-src/java/org/apache/tomcat/util/buf/B2CConverter.java
@@ -18,6 +18,7 @@ package org.apache.tomcat.util.buf;
 
 import java.io.IOException;
 import java.io.UnsupportedEncodingException;
+import java.nio.Buffer;
 import java.nio.ByteBuffer;
 import java.nio.CharBuffer;
 import java.nio.charset.Charset;
@@ -107,7 +108,7 @@ public class B2CConverter {
      */
     public void recycle() {
         decoder.reset();
-        leftovers.position(0);
+        ((Buffer)leftovers).position(0);
     }
 
     /**
@@ -126,8 +127,8 @@ public class B2CConverter {
             bb = ByteBuffer.wrap(bc.getBuffer(), bc.getStart(), bc.getLength());
         } else {
             // Initialize the byte buffer
-            bb.limit(bc.getEnd());
-            bb.position(bc.getStart());
+            ((Buffer)bb).limit(bc.getEnd());
+            ((Buffer)bb).position(bc.getStart());
         }
         if ((cb == null) || (cb.array() != cc.getBuffer())) {
             // Create a new char buffer if anything changed
@@ -135,8 +136,8 @@ public class B2CConverter {
                     cc.getBuffer().length - cc.getEnd());
         } else {
             // Initialize the char buffer
-            cb.limit(cc.getBuffer().length);
-            cb.position(cc.getEnd());
+            ((Buffer)cb).limit(cc.getBuffer().length);
+            ((Buffer)cb).position(cc.getEnd());
         }
         CoderResult result = null;
         // Parse leftover if any are present
@@ -145,16 +146,16 @@ public class B2CConverter {
             // Loop until one char is decoded or there is a decoder error
             do {
                 leftovers.put(bc.subtractB());
-                leftovers.flip();
+                ((Buffer)leftovers).flip();
                 result = decoder.decode(leftovers, cb, endOfInput);
-                leftovers.position(leftovers.limit());
-                leftovers.limit(leftovers.array().length);
+                ((Buffer)leftovers).position(leftovers.limit());
+                ((Buffer)leftovers).limit(leftovers.array().length);
             } while (result.isUnderflow() && (cb.position() == pos));
             if (result.isError() || result.isMalformed()) {
                 result.throwException();
             }
-            bb.position(bc.getStart());
-            leftovers.position(0);
+            ((Buffer)bb).position(bc.getStart());
+            ((Buffer)leftovers).position(0);
         }
         // Do the decoding and get the results into the byte chunk and the char
         // chunk
@@ -172,8 +173,8 @@ public class B2CConverter {
             cc.setEnd(cb.position());
             // Put leftovers in the leftovers byte buffer
             if (bc.getLength() > 0) {
-                leftovers.limit(leftovers.array().length);
-                leftovers.position(bc.getLength());
+                ((Buffer)leftovers).limit(leftovers.array().length);
+                ((Buffer)leftovers).position(bc.getLength());
                 bc.subtract(leftovers.array(), 0, bc.getLength());
             }
         }
@@ -196,16 +197,16 @@ public class B2CConverter {
             bb = ByteBuffer.wrap(bc.array(), bc.arrayOffset() + bc.position(), bc.remaining());
         } else {
             // Initialize the byte buffer
-            bb.limit(bc.limit());
-            bb.position(bc.position());
+            ((Buffer)bb).limit(bc.limit());
+            ((Buffer)bb).position(bc.position());
         }
         if ((cb == null) || (cb.array() != cc.array())) {
             // Create a new char buffer if anything changed
             cb = CharBuffer.wrap(cc.array(), cc.limit(), cc.capacity() - cc.limit());
         } else {
             // Initialize the char buffer
-            cb.limit(cc.capacity());
-            cb.position(cc.limit());
+            ((Buffer)cb).limit(cc.capacity());
+            ((Buffer)cb).position(cc.limit());
         }
         CoderResult result = null;
         // Parse leftover if any are present
@@ -221,16 +222,16 @@ public class B2CConverter {
                     chr = bc.get();
                 }
                 leftovers.put(chr);
-                leftovers.flip();
+                ((Buffer)leftovers).flip();
                 result = decoder.decode(leftovers, cb, endOfInput);
-                leftovers.position(leftovers.limit());
-                leftovers.limit(leftovers.array().length);
+                ((Buffer)leftovers).position(leftovers.limit());
+                ((Buffer)leftovers).limit(leftovers.array().length);
             } while (result.isUnderflow() && (cb.position() == pos));
             if (result.isError() || result.isMalformed()) {
                 result.throwException();
             }
-            bb.position(bc.position());
-            leftovers.position(0);
+            ((Buffer)bb).position(bc.position());
+            ((Buffer)leftovers).position(0);
         }
         // Do the decoding and get the results into the byte chunk and the char
         // chunk
@@ -240,16 +241,16 @@ public class B2CConverter {
         } else if (result.isOverflow()) {
             // Propagate current positions to the byte chunk and char chunk, if
             // this continues the char buffer will get resized
-            bc.position(bb.position());
-            cc.limit(cb.position());
+            ((Buffer)bc).position(bb.position());
+            ((Buffer)cc).limit(cb.position());
         } else if (result.isUnderflow()) {
             // Propagate current positions to the byte chunk and char chunk
-            bc.position(bb.position());
-            cc.limit(cb.position());
+            ((Buffer)bc).position(bb.position());
+            ((Buffer)cc).limit(cb.position());
             // Put leftovers in the leftovers byte buffer
             if (bc.remaining() > 0) {
-                leftovers.limit(leftovers.array().length);
-                leftovers.position(bc.remaining());
+                ((Buffer)leftovers).limit(leftovers.array().length);
+                ((Buffer)leftovers).position(bc.remaining());
                 bc.get(leftovers.array(), 0, bc.remaining());
             }
         }
Index: apache-tomcat-9.0.33-src/java/org/apache/tomcat/util/buf/ByteBufferHolder.java
===================================================================
--- apache-tomcat-9.0.33-src.orig/java/org/apache/tomcat/util/buf/ByteBufferHolder.java
+++ apache-tomcat-9.0.33-src/java/org/apache/tomcat/util/buf/ByteBufferHolder.java
@@ -16,6 +16,7 @@
  */
 package org.apache.tomcat.util.buf;
 
+import java.nio.Buffer;
 import java.nio.ByteBuffer;
 import java.util.concurrent.atomic.AtomicBoolean;
 
@@ -46,7 +47,7 @@ public class ByteBufferHolder {
 
     public boolean flip() {
         if (flipped.compareAndSet(false, true)) {
-            buf.flip();
+            ((Buffer)buf).flip();
             return true;
         } else {
             return false;
Index: apache-tomcat-9.0.33-src/java/org/apache/tomcat/util/buf/ByteBufferUtils.java
===================================================================
--- apache-tomcat-9.0.33-src.orig/java/org/apache/tomcat/util/buf/ByteBufferUtils.java
+++ apache-tomcat-9.0.33-src/java/org/apache/tomcat/util/buf/ByteBufferUtils.java
@@ -19,6 +19,7 @@ package org.apache.tomcat.util.buf;
 import java.lang.reflect.Field;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
+import java.nio.Buffer;
 import java.nio.ByteBuffer;
 
 import org.apache.juli.logging.Log;
@@ -108,7 +109,7 @@ public class ByteBufferUtils {
         }
 
         // Copy data
-        in.flip();
+        ((Buffer)in).flip();
         out.put(in);
 
         if (direct) {
Index: apache-tomcat-9.0.33-src/java/org/apache/tomcat/util/buf/ByteChunk.java
===================================================================
--- apache-tomcat-9.0.33-src.orig/java/org/apache/tomcat/util/buf/ByteChunk.java
+++ apache-tomcat-9.0.33-src/java/org/apache/tomcat/util/buf/ByteChunk.java
@@ -19,6 +19,7 @@ package org.apache.tomcat.util.buf;
 import java.io.IOException;
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
+import java.nio.Buffer;
 import java.nio.ByteBuffer;
 import java.nio.CharBuffer;
 import java.nio.charset.Charset;
@@ -345,7 +346,7 @@ public final class ByteChunk extends Abs
         // and avoid an extra copy
         if (len == limit && end == start && out != null) {
             out.realWriteBytes(from);
-            from.position(from.limit());
+            ((Buffer)from).position(from.limit());
             return;
         }
         // if we have limit and we're below
@@ -375,13 +376,13 @@ public final class ByteChunk extends Abs
         int remain = len - avail;
         avail = limit - end;
         while (remain >= avail) {
-            from.limit(from.position() + avail);
+            ((Buffer)from).limit(from.position() + avail);
             out.realWriteBytes(from);
-            from.position(from.limit());
+            ((Buffer)from).position(from.limit());
             remain = remain - avail;
         }
 
-        from.limit(fromLimit);
+        ((Buffer)from).limit(fromLimit);
         from.get(buff, end, remain);
         end += remain;
     }
@@ -482,8 +483,8 @@ public final class ByteChunk extends Abs
         }
         int n = Math.min(to.remaining(), getLength());
         to.put(buff, start, n);
-        to.limit(to.position());
-        to.position(to.position() - n);
+        ((Buffer)to).limit(to.position());
+        ((Buffer)to).position(to.position() - n);
         start += n;
         return n;
     }
Index: apache-tomcat-9.0.33-src/java/org/apache/tomcat/util/buf/C2BConverter.java
===================================================================
--- apache-tomcat-9.0.33-src.orig/java/org/apache/tomcat/util/buf/C2BConverter.java
+++ apache-tomcat-9.0.33-src/java/org/apache/tomcat/util/buf/C2BConverter.java
@@ -17,6 +17,7 @@
 package org.apache.tomcat.util.buf;
 
 import java.io.IOException;
+import java.nio.Buffer;
 import java.nio.ByteBuffer;
 import java.nio.CharBuffer;
 import java.nio.charset.Charset;
@@ -51,7 +52,7 @@ public final class C2BConverter {
      */
     public void recycle() {
         encoder.reset();
-        leftovers.position(0);
+        ((Buffer)leftovers).position(0);
     }
 
     public boolean isUndeflow() {
@@ -71,16 +72,16 @@ public final class C2BConverter {
             bb = ByteBuffer.wrap(bc.getBuffer(), bc.getEnd(), bc.getBuffer().length - bc.getEnd());
         } else {
             // Initialize the byte buffer
-            bb.limit(bc.getBuffer().length);
-            bb.position(bc.getEnd());
+            ((Buffer)bb).limit(bc.getBuffer().length);
+            ((Buffer)bb).position(bc.getEnd());
         }
         if ((cb == null) || (cb.array() != cc.getBuffer())) {
             // Create a new char buffer if anything changed
             cb = CharBuffer.wrap(cc.getBuffer(), cc.getStart(), cc.getLength());
         } else {
             // Initialize the char buffer
-            cb.limit(cc.getEnd());
-            cb.position(cc.getStart());
+            ((Buffer)cb).limit(cc.getEnd());
+            ((Buffer)cb).position(cc.getStart());
         }
         CoderResult result = null;
         // Parse leftover if any are present
@@ -89,16 +90,16 @@ public final class C2BConverter {
             // Loop until one char is encoded or there is a encoder error
             do {
                 leftovers.put((char) cc.subtract());
-                leftovers.flip();
+                ((Buffer)leftovers).flip();
                 result = encoder.encode(leftovers, bb, false);
-                leftovers.position(leftovers.limit());
-                leftovers.limit(leftovers.array().length);
+                ((Buffer)leftovers).position(leftovers.limit());
+                ((Buffer)leftovers).limit(leftovers.array().length);
             } while (result.isUnderflow() && (bb.position() == pos));
             if (result.isError() || result.isMalformed()) {
                 result.throwException();
             }
-            cb.position(cc.getStart());
-            leftovers.position(0);
+            ((Buffer)cb).position(cc.getStart());
+            ((Buffer)leftovers).position(0);
         }
         // Do the decoding and get the results into the byte chunk and the char
         // chunk
@@ -115,8 +116,8 @@ public final class C2BConverter {
             cc.setOffset(cb.position());
             // Put leftovers in the leftovers char buffer
             if (cc.getLength() > 0) {
-                leftovers.limit(leftovers.array().length);
-                leftovers.position(cc.getLength());
+                ((Buffer)leftovers).limit(leftovers.array().length);
+                ((Buffer)leftovers).position(cc.getLength());
                 cc.subtract(leftovers.array(), 0, cc.getLength());
             }
         }
@@ -135,16 +136,16 @@ public final class C2BConverter {
             bb = ByteBuffer.wrap(bc.array(), bc.limit(), bc.capacity() - bc.limit());
         } else {
             // Initialize the byte buffer
-            bb.limit(bc.capacity());
-            bb.position(bc.limit());
+            ((Buffer)bb).limit(bc.capacity());
+            ((Buffer)bb).position(bc.limit());
         }
         if ((cb == null) || (cb.array() != cc.array())) {
             // Create a new char buffer if anything changed
             cb = CharBuffer.wrap(cc.array(), cc.arrayOffset() + cc.position(), cc.remaining());
         } else {
             // Initialize the char buffer
-            cb.limit(cc.limit());
-            cb.position(cc.position());
+            ((Buffer)cb).limit(cc.limit());
+            ((Buffer)cb).position(cc.position());
         }
         CoderResult result = null;
         // Parse leftover if any are present
@@ -153,16 +154,16 @@ public final class C2BConverter {
             // Loop until one char is encoded or there is a encoder error
             do {
                 leftovers.put(cc.get());
-                leftovers.flip();
+                ((Buffer)leftovers).flip();
                 result = encoder.encode(leftovers, bb, false);
-                leftovers.position(leftovers.limit());
-                leftovers.limit(leftovers.array().length);
+                ((Buffer)leftovers).position(leftovers.limit());
+                ((Buffer)leftovers).limit(leftovers.array().length);
             } while (result.isUnderflow() && (bb.position() == pos));
             if (result.isError() || result.isMalformed()) {
                 result.throwException();
             }
-            cb.position(cc.position());
-            leftovers.position(0);
+            ((Buffer)cb).position(cc.position());
+            ((Buffer)leftovers).position(0);
         }
         // Do the decoding and get the results into the byte chunk and the char
         // chunk
@@ -171,16 +172,16 @@ public final class C2BConverter {
             result.throwException();
         } else if (result.isOverflow()) {
             // Propagate current positions to the byte chunk and char chunk
-            bc.limit(bb.position());
-            cc.position(cb.position());
+            ((Buffer)bc).limit(bb.position());
+            ((Buffer)cc).position(cb.position());
         } else if (result.isUnderflow()) {
             // Propagate current positions to the byte chunk and char chunk
-            bc.limit(bb.position());
-            cc.position(cb.position());
+            ((Buffer)bc).limit(bb.position());
+            ((Buffer)cc).position(cb.position());
             // Put leftovers in the leftovers char buffer
             if (cc.remaining() > 0) {
-                leftovers.limit(leftovers.array().length);
-                leftovers.position(cc.remaining());
+                ((Buffer)leftovers).limit(leftovers.array().length);
+                ((Buffer)leftovers).position(cc.remaining());
                 cc.get(leftovers.array(), 0, cc.remaining());
             }
         }
Index: apache-tomcat-9.0.33-src/java/org/apache/tomcat/util/buf/Utf8Decoder.java
===================================================================
--- apache-tomcat-9.0.33-src.orig/java/org/apache/tomcat/util/buf/Utf8Decoder.java
+++ apache-tomcat-9.0.33-src/java/org/apache/tomcat/util/buf/Utf8Decoder.java
@@ -16,6 +16,7 @@
  */
 package org.apache.tomcat.util.buf;
 
+import java.nio.Buffer;
 import java.nio.ByteBuffer;
 import java.nio.CharBuffer;
 import java.nio.charset.CharsetDecoder;
@@ -140,7 +141,7 @@ public class Utf8Decoder extends Charset
             }
             return CoderResult.UNDERFLOW;
         } finally {
-            in.position(pos);
+            ((Buffer)in).position(pos);
         }
     }
 
@@ -163,8 +164,8 @@ public class Utf8Decoder extends Charset
                 // If first byte is invalid, tail will be set to -1
                 int tail = remainingBytes[jchar];
                 if (tail == -1) {
-                    in.position(inIndex - in.arrayOffset());
-                    out.position(outIndex - out.arrayOffset());
+                    ((Buffer)in).position(inIndex - in.arrayOffset());
+                    ((Buffer)out).position(outIndex - out.arrayOffset());
                     return CoderResult.malformedForLength(1);
                 }
                 // Additional checks to detect invalid sequences ASAP
@@ -175,72 +176,72 @@ public class Utf8Decoder extends Charset
                     // First byte C2..DF, second byte 80..BF
                     if (jchar > 0x41 && jchar < 0x60 &&
                             (bArr[inIndex + 1] & 0xC0) != 0x80) {
-                        in.position(inIndex - in.arrayOffset());
-                        out.position(outIndex - out.arrayOffset());
+                        ((Buffer)in).position(inIndex - in.arrayOffset());
+                        ((Buffer)out).position(outIndex - out.arrayOffset());
                         return CoderResult.malformedForLength(1);
                     }
                     // First byte E0, second byte A0..BF
                     if (jchar == 0x60 && (bArr[inIndex + 1] & 0xE0) != 0xA0) {
-                        in.position(inIndex - in.arrayOffset());
-                        out.position(outIndex - out.arrayOffset());
+                        ((Buffer)in).position(inIndex - in.arrayOffset());
+                        ((Buffer)out).position(outIndex - out.arrayOffset());
                         return CoderResult.malformedForLength(1);
                     }
                     // First byte E1..EC, second byte 80..BF
                     if (jchar > 0x60 && jchar < 0x6D &&
                             (bArr[inIndex + 1] & 0xC0) != 0x80) {
-                        in.position(inIndex - in.arrayOffset());
-                        out.position(outIndex - out.arrayOffset());
+                        ((Buffer)in).position(inIndex - in.arrayOffset());
+                        ((Buffer)out).position(outIndex - out.arrayOffset());
                         return CoderResult.malformedForLength(1);
                     }
                     // First byte ED, second byte 80..9F
                     if (jchar == 0x6D && (bArr[inIndex + 1] & 0xE0) != 0x80) {
-                        in.position(inIndex - in.arrayOffset());
-                        out.position(outIndex - out.arrayOffset());
+                        ((Buffer)in).position(inIndex - in.arrayOffset());
+                        ((Buffer)out).position(outIndex - out.arrayOffset());
                         return CoderResult.malformedForLength(1);
                     }
                     // First byte EE..EF, second byte 80..BF
                     if (jchar > 0x6D && jchar < 0x70 &&
                             (bArr[inIndex + 1] & 0xC0) != 0x80) {
-                        in.position(inIndex - in.arrayOffset());
-                        out.position(outIndex - out.arrayOffset());
+                        ((Buffer)in).position(inIndex - in.arrayOffset());
+                        ((Buffer)out).position(outIndex - out.arrayOffset());
                         return CoderResult.malformedForLength(1);
                     }
                     // First byte F0, second byte 90..BF
                     if (jchar == 0x70 &&
                             ((bArr[inIndex + 1] & 0xFF) < 0x90 ||
                             (bArr[inIndex + 1] & 0xFF) > 0xBF)) {
-                        in.position(inIndex - in.arrayOffset());
-                        out.position(outIndex - out.arrayOffset());
+                        ((Buffer)in).position(inIndex - in.arrayOffset());
+                        ((Buffer)out).position(outIndex - out.arrayOffset());
                         return CoderResult.malformedForLength(1);
                     }
                     // First byte F1..F3, second byte 80..BF
                     if (jchar > 0x70 && jchar < 0x74 &&
                             (bArr[inIndex + 1] & 0xC0) != 0x80) {
-                        in.position(inIndex - in.arrayOffset());
-                        out.position(outIndex - out.arrayOffset());
+                        ((Buffer)in).position(inIndex - in.arrayOffset());
+                        ((Buffer)out).position(outIndex - out.arrayOffset());
                         return CoderResult.malformedForLength(1);
                     }
                     // First byte F4, second byte 80..8F
                     if (jchar == 0x74 &&
                             (bArr[inIndex + 1] & 0xF0) != 0x80) {
-                        in.position(inIndex - in.arrayOffset());
-                        out.position(outIndex - out.arrayOffset());
+                        ((Buffer)in).position(inIndex - in.arrayOffset());
+                        ((Buffer)out).position(outIndex - out.arrayOffset());
                         return CoderResult.malformedForLength(1);
                     }
                 }
                 // Check third byte if present and expected
                 if (tailAvailable > 1 && tail > 1) {
                     if ((bArr[inIndex + 2] & 0xC0) != 0x80) {
-                        in.position(inIndex - in.arrayOffset());
-                        out.position(outIndex - out.arrayOffset());
+                        ((Buffer)in).position(inIndex - in.arrayOffset());
+                        ((Buffer)out).position(outIndex - out.arrayOffset());
                         return CoderResult.malformedForLength(2);
                     }
                 }
                 // Check fourth byte if present and expected
                 if (tailAvailable > 2 && tail > 2) {
                     if ((bArr[inIndex + 3] & 0xC0) != 0x80) {
-                        in.position(inIndex - in.arrayOffset());
-                        out.position(outIndex - out.arrayOffset());
+                        ((Buffer)in).position(inIndex - in.arrayOffset());
+                        ((Buffer)out).position(outIndex - out.arrayOffset());
                         return CoderResult.malformedForLength(3);
                     }
                 }
@@ -250,8 +251,8 @@ public class Utf8Decoder extends Charset
                 for (int i = 0; i < tail; i++) {
                     int nextByte = bArr[inIndex + i + 1] & 0xFF;
                     if ((nextByte & 0xC0) != 0x80) {
-                        in.position(inIndex - in.arrayOffset());
-                        out.position(outIndex - out.arrayOffset());
+                        ((Buffer)in).position(inIndex - in.arrayOffset());
+                        ((Buffer)out).position(outIndex - out.arrayOffset());
                         return CoderResult.malformedForLength(1 + i);
                     }
                     jchar = (jchar << 6) + nextByte;
@@ -259,8 +260,8 @@ public class Utf8Decoder extends Charset
                 jchar -= remainingNumbers[tail];
                 if (jchar < lowerEncodingLimit[tail]) {
                     // Should have been encoded in fewer octets
-                    in.position(inIndex - in.arrayOffset());
-                    out.position(outIndex - out.arrayOffset());
+                    ((Buffer)in).position(inIndex - in.arrayOffset());
+                    ((Buffer)out).position(outIndex - out.arrayOffset());
                     return CoderResult.malformedForLength(1);
                 }
                 inIndex += tail;
@@ -281,8 +282,8 @@ public class Utf8Decoder extends Charset
                     // Encoded with 4 bytes. inIndex currently points
                     // to the final byte. Move it back to first byte.
                     inIndex -= 3;
-                    in.position(inIndex - in.arrayOffset());
-                    out.position(outIndex - out.arrayOffset());
+                    ((Buffer)in).position(inIndex - in.arrayOffset());
+                    ((Buffer)out).position(outIndex - out.arrayOffset());
                     return CoderResult.OVERFLOW;
                 }
                 cArr[outIndex++] = (char) ((jchar >> 0xA) + 0xD7C0);
@@ -290,8 +291,8 @@ public class Utf8Decoder extends Charset
                 outRemaining -= 2;
             }
         }
-        in.position(inIndex - in.arrayOffset());
-        out.position(outIndex - out.arrayOffset());
+        ((Buffer)in).position(inIndex - in.arrayOffset());
+        ((Buffer)out).position(outIndex - out.arrayOffset());
         return (outRemaining == 0 && inIndex < inIndexLimit) ?
                 CoderResult.OVERFLOW :
                 CoderResult.UNDERFLOW;
Index: apache-tomcat-9.0.33-src/java/org/apache/tomcat/util/buf/Utf8Encoder.java
===================================================================
--- apache-tomcat-9.0.33-src.orig/java/org/apache/tomcat/util/buf/Utf8Encoder.java
+++ apache-tomcat-9.0.33-src/java/org/apache/tomcat/util/buf/Utf8Encoder.java
@@ -16,6 +16,7 @@
  */
 package org.apache.tomcat.util.buf;
 
+import java.nio.Buffer;
 import java.nio.ByteBuffer;
 import java.nio.CharBuffer;
 import java.nio.charset.CharsetEncoder;
@@ -56,8 +57,8 @@ public class Utf8Encoder extends Charset
 
             if (jchar <= 0x7F) {
                 if (outRemaining < 1) {
-                    in.position(x);
-                    out.position(outPos);
+                    ((Buffer)in).position(x);
+                    ((Buffer)out).position(outPos);
                     return CoderResult.OVERFLOW;
                 }
                 bArr[outPos++] = (byte) (jchar & 0xFF);
@@ -65,8 +66,8 @@ public class Utf8Encoder extends Charset
             } else if (jchar <= 0x7FF) {
 
                 if (outRemaining < 2) {
-                    in.position(x);
-                    out.position(outPos);
+                    ((Buffer)in).position(x);
+                    ((Buffer)out).position(outPos);
                     return CoderResult.OVERFLOW;
                 }
                 bArr[outPos++] = (byte) (0xC0 + ((jchar >> 6) & 0x1F));
@@ -77,21 +78,21 @@ public class Utf8Encoder extends Charset
 
                 // in has to have one byte more.
                 if (limit <= x + 1) {
-                    in.position(x);
-                    out.position(outPos);
+                    ((Buffer)in).position(x);
+                    ((Buffer)out).position(outPos);
                     return CoderResult.UNDERFLOW;
                 }
 
                 if (outRemaining < 4) {
-                    in.position(x);
-                    out.position(outPos);
+                    ((Buffer)in).position(x);
+                    ((Buffer)out).position(outPos);
                     return CoderResult.OVERFLOW;
                 }
 
                 // The surrogate pair starts with a low-surrogate.
                 if (jchar >= 0xDC00) {
-                    in.position(x);
-                    out.position(outPos);
+                    ((Buffer)in).position(x);
+                    ((Buffer)out).position(outPos);
                     return CoderResult.malformedForLength(1);
                 }
 
@@ -99,8 +100,8 @@ public class Utf8Encoder extends Charset
 
                 // The surrogate pair ends with a high-surrogate.
                 if (jchar2 < 0xDC00) {
-                    in.position(x);
-                    out.position(outPos);
+                    ((Buffer)in).position(x);
+                    ((Buffer)out).position(outPos);
                     return CoderResult.malformedForLength(1);
                 }
 
@@ -121,8 +122,8 @@ public class Utf8Encoder extends Charset
             } else {
 
                 if (outRemaining < 3) {
-                    in.position(x);
-                    out.position(outPos);
+                    ((Buffer)in).position(x);
+                    ((Buffer)out).position(outPos);
                     return CoderResult.OVERFLOW;
                 }
                 bArr[outPos++] = (byte) (0xE0 + ((jchar >> 12) & 0x0F));
@@ -131,8 +132,8 @@ public class Utf8Encoder extends Charset
                 outRemaining -= 3;
             }
             if (outRemaining == 0) {
-                in.position(x + 1);
-                out.position(outPos);
+                ((Buffer)in).position(x + 1);
+                ((Buffer)out).position(outPos);
                 // If both input and output are exhausted, return UNDERFLOW
                 if (x + 1 == limit) {
                     return CoderResult.UNDERFLOW;
@@ -143,8 +144,8 @@ public class Utf8Encoder extends Charset
 
         }
         if (rem != 0) {
-            in.position(x);
-            out.position(outPos);
+            ((Buffer)in).position(x);
+            ((Buffer)out).position(outPos);
         }
         return CoderResult.UNDERFLOW;
     }
@@ -228,7 +229,7 @@ public class Utf8Encoder extends Charset
                 pos++;
             }
         } finally {
-            in.position(pos);
+            ((Buffer)in).position(pos);
         }
         return CoderResult.UNDERFLOW;
     }
Index: apache-tomcat-9.0.33-src/java/org/apache/tomcat/util/net/AprEndpoint.java
===================================================================
--- apache-tomcat-9.0.33-src.orig/java/org/apache/tomcat/util/net/AprEndpoint.java
+++ apache-tomcat-9.0.33-src/java/org/apache/tomcat/util/net/AprEndpoint.java
@@ -20,6 +20,7 @@ import java.io.EOFException;
 import java.io.IOException;
 import java.net.InetSocketAddress;
 import java.net.SocketTimeoutException;
+import java.nio.Buffer;
 import java.nio.ByteBuffer;
 import java.nio.channels.CompletionHandler;
 import java.nio.charset.StandardCharsets;
@@ -2040,7 +2041,7 @@ public class AprEndpoint extends Abstrac
             //      SSL and app buffer size settings with NIO & NIO2.
             if (endpoint.isSSLEnabled()) {
                 sslOutputBuffer = ByteBuffer.allocateDirect(SSL_OUTPUT_BUFFER_SIZE);
-                sslOutputBuffer.position(SSL_OUTPUT_BUFFER_SIZE);
+                ((Buffer)sslOutputBuffer).position(SSL_OUTPUT_BUFFER_SIZE);
             } else {
                 sslOutputBuffer = null;
             }
@@ -2102,7 +2103,7 @@ public class AprEndpoint extends Abstrac
             // The socket read buffer capacity is socket.appReadBufSize
             int limit = socketBufferHandler.getReadBuffer().capacity();
             if (to.isDirect() && to.remaining() >= limit) {
-                to.limit(to.position() + limit);
+                ((Buffer)to).limit(to.position() + limit);
                 nRead = fillReadBuffer(block, to);
                 if (log.isDebugEnabled()) {
                     log.debug("Socket: [" + this + "], Read direct from socket: [" + nRead + "]");
@@ -2181,7 +2182,7 @@ public class AprEndpoint extends Abstrac
             }
 
             if (result > 0) {
-                to.position(to.position() + result);
+                ((Buffer)to).position(to.position() + result);
                 return result;
             } else if (result == 0 || -result == Status.EAGAIN) {
                 return 0;
@@ -2303,9 +2304,9 @@ public class AprEndpoint extends Abstrac
                 if (getEndpoint().isSSLEnabled()) {
                     if (sslOutputBuffer.remaining() == 0) {
                         // Buffer was fully written last time around
-                        sslOutputBuffer.clear();
+                        ((Buffer)sslOutputBuffer).clear();
                         transfer(from, sslOutputBuffer);
-                        sslOutputBuffer.flip();
+                        ((Buffer)sslOutputBuffer).flip();
                     } else {
                         // Buffer still has data from previous attempt to write
                         // APR + SSL requires that exactly the same parameters are
@@ -2314,13 +2315,13 @@ public class AprEndpoint extends Abstrac
                     thisTime = Socket.sendb(getSocket().longValue(), sslOutputBuffer,
                             sslOutputBuffer.position(), sslOutputBuffer.limit());
                     if (thisTime > 0) {
-                        sslOutputBuffer.position(sslOutputBuffer.position() + thisTime);
+                        ((Buffer)sslOutputBuffer).position(sslOutputBuffer.position() + thisTime);
                     }
                 } else {
                     thisTime = Socket.sendb(getSocket().longValue(), from, from.position(),
                             from.remaining());
                     if (thisTime > 0) {
-                        from.position(from.position() + thisTime);
+                        ((Buffer)from).position(from.position() + thisTime);
                     }
                 }
                 if (Status.APR_STATUS_IS_EAGAIN(-thisTime)) {
Index: apache-tomcat-9.0.33-src/java/org/apache/tomcat/util/net/Nio2Endpoint.java
===================================================================
--- apache-tomcat-9.0.33-src.orig/java/org/apache/tomcat/util/net/Nio2Endpoint.java
+++ apache-tomcat-9.0.33-src/java/org/apache/tomcat/util/net/Nio2Endpoint.java
@@ -22,6 +22,7 @@ import java.io.IOException;
 import java.net.InetSocketAddress;
 import java.net.SocketAddress;
 import java.net.SocketTimeoutException;
+import java.nio.Buffer;
 import java.nio.ByteBuffer;
 import java.nio.channels.AsynchronousChannelGroup;
 import java.nio.channels.AsynchronousCloseException;
@@ -541,7 +542,7 @@ public class Nio2Endpoint extends Abstra
                         if (nRead > 0) {
                             getSocket().getBufHandler().configureWriteBufferForRead();
                             if (attachment.length < buffer.remaining()) {
-                                buffer.limit(buffer.limit() - buffer.remaining() + (int) attachment.length);
+                                ((Buffer)buffer).limit(buffer.limit() - buffer.remaining() + (int) attachment.length);
                             }
                             attachment.length -= nRead;
                         } else {
@@ -886,7 +887,7 @@ public class Nio2Endpoint extends Abstra
                 // The socket read buffer capacity is socket.appReadBufSize
                 int limit = socketBufferHandler.getReadBuffer().capacity();
                 if (block && to.remaining() >= limit) {
-                    to.limit(to.position() + limit);
+                    ((Buffer)to).limit(to.position() + limit);
                     nRead = fillReadBuffer(block, to);
                     if (log.isDebugEnabled()) {
                         log.debug("Socket: [" + this + "], Read direct from socket: [" + nRead + "]");
Index: apache-tomcat-9.0.33-src/java/org/apache/tomcat/util/net/NioEndpoint.java
===================================================================
--- apache-tomcat-9.0.33-src.orig/java/org/apache/tomcat/util/net/NioEndpoint.java
+++ apache-tomcat-9.0.33-src/java/org/apache/tomcat/util/net/NioEndpoint.java
@@ -23,6 +23,7 @@ import java.io.IOException;
 import java.net.InetAddress;
 import java.net.InetSocketAddress;
 import java.net.SocketTimeoutException;
+import java.nio.Buffer;
 import java.nio.ByteBuffer;
 import java.nio.channels.CancelledKeyException;
 import java.nio.channels.Channel;
@@ -1137,7 +1138,7 @@ public class NioEndpoint extends Abstrac
             // The socket read buffer capacity is socket.appReadBufSize
             int limit = socketBufferHandler.getReadBuffer().capacity();
             if (to.remaining() >= limit) {
-                to.limit(to.position() + limit);
+                ((Buffer)to).limit(to.position() + limit);
                 nRead = fillReadBuffer(block, to);
                 if (log.isDebugEnabled()) {
                     log.debug("Socket: [" + this + "], Read direct from socket: [" + nRead + "]");
Index: apache-tomcat-9.0.33-src/java/org/apache/tomcat/util/net/openssl/OpenSSLEngine.java
===================================================================
--- apache-tomcat-9.0.33-src.orig/java/org/apache/tomcat/util/net/openssl/OpenSSLEngine.java
+++ apache-tomcat-9.0.33-src/java/org/apache/tomcat/util/net/openssl/OpenSSLEngine.java
@@ -16,6 +16,7 @@
  */
 package org.apache.tomcat.util.net.openssl;
 
+import java.nio.Buffer;
 import java.nio.ByteBuffer;
 import java.nio.ReadOnlyBufferException;
 import java.security.Principal;
@@ -40,7 +41,7 @@ import javax.net.ssl.SSLSessionContext;
 
 import org.apache.juli.logging.Log;
 import org.apache.juli.logging.LogFactory;
-import org.apache.tomcat.jni.Buffer;
+// import org.apache.tomcat.jni.Buffer;
 import org.apache.tomcat.jni.Pool;
 import org.apache.tomcat.jni.SSL;
 import org.apache.tomcat.jni.SSLContext;
@@ -130,7 +131,7 @@ public final class OpenSSLEngine extends
 
     private static final String INVALID_CIPHER = "SSL_NULL_WITH_NULL_NULL";
 
-    private static final long EMPTY_ADDR = Buffer.address(ByteBuffer.allocate(0));
+    private static final long EMPTY_ADDR = org.apache.tomcat.jni.Buffer.address(ByteBuffer.allocate(0));
 
     // OpenSSL state
     private final long ssl;
@@ -242,10 +243,10 @@ public final class OpenSSLEngine extends
         final int sslWrote;
 
         if (src.isDirect()) {
-            final long addr = Buffer.address(src) + pos;
+            final long addr = org.apache.tomcat.jni.Buffer.address(src) + pos;
             sslWrote = SSL.writeToSSL(ssl, addr, len);
             if (sslWrote >= 0) {
-                src.position(pos + sslWrote);
+                ((Buffer)src).position(pos + sslWrote);
                 return sslWrote;
             }
         } else {
@@ -253,17 +254,17 @@ public final class OpenSSLEngine extends
             try {
                 final long addr = memoryAddress(buf);
 
-                src.limit(pos + len);
+                ((Buffer)src).limit(pos + len);
 
                 buf.put(src);
-                src.limit(limit);
+                ((Buffer)src).limit(limit);
 
                 sslWrote = SSL.writeToSSL(ssl, addr, len);
                 if (sslWrote >= 0) {
-                    src.position(pos + sslWrote);
+                    ((Buffer)src).position(pos + sslWrote);
                     return sslWrote;
                 } else {
-                    src.position(pos);
+                    ((Buffer)src).position(pos);
                 }
             } finally {
                 buf.clear();
@@ -282,10 +283,10 @@ public final class OpenSSLEngine extends
         final int pos = src.position();
         final int len = src.remaining();
         if (src.isDirect()) {
-            final long addr = Buffer.address(src) + pos;
+            final long addr = org.apache.tomcat.jni.Buffer.address(src) + pos;
             final int netWrote = SSL.writeToBIO(networkBIO, addr, len);
             if (netWrote >= 0) {
-                src.position(pos + netWrote);
+                ((Buffer)src).position(pos + netWrote);
                 return netWrote;
             }
         } else {
@@ -297,10 +298,10 @@ public final class OpenSSLEngine extends
 
                 final int netWrote = SSL.writeToBIO(networkBIO, addr, len);
                 if (netWrote >= 0) {
-                    src.position(pos + netWrote);
+                    ((Buffer)src).position(pos + netWrote);
                     return netWrote;
                 } else {
-                    src.position(pos);
+                    ((Buffer)src).position(pos);
                 }
             } finally {
                 buf.clear();
@@ -317,11 +318,11 @@ public final class OpenSSLEngine extends
     private static int readPlaintextData(final long ssl, final ByteBuffer dst) {
         if (dst.isDirect()) {
             final int pos = dst.position();
-            final long addr = Buffer.address(dst) + pos;
+            final long addr = org.apache.tomcat.jni.Buffer.address(dst) + pos;
             final int len = dst.limit() - pos;
             final int sslRead = SSL.readFromSSL(ssl, addr, len);
             if (sslRead > 0) {
-                dst.position(pos + sslRead);
+                ((Buffer)dst).position(pos + sslRead);
                 return sslRead;
             }
         } else {
@@ -335,9 +336,9 @@ public final class OpenSSLEngine extends
                 final int sslRead = SSL.readFromSSL(ssl, addr, len);
                 if (sslRead > 0) {
                     buf.limit(sslRead);
-                    dst.limit(pos + sslRead);
+                    ((Buffer)dst).limit(pos + sslRead);
                     dst.put(buf);
-                    dst.limit(limit);
+                    ((Buffer)dst).limit(limit);
                     return sslRead;
                 }
             } finally {
@@ -355,10 +356,10 @@ public final class OpenSSLEngine extends
     private static int readEncryptedData(final long networkBIO, final ByteBuffer dst, final int pending) {
         if (dst.isDirect() && dst.remaining() >= pending) {
             final int pos = dst.position();
-            final long addr = Buffer.address(dst) + pos;
+            final long addr = org.apache.tomcat.jni.Buffer.address(dst) + pos;
             final int bioRead = SSL.readFromBIO(networkBIO, addr, pending);
             if (bioRead > 0) {
-                dst.position(pos + bioRead);
+                ((Buffer)dst).position(pos + bioRead);
                 return bioRead;
             }
         } else {
@@ -370,9 +371,9 @@ public final class OpenSSLEngine extends
                 if (bioRead > 0) {
                     buf.limit(bioRead);
                     int oldLimit = dst.limit();
-                    dst.limit(dst.position() + bioRead);
+                    ((Buffer)dst).limit(dst.position() + bioRead);
                     dst.put(buf);
-                    dst.limit(oldLimit);
+                    ((Buffer)dst).limit(oldLimit);
                     return bioRead;
                 }
             } finally {
@@ -963,7 +964,7 @@ public final class OpenSSLEngine extends
 
 
     private static long memoryAddress(ByteBuffer buf) {
-        return Buffer.address(buf);
+        return org.apache.tomcat.jni.Buffer.address(buf);
     }
 
     private SSLEngineResult.Status getEngineStatus() {
Index: apache-tomcat-9.0.33-src/java/org/apache/tomcat/util/net/SecureNio2Channel.java
===================================================================
--- apache-tomcat-9.0.33-src.orig/java/org/apache/tomcat/util/net/SecureNio2Channel.java
+++ apache-tomcat-9.0.33-src/java/org/apache/tomcat/util/net/SecureNio2Channel.java
@@ -18,6 +18,7 @@ package org.apache.tomcat.util.net;
 
 import java.io.EOFException;
 import java.io.IOException;
+import java.nio.Buffer;
 import java.nio.ByteBuffer;
 import java.nio.channels.AsynchronousSocketChannel;
 import java.nio.channels.CompletionHandler;
@@ -133,7 +134,7 @@ public class SecureNio2Channel extends N
         unwrapBeforeRead = true;
         closed = false;
         closing = false;
-        netInBuffer.clear();
+        ((Buffer)netInBuffer).clear();
     }
 
     @Override
@@ -323,7 +324,7 @@ public class SecureNio2Channel extends N
                     } else if (handshake.getStatus() == Status.BUFFER_UNDERFLOW) {
                         if (netInBuffer.position() == netInBuffer.limit()) {
                             //clear the buffer if we have emptied it out on data
-                            netInBuffer.clear();
+                            ((Buffer)netInBuffer).clear();
                         }
                         //read more data
                         if (async) {
@@ -418,9 +419,9 @@ public class SecureNio2Channel extends N
             clientRequestedCiphers = Collections.emptyList();
             break;
         case NON_SECURE:
-            netOutBuffer.clear();
+            ((Buffer)netOutBuffer).clear();
             netOutBuffer.put(TLSClientHelloExtractor.USE_TLS_RESPONSE);
-            netOutBuffer.flip();
+            ((Buffer)netOutBuffer).flip();
             flush();
             throw new IOException(sm.getString("channel.nio.ssl.foundHttp"));
         }
@@ -444,8 +445,8 @@ public class SecureNio2Channel extends N
         netOutBuffer = ByteBufferUtils.expand(netOutBuffer, sslEngine.getSession().getPacketBufferSize());
 
         // Set limit and position to expected values
-        netOutBuffer.position(0);
-        netOutBuffer.limit(0);
+        ((Buffer)netOutBuffer).position(0);
+        ((Buffer)netOutBuffer).limit(0);
 
         // Initiate handshake
         sslEngine.beginHandshake();
@@ -469,10 +470,10 @@ public class SecureNio2Channel extends N
         if (!getBufHandler().isReadBufferEmpty()) throw new IOException(sm.getString("channel.nio.ssl.appInputNotEmpty"));
         if (!getBufHandler().isWriteBufferEmpty()) throw new IOException(sm.getString("channel.nio.ssl.appOutputNotEmpty"));
 
-        netOutBuffer.position(0);
-        netOutBuffer.limit(0);
-        netInBuffer.position(0);
-        netInBuffer.limit(0);
+        ((Buffer)netOutBuffer).position(0);
+        ((Buffer)netOutBuffer).limit(0);
+        ((Buffer)netInBuffer).position(0);
+        ((Buffer)netInBuffer).limit(0);
         getBufHandler().reset();
 
         handshakeComplete = false;
@@ -521,12 +522,12 @@ public class SecureNio2Channel extends N
     protected SSLEngineResult handshakeWrap() throws IOException {
         //this should never be called with a network buffer that contains data
         //so we can clear it here.
-        netOutBuffer.clear();
+        ((Buffer)netOutBuffer).clear();
         //perform the wrap
         getBufHandler().configureWriteBufferForRead();
         SSLEngineResult result = sslEngine.wrap(getBufHandler().getWriteBuffer(), netOutBuffer);
         //prepare the results to be written
-        netOutBuffer.flip();
+        ((Buffer)netOutBuffer).flip();
         //set the status
         handshakeStatus = result.getHandshakeStatus();
         return result;
@@ -543,7 +544,7 @@ public class SecureNio2Channel extends N
         //loop while we can perform pure SSLEngine data
         do {
             //prepare the buffer with the incoming data
-            netInBuffer.flip();
+            ((Buffer)netInBuffer).flip();
             //call unwrap
             getBufHandler().configureReadBufferForWrite();
             result = sslEngine.unwrap(netInBuffer, getBufHandler().getReadBuffer());
@@ -601,7 +602,7 @@ public class SecureNio2Channel extends N
             throw new IOException(sm.getString("channel.nio.ssl.pendingWriteDuringClose"), e);
         }
         //prep the buffer for the close message
-        netOutBuffer.clear();
+        ((Buffer)netOutBuffer).clear();
         //perform the close, since we called sslEngine.closeOutbound
         SSLEngineResult handshake = sslEngine.wrap(getEmptyBuf(), netOutBuffer);
         //we should be in a close state
@@ -609,7 +610,7 @@ public class SecureNio2Channel extends N
             throw new IOException(sm.getString("channel.nio.ssl.invalidCloseState"));
         }
         //prepare the buffer for writing
-        netOutBuffer.flip();
+        ((Buffer)netOutBuffer).flip();
         //if there is data to be written
         try {
             if (timeout > 0) {
@@ -711,7 +712,7 @@ public class SecureNio2Channel extends N
             SSLEngineResult unwrap;
             do {
                 //prepare the buffer
-                netInBuffer.flip();
+                ((Buffer)netInBuffer).flip();
                 //unwrap the data
                 try {
                     unwrap = sslEngine.unwrap(netInBuffer, dst);
@@ -854,10 +855,10 @@ public class SecureNio2Channel extends N
         protected void wrap() {
             try {
                 if (!netOutBuffer.hasRemaining()) {
-                    netOutBuffer.clear();
+                    ((Buffer)netOutBuffer).clear();
                     SSLEngineResult result = sslEngine.wrap(src, netOutBuffer);
                     written = result.bytesConsumed();
-                    netOutBuffer.flip();
+                    ((Buffer)netOutBuffer).flip();
                     if (result.getStatus() == Status.OK) {
                         if (result.getHandshakeStatus() == HandshakeStatus.NEED_TASK)
                             tasks();
@@ -909,7 +910,7 @@ public class SecureNio2Channel extends N
                         SSLEngineResult unwrap;
                         do {
                             //prepare the buffer
-                            netInBuffer.flip();
+                            ((Buffer)netInBuffer).flip();
                             //unwrap the data
                             unwrap = sslEngine.unwrap(netInBuffer, dst2);
                             //compact the buffer
@@ -1017,7 +1018,7 @@ public class SecureNio2Channel extends N
                                 overflowState = OverflowState.DONE;
                             }
                             //prepare the buffer
-                            netInBuffer.flip();
+                            ((Buffer)netInBuffer).flip();
                             //unwrap the data
                             unwrap = sslEngine.unwrap(netInBuffer, dsts2, offset, length2);
                             //compact the buffer
@@ -1137,11 +1138,11 @@ public class SecureNio2Channel extends N
         }
         try {
             // Prepare the output buffer
-            netOutBuffer.clear();
+            ((Buffer)netOutBuffer).clear();
             // Wrap the source data into the internal buffer
             SSLEngineResult result = sslEngine.wrap(src, netOutBuffer);
             final int written = result.bytesConsumed();
-            netOutBuffer.flip();
+            ((Buffer)netOutBuffer).flip();
             if (result.getStatus() == Status.OK) {
                 if (result.getHandshakeStatus() == HandshakeStatus.NEED_TASK) {
                     tasks();
@@ -1191,11 +1192,11 @@ public class SecureNio2Channel extends N
         }
         try {
              // Prepare the output buffer
-            netOutBuffer.clear();
+            ((Buffer)netOutBuffer).clear();
             // Wrap the source data into the internal buffer
             SSLEngineResult result = sslEngine.wrap(srcs, offset, length, netOutBuffer);
             final int written = result.bytesConsumed();
-            netOutBuffer.flip();
+            ((Buffer)netOutBuffer).flip();
             if (result.getStatus() == Status.OK) {
                 if (result.getHandshakeStatus() == HandshakeStatus.NEED_TASK) {
                     tasks();
Index: apache-tomcat-9.0.33-src/java/org/apache/tomcat/util/net/SecureNioChannel.java
===================================================================
--- apache-tomcat-9.0.33-src.orig/java/org/apache/tomcat/util/net/SecureNioChannel.java
+++ apache-tomcat-9.0.33-src/java/org/apache/tomcat/util/net/SecureNioChannel.java
@@ -19,6 +19,7 @@ package org.apache.tomcat.util.net;
 import java.io.EOFException;
 import java.io.IOException;
 import java.net.SocketTimeoutException;
+import java.nio.Buffer;
 import java.nio.ByteBuffer;
 import java.nio.channels.SelectionKey;
 import java.nio.channels.Selector;
@@ -95,7 +96,7 @@ public class SecureNioChannel extends Ni
         handshakeComplete = false;
         closed = false;
         closing = false;
-        netInBuffer.clear();
+        ((Buffer)netInBuffer).clear();
     }
 
     @Override
@@ -315,9 +316,9 @@ public class SecureNioChannel extends Ni
             clientRequestedCiphers = Collections.emptyList();
             break;
         case NON_SECURE:
-            netOutBuffer.clear();
+            ((Buffer)netOutBuffer).clear();
             netOutBuffer.put(TLSClientHelloExtractor.USE_TLS_RESPONSE);
-            netOutBuffer.flip();
+            ((Buffer)netOutBuffer).flip();
             flushOutbound();
             throw new IOException(sm.getString("channel.nio.ssl.foundHttp"));
         }
@@ -341,8 +342,8 @@ public class SecureNioChannel extends Ni
         netOutBuffer = ByteBufferUtils.expand(netOutBuffer, sslEngine.getSession().getPacketBufferSize());
 
         // Set limit and position to expected values
-        netOutBuffer.position(0);
-        netOutBuffer.limit(0);
+        ((Buffer)netOutBuffer).position(0);
+        ((Buffer)netOutBuffer).limit(0);
 
         // Initiate handshake
         sslEngine.beginHandshake();
@@ -454,12 +455,12 @@ public class SecureNioChannel extends Ni
     protected SSLEngineResult handshakeWrap(boolean doWrite) throws IOException {
         //this should never be called with a network buffer that contains data
         //so we can clear it here.
-        netOutBuffer.clear();
+        ((Buffer)netOutBuffer).clear();
         //perform the wrap
         getBufHandler().configureWriteBufferForRead();
         SSLEngineResult result = sslEngine.wrap(getBufHandler().getWriteBuffer(), netOutBuffer);
         //prepare the results to be written
-        netOutBuffer.flip();
+        ((Buffer)netOutBuffer).flip();
         //set the status
         handshakeStatus = result.getHandshakeStatus();
         //optimization, if we do have a writable channel, write it now
@@ -479,7 +480,7 @@ public class SecureNioChannel extends Ni
 
         if (netInBuffer.position() == netInBuffer.limit()) {
             //clear the buffer if we have emptied it out on data
-            netInBuffer.clear();
+            ((Buffer)netInBuffer).clear();
         }
         if (doread)  {
             //if we have data to read, read it
@@ -493,7 +494,7 @@ public class SecureNioChannel extends Ni
         //loop while we can perform pure SSLEngine data
         do {
             //prepare the buffer with the incoming data
-            netInBuffer.flip();
+            ((Buffer)netInBuffer).flip();
             //call unwrap
             getBufHandler().configureReadBufferForWrite();
             result = sslEngine.unwrap(netInBuffer, getBufHandler().getReadBuffer());
@@ -537,7 +538,7 @@ public class SecureNioChannel extends Ni
             throw new IOException(sm.getString("channel.nio.ssl.remainingDataDuringClose"));
         }
         //prep the buffer for the close message
-        netOutBuffer.clear();
+        ((Buffer)netOutBuffer).clear();
         //perform the close, since we called sslEngine.closeOutbound
         SSLEngineResult handshake = sslEngine.wrap(getEmptyBuf(), netOutBuffer);
         //we should be in a close state
@@ -545,7 +546,7 @@ public class SecureNioChannel extends Ni
             throw new IOException(sm.getString("channel.nio.ssl.invalidCloseState"));
         }
         //prepare the buffer for writing
-        netOutBuffer.flip();
+        ((Buffer)netOutBuffer).flip();
         //if there is data to be written
         flush(netOutBuffer);
 
@@ -612,7 +613,7 @@ public class SecureNioChannel extends Ni
         SSLEngineResult unwrap;
         do {
             //prepare the buffer
-            netInBuffer.flip();
+            ((Buffer)netInBuffer).flip();
             //unwrap the data
             unwrap = sslEngine.unwrap(netInBuffer, dst);
             //compact the buffer
@@ -689,7 +690,7 @@ public class SecureNioChannel extends Ni
                 overflowState = OverflowState.DONE;
             }
             //prepare the buffer
-            netInBuffer.flip();
+            ((Buffer)netInBuffer).flip();
             //unwrap the data
             unwrap = sslEngine.unwrap(netInBuffer, dsts, offset, length);
             //compact the buffer
@@ -797,12 +798,12 @@ public class SecureNioChannel extends Ni
             }
 
             // The data buffer is empty, we can reuse the entire buffer.
-            netOutBuffer.clear();
+            ((Buffer)netOutBuffer).clear();
 
             SSLEngineResult result = sslEngine.wrap(src, netOutBuffer);
             // The number of bytes written
             int written = result.bytesConsumed();
-            netOutBuffer.flip();
+            ((Buffer)netOutBuffer).flip();
 
             if (result.getStatus() == Status.OK) {
                 if (result.getHandshakeStatus() == HandshakeStatus.NEED_TASK) {
@@ -834,12 +835,12 @@ public class SecureNioChannel extends Ni
         }
 
         // The data buffer is empty, we can reuse the entire buffer.
-        netOutBuffer.clear();
+        ((Buffer)netOutBuffer).clear();
 
         SSLEngineResult result = sslEngine.wrap(srcs, offset, length, netOutBuffer);
         // The number of bytes written
         int written = result.bytesConsumed();
-        netOutBuffer.flip();
+        ((Buffer)netOutBuffer).flip();
 
         if (result.getStatus() == Status.OK) {
             if (result.getHandshakeStatus() == HandshakeStatus.NEED_TASK) tasks();
Index: apache-tomcat-9.0.33-src/java/org/apache/tomcat/util/net/SocketBufferHandler.java
===================================================================
--- apache-tomcat-9.0.33-src.orig/java/org/apache/tomcat/util/net/SocketBufferHandler.java
+++ apache-tomcat-9.0.33-src/java/org/apache/tomcat/util/net/SocketBufferHandler.java
@@ -17,6 +17,7 @@
 package org.apache.tomcat.util.net;
 
 import java.nio.BufferOverflowException;
+import java.nio.Buffer;
 import java.nio.ByteBuffer;
 
 import org.apache.tomcat.util.buf.ByteBufferUtils;
@@ -67,13 +68,13 @@ public class SocketBufferHandler {
                 // Switching to write
                 int remaining = readBuffer.remaining();
                 if (remaining == 0) {
-                    readBuffer.clear();
+                    ((Buffer)readBuffer).clear();
                 } else {
                     readBuffer.compact();
                 }
             } else {
                 // Switching to read
-                readBuffer.flip();
+                ((Buffer)readBuffer).flip();
             }
             this.readBufferConfiguredForWrite = readBufferConFiguredForWrite;
         }
@@ -160,15 +161,15 @@ public class SocketBufferHandler {
                 // Switching to write
                 int remaining = writeBuffer.remaining();
                 if (remaining == 0) {
-                    writeBuffer.clear();
+                    ((Buffer)writeBuffer).clear();
                 } else {
                     writeBuffer.compact();
-                    writeBuffer.position(remaining);
-                    writeBuffer.limit(writeBuffer.capacity());
+                    ((Buffer)writeBuffer).position(remaining);
+                    ((Buffer)writeBuffer).limit(writeBuffer.capacity());
                 }
             } else {
                 // Switching to read
-                writeBuffer.flip();
+                ((Buffer)writeBuffer).flip();
             }
             this.writeBufferConfiguredForWrite = writeBufferConfiguredForWrite;
         }
@@ -199,9 +200,9 @@ public class SocketBufferHandler {
 
 
     public void reset() {
-        readBuffer.clear();
+        ((Buffer)readBuffer).clear();
         readBufferConfiguredForWrite = true;
-        writeBuffer.clear();
+        ((Buffer)writeBuffer).clear();
         writeBufferConfiguredForWrite = true;
     }
 
Index: apache-tomcat-9.0.33-src/java/org/apache/tomcat/util/net/SocketWrapperBase.java
===================================================================
--- apache-tomcat-9.0.33-src.orig/java/org/apache/tomcat/util/net/SocketWrapperBase.java
+++ apache-tomcat-9.0.33-src/java/org/apache/tomcat/util/net/SocketWrapperBase.java
@@ -19,6 +19,7 @@ package org.apache.tomcat.util.net;
 import java.io.EOFException;
 import java.io.IOException;
 import java.net.SocketTimeoutException;
+import java.nio.Buffer;
 import java.nio.ByteBuffer;
 import java.nio.channels.CompletionHandler;
 import java.nio.channels.InterruptedByTimeoutException;
@@ -1467,9 +1468,9 @@ public abstract class SocketWrapperBase<
         int max = Math.min(from.remaining(), to.remaining());
         if (max > 0) {
             int fromLimit = from.limit();
-            from.limit(from.position() + max);
+            ((Buffer)from).limit(from.position() + max);
             to.put(from);
-            from.limit(fromLimit);
+            ((Buffer)from).limit(fromLimit);
         }
         return max;
     }
Index: apache-tomcat-9.0.33-src/java/org/apache/tomcat/util/net/TLSClientHelloExtractor.java
===================================================================
--- apache-tomcat-9.0.33-src.orig/java/org/apache/tomcat/util/net/TLSClientHelloExtractor.java
+++ apache-tomcat-9.0.33-src/java/org/apache/tomcat/util/net/TLSClientHelloExtractor.java
@@ -17,6 +17,7 @@
 package org.apache.tomcat.util.net;
 
 import java.io.IOException;
+import java.nio.Buffer;
 import java.nio.BufferUnderflowException;
 import java.nio.ByteBuffer;
 import java.nio.charset.StandardCharsets;
@@ -76,7 +77,7 @@ public class TLSClientHelloExtractor {
         String sniValue = null;
         try {
             // Switch to read mode.
-            netInBuffer.flip();
+            ((Buffer)netInBuffer).flip();
 
             // A complete TLS record header is required before we can figure out
             // how many bytes there are in the record.
@@ -164,8 +165,8 @@ public class TLSClientHelloExtractor {
             this.clientRequestedApplicationProtocols = clientRequestedApplicationProtocols;
             this.sniValue = sniValue;
             // Whatever happens, return the buffer to its original state
-            netInBuffer.limit(limit);
-            netInBuffer.position(pos);
+            ((Buffer)netInBuffer).limit(limit);
+            ((Buffer)netInBuffer).position(pos);
         }
     }
 
@@ -215,7 +216,7 @@ public class TLSClientHelloExtractor {
 
     private static boolean isAvailable(ByteBuffer bb, int size) {
         if (bb.remaining() < size) {
-            bb.position(bb.limit());
+            ((Buffer)bb).position(bb.limit());
             return false;
         }
         return true;
@@ -243,7 +244,7 @@ public class TLSClientHelloExtractor {
         //       the buffer contains a correctly formatted HTTP request line.
         //       The method, target and protocol are not validated.
         byte chr = 0;
-        bb.position(0);
+        ((Buffer)bb).position(0);
 
         // Skip blank lines
         do {
@@ -324,7 +325,7 @@ public class TLSClientHelloExtractor {
 
 
     private static void skipBytes(ByteBuffer bb, int size) {
-        bb.position(bb.position() + size);
+        ((Buffer)bb).position(bb.position() + size);
     }
 
 
Index: apache-tomcat-9.0.33-src/java/org/apache/tomcat/util/net/WriteBuffer.java
===================================================================
--- apache-tomcat-9.0.33-src.orig/java/org/apache/tomcat/util/net/WriteBuffer.java
+++ apache-tomcat-9.0.33-src/java/org/apache/tomcat/util/net/WriteBuffer.java
@@ -17,6 +17,7 @@
 package org.apache.tomcat.util.net;
 
 import java.io.IOException;
+import java.nio.Buffer;
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.Iterator;
Index: apache-tomcat-9.0.33-src/java/org/apache/tomcat/websocket/AsyncChannelWrapperSecure.java
===================================================================
--- apache-tomcat-9.0.33-src.orig/java/org/apache/tomcat/websocket/AsyncChannelWrapperSecure.java
+++ apache-tomcat-9.0.33-src/java/org/apache/tomcat/websocket/AsyncChannelWrapperSecure.java
@@ -18,6 +18,7 @@ package org.apache.tomcat.websocket;
 
 import java.io.EOFException;
 import java.io.IOException;
+import java.nio.Buffer;
 import java.nio.ByteBuffer;
 import java.nio.channels.AsynchronousSocketChannel;
 import java.nio.channels.CompletionHandler;
@@ -189,7 +190,7 @@ public class AsyncChannelWrapperSecure i
                 for (int i = offset; i < offset + length; i++) {
                     ByteBuffer src = srcs[i];
                     while (src.hasRemaining()) {
-                        socketWriteBuffer.clear();
+                        ((Buffer)socketWriteBuffer).clear();
 
                         // Encrypt the data
                         SSLEngineResult r = sslEngine.wrap(src, socketWriteBuffer);
@@ -215,7 +216,7 @@ public class AsyncChannelWrapperSecure i
                             }
                         }
 
-                        socketWriteBuffer.flip();
+                        ((Buffer)socketWriteBuffer).flip();
 
                         // Do the write
                         int toWrite = r.bytesProduced();
@@ -272,7 +273,7 @@ public class AsyncChannelWrapperSecure i
                         }
                     }
 
-                    socketReadBuffer.flip();
+                    ((Buffer)socketReadBuffer).flip();
 
                     if (socketReadBuffer.hasRemaining()) {
                         // Decrypt the data in the buffer
@@ -358,7 +359,7 @@ public class AsyncChannelWrapperSecure i
             try {
                 sslEngine.beginHandshake();
                 // So the first compact does the right thing
-                socketReadBuffer.position(socketReadBuffer.limit());
+                ((Buffer)socketReadBuffer).position(socketReadBuffer.limit());
 
                 handshakeStatus = sslEngine.getHandshakeStatus();
                 resultStatus = Status.OK;
@@ -368,11 +369,11 @@ public class AsyncChannelWrapperSecure i
                 while(handshaking) {
                     switch (handshakeStatus) {
                         case NEED_WRAP: {
-                            socketWriteBuffer.clear();
+                            ((Buffer)socketWriteBuffer).clear();
                             SSLEngineResult r =
                                     sslEngine.wrap(DUMMY, socketWriteBuffer);
                             checkResult(r, true);
-                            socketWriteBuffer.flip();
+                            ((Buffer)socketWriteBuffer).flip();
                             Future<Integer> fWrite =
                                     socketChannel.write(socketWriteBuffer);
                             fWrite.get();
@@ -386,7 +387,7 @@ public class AsyncChannelWrapperSecure i
                                         socketChannel.read(socketReadBuffer);
                                 fRead.get();
                             }
-                            socketReadBuffer.flip();
+                            ((Buffer)socketReadBuffer).flip();
                             SSLEngineResult r =
                                     sslEngine.unwrap(socketReadBuffer, DUMMY);
                             checkResult(r, false);
Index: apache-tomcat-9.0.33-src/java/org/apache/tomcat/websocket/PerMessageDeflate.java
===================================================================
--- apache-tomcat-9.0.33-src.orig/java/org/apache/tomcat/websocket/PerMessageDeflate.java
+++ apache-tomcat-9.0.33-src/java/org/apache/tomcat/websocket/PerMessageDeflate.java
@@ -17,6 +17,7 @@
 package org.apache.tomcat.websocket;
 
 import java.io.IOException;
+import java.nio.Buffer;
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.List;
@@ -207,11 +208,11 @@ public class PerMessageDeflate implement
             } catch (NullPointerException e) {
                 throw new IOException(sm.getString("perMessageDeflate.alreadyClosed"), e);
             }
-            dest.position(dest.position() + written);
+            ((Buffer)dest).position(dest.position() + written);
 
             if (inflater.needsInput() && !usedEomBytes ) {
                 if (dest.hasRemaining()) {
-                    readBuffer.clear();
+                    ((Buffer)readBuffer).clear();
                     TransformationResult nextResult =
                             next.getMoreData(opCode, fin, (rsv ^ RSV_BITMASK), readBuffer);
                     inflater.setInput(
@@ -355,7 +356,7 @@ public class PerMessageDeflate implement
                         int written = deflater.deflate(compressedPayload.array(),
                                 compressedPayload.arrayOffset() + compressedPayload.position(),
                                 compressedPayload.remaining(), flush);
-                        compressedPayload.position(compressedPayload.position() + written);
+                        ((Buffer)compressedPayload).position(compressedPayload.position() + written);
                     } catch (NullPointerException e) {
                         throw new IOException(sm.getString("perMessageDeflate.alreadyClosed"), e);
                     }
@@ -375,7 +376,7 @@ public class PerMessageDeflate implement
                     writeBuffer = ByteBuffer.allocate(Constants.DEFAULT_BUFFER_SIZE);
 
                     // Flip the compressed payload ready for writing
-                    compressedPayload.flip();
+                    ((Buffer)compressedPayload).flip();
 
                     boolean fin = uncompressedPart.isFin();
                     boolean full = compressedPayload.limit() == compressedPayload.capacity();
@@ -384,7 +385,7 @@ public class PerMessageDeflate implement
 
                     if (fin && !full && needsInput) {
                         // End of compressed message. Drop EOM bytes and output.
-                        compressedPayload.limit(compressedPayload.limit() - EOM_BYTES.length);
+                        ((Buffer)compressedPayload).limit(compressedPayload.limit() - EOM_BYTES.length);
                         compressedPart = new MessagePart(true, getRsv(uncompressedPart),
                                 opCode, compressedPayload, uncompressedIntermediateHandler,
                                 uncompressedIntermediateHandler, blockingWriteTimeoutExpiry);
@@ -419,7 +420,7 @@ public class PerMessageDeflate implement
                         }
                         if (eomBufferWritten < EOM_BUFFER.length) {
                             // EOM has just been completed
-                            compressedPayload.limit(compressedPayload.limit() - EOM_BYTES.length + eomBufferWritten);
+                            ((Buffer)compressedPayload).limit(compressedPayload.limit() - EOM_BYTES.length + eomBufferWritten);
                             compressedPart = new MessagePart(true,
                                     getRsv(uncompressedPart), opCode, compressedPayload,
                                     uncompressedIntermediateHandler, uncompressedIntermediateHandler,
Index: apache-tomcat-9.0.33-src/java/org/apache/tomcat/websocket/server/WsFrameServer.java
===================================================================
--- apache-tomcat-9.0.33-src.orig/java/org/apache/tomcat/websocket/server/WsFrameServer.java
+++ apache-tomcat-9.0.33-src/java/org/apache/tomcat/websocket/server/WsFrameServer.java
@@ -19,6 +19,7 @@ package org.apache.tomcat.websocket.serv
 import java.io.EOFException;
 import java.io.IOException;
 import java.nio.ByteBuffer;
+import java.nio.Buffer;
 
 import org.apache.juli.logging.Log;
 import org.apache.juli.logging.LogFactory;
@@ -67,10 +68,10 @@ public class WsFrameServer extends WsFra
 
         while (isOpen() && !isSuspended()) {
             // Fill up the input buffer with as much data as we can
-            inputBuffer.mark();
-            inputBuffer.position(inputBuffer.limit()).limit(inputBuffer.capacity());
+            ((Buffer)inputBuffer).mark();
+            ((Buffer)inputBuffer).position(inputBuffer.limit()).limit(inputBuffer.capacity());
             int read = socketWrapper.read(false, inputBuffer);
-            inputBuffer.limit(inputBuffer.position()).reset();
+            ((Buffer)inputBuffer).limit(inputBuffer.position()).reset();
             if (read < 0) {
                 throw new EOFException();
             } else if (read == 0) {
Index: apache-tomcat-9.0.33-src/java/org/apache/tomcat/websocket/WsFrameBase.java
===================================================================
--- apache-tomcat-9.0.33-src.orig/java/org/apache/tomcat/websocket/WsFrameBase.java
+++ apache-tomcat-9.0.33-src/java/org/apache/tomcat/websocket/WsFrameBase.java
@@ -17,6 +17,7 @@
 package org.apache.tomcat.websocket;
 
 import java.io.IOException;
+import java.nio.Buffer;
 import java.nio.ByteBuffer;
 import java.nio.CharBuffer;
 import java.nio.charset.CharsetDecoder;
@@ -91,7 +92,7 @@ public abstract class WsFrameBase {
 
     public WsFrameBase(WsSession wsSession, Transformation transformation) {
         inputBuffer = ByteBuffer.allocate(Constants.DEFAULT_BUFFER_SIZE);
-        inputBuffer.position(0).limit(0);
+        ((Buffer)inputBuffer).position(0).limit(0);
         messageBufferBinary = ByteBuffer.allocate(wsSession.getMaxBinaryMessageBufferSize());
         messageBufferText = CharBuffer.allocate(wsSession.getMaxTextMessageBufferSize());
         wsSession.setWsFrame(this);
@@ -257,11 +258,11 @@ public abstract class WsFrameBase {
         if (payloadLength == 126) {
             payloadLength = byteArrayToLong(inputBuffer.array(),
                     inputBuffer.arrayOffset() + inputBuffer.position(), 2);
-            inputBuffer.position(inputBuffer.position() + 2);
+            ((Buffer)inputBuffer).position(inputBuffer.position() + 2);
         } else if (payloadLength == 127) {
             payloadLength = byteArrayToLong(inputBuffer.array(),
                     inputBuffer.arrayOffset() + inputBuffer.position(), 8);
-            inputBuffer.position(inputBuffer.position() + 8);
+            ((Buffer)inputBuffer).position(inputBuffer.position() + 8);
         }
         if (Util.isControl(opCode)) {
             if (payloadLength > 125) {
@@ -313,13 +314,13 @@ public abstract class WsFrameBase {
         // Control messages have fixed message size so
         // TransformationResult.OVERFLOW is not possible here
 
-        controlBufferBinary.flip();
+        ((Buffer)controlBufferBinary).flip();
         if (opCode == Constants.OPCODE_CLOSE) {
             open = false;
             String reason = null;
             int code = CloseCodes.NORMAL_CLOSURE.getCode();
             if (controlBufferBinary.remaining() == 1) {
-                controlBufferBinary.clear();
+                ((Buffer)controlBufferBinary).clear();
                 // Payload must be zero or 2+ bytes long
                 throw new WsIOException(new CloseReason(
                         CloseCodes.PROTOCOL_ERROR,
@@ -331,8 +332,8 @@ public abstract class WsFrameBase {
                     CoderResult cr = utf8DecoderControl.decode(controlBufferBinary,
                             controlBufferText, true);
                     if (cr.isError()) {
-                        controlBufferBinary.clear();
-                        controlBufferText.clear();
+                        ((Buffer)controlBufferBinary).clear();
+                        ((Buffer)controlBufferText).clear();
                         throw new WsIOException(new CloseReason(
                                 CloseCodes.PROTOCOL_ERROR,
                                 sm.getString("wsFrame.invalidUtf8Close")));
@@ -340,7 +341,7 @@ public abstract class WsFrameBase {
                     // There will be no overflow as the output buffer is big
                     // enough. There will be no underflow as all the data is
                     // passed to the decoder in a single call.
-                    controlBufferText.flip();
+                    ((Buffer)controlBufferText).flip();
                     reason = controlBufferText.toString();
                 }
             }
@@ -357,17 +358,17 @@ public abstract class WsFrameBase {
                 } catch (Throwable t) {
                     handleThrowableOnSend(t);
                 } finally {
-                    controlBufferBinary.clear();
+                    ((Buffer)controlBufferBinary).clear();
                 }
             }
         } else {
             // Should have caught this earlier but just in case...
-            controlBufferBinary.clear();
+            ((Buffer)controlBufferBinary).clear();
             throw new WsIOException(new CloseReason(
                     CloseCodes.PROTOCOL_ERROR,
                     sm.getString("wsFrame.invalidOpCode", Integer.valueOf(opCode))));
         }
-        controlBufferBinary.clear();
+        ((Buffer)controlBufferBinary).clear();
         newFrame();
         return true;
     }
@@ -397,7 +398,7 @@ public abstract class WsFrameBase {
         } catch (Throwable t) {
             handleThrowableOnSend(t);
         } finally {
-            messageBufferText.clear();
+            ((Buffer)messageBufferText).clear();
         }
     }
 
@@ -408,7 +409,7 @@ public abstract class WsFrameBase {
         while (!TransformationResult.END_OF_FRAME.equals(tr)) {
             // Frame not complete - we ran out of something
             // Convert bytes to UTF-8
-            messageBufferBinary.flip();
+            ((Buffer)messageBufferBinary).flip();
             while (true) {
                 CoderResult cr = utf8DecoderMessage.decode(messageBufferBinary, messageBufferText,
                         false);
@@ -419,9 +420,9 @@ public abstract class WsFrameBase {
                 } else if (cr.isOverflow()) {
                     // Ran out of space in text buffer - flush it
                     if (usePartial()) {
-                        messageBufferText.flip();
+                        ((Buffer)messageBufferText).flip();
                         sendMessageText(false);
-                        messageBufferText.clear();
+                        ((Buffer)messageBufferText).clear();
                     } else {
                         throw new WsIOException(new CloseReason(
                                 CloseCodes.TOO_BIG,
@@ -448,7 +449,7 @@ public abstract class WsFrameBase {
             tr = transformation.getMoreData(opCode, fin, rsv, messageBufferBinary);
         }
 
-        messageBufferBinary.flip();
+        ((Buffer)messageBufferBinary).flip();
         boolean last = false;
         // Frame is fully received
         // Convert bytes to UTF-8
@@ -462,9 +463,9 @@ public abstract class WsFrameBase {
             } else if (cr.isOverflow()) {
                 // Ran out of space in text buffer - flush it
                 if (usePartial()) {
-                    messageBufferText.flip();
+                    ((Buffer)messageBufferText).flip();
                     sendMessageText(false);
-                    messageBufferText.clear();
+                    ((Buffer)messageBufferText).clear();
                 } else {
                     throw new WsIOException(new CloseReason(
                             CloseCodes.TOO_BIG,
@@ -477,9 +478,9 @@ public abstract class WsFrameBase {
                     // If partial messages are supported, send what we have
                     // managed to decode
                     if (usePartial()) {
-                        messageBufferText.flip();
+                        ((Buffer)messageBufferText).flip();
                         sendMessageText(false);
-                        messageBufferText.clear();
+                        ((Buffer)messageBufferText).clear();
                     }
                     messageBufferBinary.compact();
                     newFrame();
@@ -491,7 +492,7 @@ public abstract class WsFrameBase {
                 }
             } else {
                 // End of message
-                messageBufferText.flip();
+                ((Buffer)messageBufferText).flip();
                 sendMessageText(true);
 
                 newMessage();
@@ -519,12 +520,12 @@ public abstract class WsFrameBase {
                                 Long.valueOf(payloadLength)));
                 throw new WsIOException(cr);
             }
-            messageBufferBinary.flip();
+            ((Buffer)messageBufferBinary).flip();
             ByteBuffer copy = ByteBuffer.allocate(messageBufferBinary.limit());
             copy.put(messageBufferBinary);
-            copy.flip();
+            ((Buffer)copy).flip();
             sendMessageBinary(copy, false);
-            messageBufferBinary.clear();
+            ((Buffer)messageBufferBinary).clear();
             // Read more data
             tr = transformation.getMoreData(opCode, fin, rsv, messageBufferBinary);
         }
@@ -534,12 +535,12 @@ public abstract class WsFrameBase {
         // - partial messages are supported
         // - the message is complete
         if (usePartial() || !continuationExpected) {
-            messageBufferBinary.flip();
+            ((Buffer)messageBufferBinary).flip();
             ByteBuffer copy = ByteBuffer.allocate(messageBufferBinary.limit());
             copy.put(messageBufferBinary);
-            copy.flip();
+            ((Buffer)copy).flip();
             sendMessageBinary(copy, !continuationExpected);
-            messageBufferBinary.clear();
+            ((Buffer)messageBufferBinary).clear();
         }
 
         if (continuationExpected) {
@@ -588,8 +589,8 @@ public abstract class WsFrameBase {
 
 
     private void newMessage() {
-        messageBufferBinary.clear();
-        messageBufferText.clear();
+        ((Buffer)messageBufferBinary).clear();
+        ((Buffer)messageBufferText).clear();
         utf8DecoderMessage.reset();
         continuationExpected = false;
         newFrame();
@@ -598,7 +599,7 @@ public abstract class WsFrameBase {
 
     private void newFrame() {
         if (inputBuffer.remaining() == 0) {
-            inputBuffer.position(0).limit(0);
+            ((Buffer)inputBuffer).position(0).limit(0);
         }
 
         maskIndex = 0;
@@ -631,7 +632,7 @@ public abstract class WsFrameBase {
 
     private void makeRoom() {
         inputBuffer.compact();
-        inputBuffer.flip();
+        ((Buffer)inputBuffer).flip();
     }
 
 
@@ -649,7 +650,7 @@ public abstract class WsFrameBase {
 
     private boolean swallowInput() {
         long toSkip = Math.min(payloadLength - payloadWritten, inputBuffer.remaining());
-        inputBuffer.position(inputBuffer.position() + (int) toSkip);
+        ((Buffer)inputBuffer).position(inputBuffer.position() + (int) toSkip);
         payloadWritten += toSkip;
         if (payloadWritten == payloadLength) {
             if (continuationExpected) {
@@ -945,9 +946,9 @@ public abstract class WsFrameBase {
             toWrite = Math.min(toWrite, dest.remaining());
 
             int orgLimit = inputBuffer.limit();
-            inputBuffer.limit(inputBuffer.position() + (int) toWrite);
+            ((Buffer)inputBuffer).limit(inputBuffer.position() + (int) toWrite);
             dest.put(inputBuffer);
-            inputBuffer.limit(orgLimit);
+            ((Buffer)inputBuffer).limit(orgLimit);
             payloadWritten += toWrite;
 
             if (payloadWritten == payloadLength) {
Index: apache-tomcat-9.0.33-src/java/org/apache/tomcat/websocket/WsFrameClient.java
===================================================================
--- apache-tomcat-9.0.33-src.orig/java/org/apache/tomcat/websocket/WsFrameClient.java
+++ apache-tomcat-9.0.33-src/java/org/apache/tomcat/websocket/WsFrameClient.java
@@ -18,6 +18,7 @@ package org.apache.tomcat.websocket;
 
 import java.io.EOFException;
 import java.io.IOException;
+import java.nio.Buffer;
 import java.nio.ByteBuffer;
 import java.nio.channels.CompletionHandler;
 
@@ -76,8 +77,8 @@ public class WsFrameClient extends WsFra
                         // and then a new socket read will be performed
                         return;
                     }
-                    inputBuffer.mark();
-                    inputBuffer.position(inputBuffer.limit()).limit(inputBuffer.capacity());
+                    ((Buffer)inputBuffer).mark();
+                    ((Buffer)inputBuffer).position(inputBuffer.limit()).limit(inputBuffer.capacity());
 
                     int toCopy = Math.min(response.remaining(), inputBuffer.remaining());
 
@@ -85,16 +86,16 @@ public class WsFrameClient extends WsFra
                     // frame processing
 
                     int orgLimit = response.limit();
-                    response.limit(response.position() + toCopy);
+                    ((Buffer)response).limit(response.position() + toCopy);
                     inputBuffer.put(response);
-                    response.limit(orgLimit);
+                    ((Buffer)response).limit(orgLimit);
 
-                    inputBuffer.limit(inputBuffer.position()).reset();
+                    ((Buffer)inputBuffer).limit(inputBuffer.position()).reset();
 
                     // Process the data we have
                     processInputBuffer();
                 }
-                response.clear();
+                ((Buffer)response).clear();
 
                 // Get some more data
                 if (isOpen()) {
@@ -159,7 +160,7 @@ public class WsFrameClient extends WsFra
                 // No data to process
                 return;
             }
-            response.flip();
+            ((Buffer)response).flip();
             doResumeProcessing(true);
         }
 
@@ -169,7 +170,7 @@ public class WsFrameClient extends WsFra
                 // response will be empty if this exception is thrown
                 response = ByteBuffer
                         .allocate(((ReadBufferOverflowException) exc).getMinBufferSize());
-                response.flip();
+                ((Buffer)response).flip();
                 doResumeProcessing(false);
             } else {
                 close(exc);
Index: apache-tomcat-9.0.33-src/java/org/apache/tomcat/websocket/WsRemoteEndpointImplBase.java
===================================================================
--- apache-tomcat-9.0.33-src.orig/java/org/apache/tomcat/websocket/WsRemoteEndpointImplBase.java
+++ apache-tomcat-9.0.33-src/java/org/apache/tomcat/websocket/WsRemoteEndpointImplBase.java
@@ -20,6 +20,7 @@ import java.io.IOException;
 import java.io.OutputStream;
 import java.io.Writer;
 import java.net.SocketTimeoutException;
+import java.nio.Buffer;
 import java.nio.ByteBuffer;
 import java.nio.CharBuffer;
 import java.nio.charset.CharsetEncoder;
@@ -240,13 +241,13 @@ public abstract class WsRemoteEndpointIm
         long timeoutExpiry = getTimeoutExpiry();
         boolean isDone = false;
         while (!isDone) {
-            encoderBuffer.clear();
+            ((Buffer)encoderBuffer).clear();
             CoderResult cr = encoder.encode(part, encoderBuffer, true);
             if (cr.isError()) {
                 throw new IllegalArgumentException(cr.toString());
             }
             isDone = !cr.isOverflow();
-            encoderBuffer.flip();
+            ((Buffer)encoderBuffer).flip();
             sendMessageBlock(Constants.OPCODE_TEXT, encoderBuffer, last && isDone, timeoutExpiry);
         }
         stateMachine.complete(last);
@@ -321,7 +322,7 @@ public abstract class WsRemoteEndpointIm
         }
 
         if (payload != null) {
-            payload.clear();
+            ((Buffer)payload).clear();
         }
 
         endMessage(null, null);
@@ -433,7 +434,7 @@ public abstract class WsRemoteEndpointIm
         if (Constants.INTERNAL_OPCODE_FLUSH == mp.getOpCode()) {
             nextFragmented = fragmented;
             nextText = text;
-            outputBuffer.flip();
+            ((Buffer)outputBuffer).flip();
             SendHandler flushHandler = new OutputBufferFlushSendHandler(
                     outputBuffer, mp.getEndHandler());
             doWrite(flushHandler, mp.getBlockingWriteTimeoutExpiry(), outputBuffer);
@@ -482,10 +483,10 @@ public abstract class WsRemoteEndpointIm
             mask = null;
         }
 
-        headerBuffer.clear();
+        ((Buffer)headerBuffer).clear();
         writeHeader(headerBuffer, mp.isFin(), mp.getRsv(), mp.getOpCode(),
                 isMasked(), mp.getPayload(), mask, first);
-        headerBuffer.flip();
+        ((Buffer)headerBuffer).flip();
 
         if (getBatchingAllowed() || isMasked()) {
             // Need to write via output buffer
@@ -798,13 +799,13 @@ public abstract class WsRemoteEndpointIm
         }
 
         public void write() {
-            buffer.clear();
+            ((Buffer)buffer).clear();
             CoderResult cr = encoder.encode(message, buffer, true);
             if (cr.isError()) {
                 throw new IllegalArgumentException(cr.toString());
             }
             isDone = !cr.isOverflow();
-            buffer.flip();
+            ((Buffer)buffer).flip();
             endpoint.startMessage(Constants.OPCODE_TEXT, buffer,
                     isDone && isLast, this);
         }
@@ -865,7 +866,7 @@ public abstract class WsRemoteEndpointIm
             }
             if (headerBuffer.hasRemaining()) {
                 // Still more headers to write, need to flush
-                outputBuffer.flip();
+                ((Buffer)outputBuffer).flip();
                 endpoint.doWrite(this, blockingWriteTimeoutExpiry, outputBuffer);
                 return;
             }
@@ -879,7 +880,7 @@ public abstract class WsRemoteEndpointIm
             if (payloadLeft > outputSpace) {
                 toWrite = outputSpace;
                 // Temporarily reduce the limit
-                payload.limit(payload.position() + toWrite);
+                ((Buffer)payload).limit(payload.position() + toWrite);
             }
 
             if (mask == null) {
@@ -897,15 +898,15 @@ public abstract class WsRemoteEndpointIm
 
             if (payloadLeft > outputSpace) {
                 // Restore the original limit
-                payload.limit(payloadLimit);
+                ((Buffer)payload).limit(payloadLimit);
                 // Still more data to write, need to flush
-                outputBuffer.flip();
+                ((Buffer)outputBuffer).flip();
                 endpoint.doWrite(this, blockingWriteTimeoutExpiry, outputBuffer);
                 return;
             }
 
             if (flushRequired) {
-                outputBuffer.flip();
+                ((Buffer)outputBuffer).flip();
                 if (outputBuffer.remaining() == 0) {
                     handler.onResult(SENDRESULT_OK);
                 } else {
@@ -923,7 +924,7 @@ public abstract class WsRemoteEndpointIm
                 if (outputBuffer.hasRemaining()) {
                     endpoint.doWrite(this, blockingWriteTimeoutExpiry, outputBuffer);
                 } else {
-                    outputBuffer.clear();
+                    ((Buffer)outputBuffer).clear();
                     write();
                 }
             } else {
@@ -949,7 +950,7 @@ public abstract class WsRemoteEndpointIm
         @Override
         public void onResult(SendResult result) {
             if (result.isOK()) {
-                outputBuffer.clear();
+                ((Buffer)outputBuffer).clear();
             }
             handler.onResult(result);
         }
@@ -1042,11 +1043,11 @@ public abstract class WsRemoteEndpointIm
 
         private void doWrite(boolean last) throws IOException {
             if (used) {
-                buffer.flip();
+                ((Buffer)buffer).flip();
                 endpoint.sendMessageBlock(Constants.OPCODE_BINARY, buffer, last);
             }
             endpoint.stateMachine.complete(last);
-            buffer.clear();
+            ((Buffer)buffer).clear();
         }
     }
 
@@ -1121,9 +1122,9 @@ public abstract class WsRemoteEndpointIm
 
         private void doWrite(boolean last) throws IOException {
             if (used) {
-                buffer.flip();
+                ((Buffer)buffer).flip();
                 endpoint.sendMessageBlock(buffer, last);
-                buffer.clear();
+                ((Buffer)buffer).clear();
             } else {
                 endpoint.stateMachine.complete(last);
             }
Index: apache-tomcat-9.0.33-src/java/org/apache/tomcat/websocket/WsSession.java
===================================================================
--- apache-tomcat-9.0.33-src.orig/java/org/apache/tomcat/websocket/WsSession.java
+++ apache-tomcat-9.0.33-src/java/org/apache/tomcat/websocket/WsSession.java
@@ -18,6 +18,7 @@ package org.apache.tomcat.websocket;
 
 import java.io.IOException;
 import java.net.URI;
+import java.nio.Buffer;
 import java.nio.ByteBuffer;
 import java.nio.channels.WritePendingException;
 import java.nio.charset.StandardCharsets;
@@ -607,7 +608,7 @@ public class WsSession implements Sessio
         if (reason != null && reason.length() > 0) {
             appendCloseReasonWithTruncation(msg, reason);
         }
-        msg.flip();
+        ((Buffer)msg).flip();
         try {
             wsRemoteEndpoint.sendMessageBlock(Constants.OPCODE_CLOSE, msg, true);
         } catch (IOException | WritePendingException e) {
Index: apache-tomcat-9.0.33-src/java/org/apache/tomcat/websocket/WsWebSocketContainer.java
===================================================================
--- apache-tomcat-9.0.33-src.orig/java/org/apache/tomcat/websocket/WsWebSocketContainer.java
+++ apache-tomcat-9.0.33-src/java/org/apache/tomcat/websocket/WsWebSocketContainer.java
@@ -27,6 +27,7 @@ import java.net.ProxySelector;
 import java.net.SocketAddress;
 import java.net.URI;
 import java.net.URISyntaxException;
+import java.nio.Buffer;
 import java.nio.ByteBuffer;
 import java.nio.channels.AsynchronousChannelGroup;
 import java.nio.channels.AsynchronousSocketChannel;
@@ -742,7 +743,7 @@ public class WsWebSocketContainer implem
         // Terminating CRLF
         result.put(CRLF);
 
-        result.flip();
+        ((Buffer)result).flip();
 
         return result;
     }
@@ -771,7 +772,7 @@ public class WsWebSocketContainer implem
                 newSize = input.capacity() * 2;
             }
             ByteBuffer expanded = ByteBuffer.allocate(newSize);
-            input.flip();
+            ((Buffer)input).flip();
             expanded.put(input);
             input = expanded;
         }
@@ -800,14 +801,14 @@ public class WsWebSocketContainer implem
         while (!readHeaders) {
             // On entering loop buffer will be empty and at the start of a new
             // loop the buffer will have been fully read.
-            response.clear();
+            ((Buffer)response).clear();
             // Blocking read
             Future<Integer> read = channel.read(response);
             Integer bytesRead = read.get(timeout, TimeUnit.MILLISECONDS);
             if (bytesRead.intValue() == -1) {
                 throw new EOFException();
             }
-            response.flip();
+            ((Buffer)response).flip();
             while (response.hasRemaining() && !readHeaders) {
                 if (line == null) {
                     line = readLine(response);
Index: apache-tomcat-9.0.33-src/test/org/apache/coyote/http11/upgrade/TestUpgradeInternalHandler.java
===================================================================
--- apache-tomcat-9.0.33-src.orig/test/org/apache/coyote/http11/upgrade/TestUpgradeInternalHandler.java
+++ apache-tomcat-9.0.33-src/test/org/apache/coyote/http11/upgrade/TestUpgradeInternalHandler.java
@@ -25,6 +25,7 @@ import java.io.OutputStreamWriter;
 import java.io.PrintWriter;
 import java.io.Writer;
 import java.net.Socket;
+import java.nio.Buffer;
 import java.nio.ByteBuffer;
 import java.nio.channels.CompletionHandler;
 import java.nio.charset.StandardCharsets;
@@ -210,7 +211,7 @@ public class TestUpgradeInternalHandler
         }
 
         private void write(ByteBuffer buffer) {
-            buffer.flip();
+            ((Buffer)buffer).flip();
             CompletionState state = wrapper.write(BlockingMode.BLOCK, 10, TimeUnit.SECONDS, null, SocketWrapperBase.COMPLETE_WRITE, new CompletionHandler<Long, Void>() {
                 @Override
                 public void completed(Long result, Void attachment) {
Index: apache-tomcat-9.0.33-src/test/org/apache/coyote/http2/Http2TestBase.java
===================================================================
--- apache-tomcat-9.0.33-src.orig/test/org/apache/coyote/http2/Http2TestBase.java
+++ apache-tomcat-9.0.33-src/test/org/apache/coyote/http2/Http2TestBase.java
@@ -23,6 +23,7 @@ import java.io.InputStream;
 import java.io.OutputStream;
 import java.net.Socket;
 import java.net.SocketException;
+import java.nio.Buffer;
 import java.nio.ByteBuffer;
 import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
@@ -222,7 +223,7 @@ public abstract class Http2TestBase exte
         if (padding != null) {
             headersPayload.put(padding);
         }
-        headersPayload.flip();
+        ((Buffer)headersPayload).flip();
 
         ByteUtil.setThreeBytes(frameHeader, 0, headersPayload.limit());
         frameHeader[3] = FrameType.HEADERS.getIdByte();
@@ -255,7 +256,7 @@ public abstract class Http2TestBase exte
         }
         hpackEncoder.encode(mimeHeaders, headersPayload);
 
-        headersPayload.flip();
+        ((Buffer)headersPayload).flip();
 
         ByteUtil.setThreeBytes(frameHeader, 0, headersPayload.limit());
         frameHeader[3] = FrameType.HEADERS.getIdByte();
@@ -283,7 +284,7 @@ public abstract class Http2TestBase exte
         }
         hpackEncoder.encode(mimeHeaders, headersPayload);
 
-        headersPayload.flip();
+        ((Buffer)headersPayload).flip();
 
         ByteUtil.setThreeBytes(frameHeader, 0, headersPayload.limit());
         frameHeader[3] = FrameType.CONTINUATION.getIdByte();
@@ -373,7 +374,7 @@ public abstract class Http2TestBase exte
         }
         hpackEncoder.encode(headers, headersPayload);
 
-        headersPayload.flip();
+        ((Buffer)headersPayload).flip();
 
         ByteUtil.setThreeBytes(headersFrameHeader, 0, headersPayload.limit());
         headersFrameHeader[3] = FrameType.HEADERS.getIdByte();
@@ -385,18 +386,18 @@ public abstract class Http2TestBase exte
         // Data
         if (padding != null) {
             dataPayload.put((byte) (padding.length & 0xFF));
-            dataPayload.limit(dataPayload.capacity() - padding.length);
+            ((Buffer)dataPayload).limit(dataPayload.capacity() - padding.length);
         }
 
         while (dataPayload.hasRemaining()) {
             dataPayload.put((byte) 'x');
         }
         if (padding != null && padding.length > 0) {
-            dataPayload.limit(dataPayload.capacity());
+            ((Buffer)dataPayload).limit(dataPayload.capacity());
             dataPayload.put(padding);
         }
 
-        dataPayload.flip();
+        ((Buffer)dataPayload).flip();
 
         // Size
         ByteUtil.setThreeBytes(dataFrameHeader, 0, dataPayload.limit());
@@ -418,7 +419,7 @@ public abstract class Http2TestBase exte
             trailerHeaders.addValue(TRAILER_HEADER_NAME).setString(TRAILER_HEADER_VALUE);
             hpackEncoder.encode(trailerHeaders, trailersPayload);
 
-            trailersPayload.flip();
+            ((Buffer)trailersPayload).flip();
 
             ByteUtil.setThreeBytes(trailersFrameHeader, 0, trailersPayload.limit());
             trailersFrameHeader[3] = FrameType.HEADERS.getIdByte();
@@ -1018,7 +1019,7 @@ public abstract class Http2TestBase exte
             if (bodyBuffer != null) {
                 if (bodyBuffer.limit() > 0) {
                     trace.append(lastStreamId + "-Body-");
-                    bodyBuffer.flip();
+                    ((Buffer)bodyBuffer).flip();
                     while (bodyBuffer.hasRemaining()) {
                         trace.append((char) bodyBuffer.get());
                     }
Index: apache-tomcat-9.0.33-src/test/org/apache/coyote/http2/TestHpack.java
===================================================================
--- apache-tomcat-9.0.33-src.orig/test/org/apache/coyote/http2/TestHpack.java
+++ apache-tomcat-9.0.33-src/test/org/apache/coyote/http2/TestHpack.java
@@ -16,6 +16,7 @@
  */
 package org.apache.coyote.http2;
 
+import java.nio.Buffer;
 import java.nio.ByteBuffer;
 
 import org.junit.Assert;
@@ -34,13 +35,13 @@ public class TestHpack {
         ByteBuffer output = ByteBuffer.allocate(512);
         HpackEncoder encoder = new HpackEncoder();
         encoder.encode(headers, output);
-        output.flip();
+        ((Buffer)output).flip();
         // Size is supposed to be 33 without huffman, or 27 with it
         // TODO: use the HpackHeaderFunction to enable huffman predictably
         Assert.assertEquals(27, output.remaining());
-        output.clear();
+        ((Buffer)output).clear();
         encoder.encode(headers, output);
-        output.flip();
+        ((Buffer)output).flip();
         // Size is now 3 after using the table
         Assert.assertEquals(3, output.remaining());
     }
@@ -54,15 +55,15 @@ public class TestHpack {
         ByteBuffer output = ByteBuffer.allocate(512);
         HpackEncoder encoder = new HpackEncoder();
         encoder.encode(headers, output);
-        output.flip();
+        ((Buffer)output).flip();
         MimeHeaders headers2 = new MimeHeaders();
         HpackDecoder decoder = new HpackDecoder();
         decoder.setHeaderEmitter(new HeadersListener(headers2));
         decoder.decode(output);
         // Redo (table is supposed to be updated)
-        output.clear();
+        ((Buffer)output).clear();
         encoder.encode(headers, output);
-        output.flip();
+        ((Buffer)output).flip();
         headers2.recycle();
         Assert.assertEquals(3, output.remaining());
         // Check that the decoder is using the table right
@@ -120,7 +121,7 @@ public class TestHpack {
         // by another byte
         output.array()[7] = (byte) -122;
         output.put((byte) -1);
-        output.flip();
+        ((Buffer)output).flip();
         MimeHeaders headers2 = new MimeHeaders();
         HpackDecoder decoder = new HpackDecoder();
         decoder.setHeaderEmitter(new HeadersListener(headers2));
@@ -136,7 +137,7 @@ public class TestHpack {
         ByteBuffer output = ByteBuffer.allocate(512);
         HpackEncoder encoder = new HpackEncoder();
         encoder.encode(headers, output);
-        output.flip();
+        ((Buffer)output).flip();
         MimeHeaders headers2 = new MimeHeaders();
         HpackDecoder decoder = new HpackDecoder();
         decoder.setHeaderEmitter(new HeadersListener(headers2));
Index: apache-tomcat-9.0.33-src/test/org/apache/coyote/http2/TestHttp2Limits.java
===================================================================
--- apache-tomcat-9.0.33-src.orig/test/org/apache/coyote/http2/TestHttp2Limits.java
+++ apache-tomcat-9.0.33-src/test/org/apache/coyote/http2/TestHttp2Limits.java
@@ -17,6 +17,7 @@
 package org.apache.coyote.http2;
 
 import java.io.IOException;
+import java.nio.Buffer;
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.List;
@@ -290,7 +291,7 @@ public class TestHttp2Limits extends Htt
         if (state != State.COMPLETE) {
             throw new Exception("Unable to build headers");
         }
-        headersPayload.flip();
+        ((Buffer)headersPayload).flip();
 
         log.debug("Headers payload generated of size [" + headersPayload.limit() + "]");
     }
Index: apache-tomcat-9.0.33-src/test/org/apache/coyote/http2/TestHttp2Section_8_1.java
===================================================================
--- apache-tomcat-9.0.33-src.orig/test/org/apache/coyote/http2/TestHttp2Section_8_1.java
+++ apache-tomcat-9.0.33-src/test/org/apache/coyote/http2/TestHttp2Section_8_1.java
@@ -16,6 +16,7 @@
  */
 package org.apache.coyote.http2;
 
+import java.nio.Buffer;
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.List;
@@ -186,7 +187,7 @@ public class TestHttp2Section_8_1 extend
 
         headers.clear();
         headers.add(new Header(":authority", "localhost:" + getPort()));
-        headersPayload.clear();
+        ((Buffer)headersPayload).clear();
 
         buildSimpleGetRequestPart2(headersFrameHeader, headersPayload, headers , 3);
 
Index: apache-tomcat-9.0.33-src/test/org/apache/tomcat/util/buf/TestUtf8.java
===================================================================
--- apache-tomcat-9.0.33-src.orig/test/org/apache/tomcat/util/buf/TestUtf8.java
+++ apache-tomcat-9.0.33-src/test/org/apache/tomcat/util/buf/TestUtf8.java
@@ -16,6 +16,7 @@
  */
 package org.apache.tomcat.util.buf;
 
+import java.nio.Buffer;
 import java.nio.ByteBuffer;
 import java.nio.CharBuffer;
 import java.nio.charset.CharsetDecoder;
@@ -579,7 +580,7 @@ public class TestUtf8 {
         // an invalid sequence has been provided
         for (int i = 0; i < len; i++) {
             bb.put((byte) testCase.input[i]);
-            bb.flip();
+            ((Buffer)bb).flip();
             CoderResult cr = decoder.decode(bb, cb, false);
             if (cr.isError()) {
                 int expected =  testCase.invalidIndex;
@@ -604,11 +605,11 @@ public class TestUtf8 {
         decoder.onUnmappableCharacter(CodingErrorAction.REPLACE);
 
         // Add each byte one at a time.
-        bb.clear();
-        cb.clear();
+        ((Buffer)bb).clear();
+        ((Buffer)cb).clear();
         for (int i = 0; i < len; i++) {
             bb.put((byte) testCase.input[i]);
-            bb.flip();
+            ((Buffer)bb).flip();
             CoderResult cr = decoder.decode(bb, cb, false);
             if (cr.isError()) {
                 Assert.fail(testCase.description);
@@ -617,12 +618,12 @@ public class TestUtf8 {
         }
         // For incomplete sequences at the end of the input need to tell
         // the decoder the input has ended
-        bb.flip();
+        ((Buffer)bb).flip();
         CoderResult cr = decoder.decode(bb, cb, true);
         if (cr.isError()) {
             Assert.fail(testCase.description);
         }
-        cb.flip();
+        ((Buffer)cb).flip();
 
         String expected = testCase.outputReplaced;
         if ((flags & REPLACE_SWALLOWS_TRAILER) != 0) {
Index: apache-tomcat-9.0.33-src/test/org/apache/tomcat/websocket/pojo/TestEncodingDecoding.java
===================================================================
--- apache-tomcat-9.0.33-src.orig/test/org/apache/tomcat/websocket/pojo/TestEncodingDecoding.java
+++ apache-tomcat-9.0.33-src/test/org/apache/tomcat/websocket/pojo/TestEncodingDecoding.java
@@ -18,6 +18,7 @@ package org.apache.tomcat.websocket.pojo
 
 import java.io.IOException;
 import java.net.URI;
+import java.nio.Buffer;
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -604,7 +605,7 @@ public class TestEncodingDecoding extend
             reply.put((byte) 0x12);
             reply.put((byte) 0x34);
             reply.put(data);
-            reply.flip();
+            ((Buffer)reply).flip();
             return reply;
         }
     }
