diff --git a/containers/jersey-servlet-core/src/main/java/org/glassfish/jersey/servlet/ServletEntityInputStream.java b/containers/jersey-servlet-core/src/main/java/org/glassfish/jersey/servlet/ServletEntityInputStream.java
deleted file mode 100644
index fcbee2d..0000000
--- a/containers/jersey-servlet-core/src/main/java/org/glassfish/jersey/servlet/ServletEntityInputStream.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Copyright (c) 2024, 2025 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.glassfish.jersey.servlet;
-
-import jakarta.servlet.ReadListener;
-import jakarta.servlet.ServletInputStream;
-import org.glassfish.jersey.innate.io.StreamListener;
-import org.glassfish.jersey.innate.io.StreamListenerCouple;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.UncheckedIOException;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-abstract class ServletEntityInputStream implements StreamListenerCouple {
-
-    private final boolean waitForInputEnable;
-    private final long waitForInputTimeOut;
-
-    private final StreamListener listener = new StreamListener() {
-
-        @Override
-        public boolean isEmpty() {
-            try {
-                return getWrappedStream().available() == 0
-                        || getWrappedStream().isFinished();
-            } catch (IOException e) {
-                throw new UncheckedIOException(e);
-            }
-        }
-
-        @Override
-        public boolean isReady() {
-            return processReadiness();
-        }
-
-        boolean processReadiness() {
-
-            final AtomicBoolean ready = new AtomicBoolean(getWrappedStream().isReady());
-            if (waitForInputEnable && !ready.get()) {
-
-                final CountDownLatch latch = new CountDownLatch(1);
-
-                getWrappedStream().setReadListener(new ReadListener() {
-                    @Override
-                    public void onDataAvailable() {
-                        ready.set(true);
-                        latch.countDown();
-                    }
-
-                    @Override
-                    public void onAllDataRead() {
-                        ready.set(false);
-                        latch.countDown();
-                    }
-
-                    @Override
-                    public void onError(Throwable t) {
-                        ready.set(false);
-                        latch.countDown();
-                    }
-
-                });
-                if (!ready.get()) {
-                    try {
-                        latch.await(waitForInputTimeOut, TimeUnit.MILLISECONDS);
-                    } catch (InterruptedException e) {
-                        ready.set(getWrappedStream().isReady());
-                    }
-                }
-            }
-            return ready.get() || getWrappedStream().isReady();
-        }
-
-    };
-
-    public ServletEntityInputStream(boolean waitForInputEnable, long waitForInputTimeOut) {
-        this.waitForInputEnable = waitForInputEnable;
-        this.waitForInputTimeOut = waitForInputTimeOut;
-    }
-
-    protected abstract ServletInputStream getWrappedStream();
-
-    @Override
-    public StreamListener getListener() {
-        return listener;
-    }
-
-    @Override
-    public InputStream getExternalStream() {
-        return getWrappedStream();
-    }
-}
diff --git a/containers/jersey-servlet-core/src/main/java/org/glassfish/jersey/servlet/ServletProperties.java b/containers/jersey-servlet-core/src/main/java/org/glassfish/jersey/servlet/ServletProperties.java
index bb3a52a..f4a489d 100644
--- a/containers/jersey-servlet-core/src/main/java/org/glassfish/jersey/servlet/ServletProperties.java
+++ b/containers/jersey-servlet-core/src/main/java/org/glassfish/jersey/servlet/ServletProperties.java
@@ -139,30 +139,6 @@
     public static final String QUERY_PARAMS_AS_FORM_PARAMS_DISABLED = "jersey.config.servlet.form.queryParams.disabled";
 
     /**
-     * Indicates if any input stream is expected and shall be waited while using POST method. It can happen that a delay
-     * appear between the time the request is received and the time the input stream is available. In this case, the
-     * server will wait for the input stream to be available before processing the request.
-     *
-     * @since 3.1.11
-     */
-    public static final String WAIT_FOR_INPUT = "jersey.config.servlet.expect.input";
-
-    /**
-     * Timeout which shall be respected while waiting for the input stream to be available.
-     * The timeout is in milliseconds.
-     *
-     * @since 3.1.11
-     */
-    public static final String WAIT_FOR_INPUT_TIMEOUT = "jersey.config.servlet.input.timeout";
-
-    /**
-     * Default timeout which shall be respected while waiting for the input stream to be available.
-     *
-     * @since 3.1.11
-     */
-    public static final Long WAIT_FOR_INPUT_DEFAULT_TIMEOUT = 100L;
-
-    /**
      * Identifies the object that will be used as a parent {@code HK2 ServiceLocator} in the Jersey
      * {@link WebComponent}.
      * <p></p>
diff --git a/containers/jersey-servlet-core/src/main/java/org/glassfish/jersey/servlet/WebComponent.java b/containers/jersey-servlet-core/src/main/java/org/glassfish/jersey/servlet/WebComponent.java
index e3c6344..f35c720 100644
--- a/containers/jersey-servlet-core/src/main/java/org/glassfish/jersey/servlet/WebComponent.java
+++ b/containers/jersey-servlet-core/src/main/java/org/glassfish/jersey/servlet/WebComponent.java
@@ -17,6 +17,7 @@
 package org.glassfish.jersey.servlet;
 
 import java.io.IOException;
+import java.io.InputStream;
 import java.io.UncheckedIOException;
 import java.lang.reflect.Type;
 import java.net.URI;
@@ -56,6 +57,7 @@
 import jakarta.servlet.http.HttpServletRequest;
 import jakarta.servlet.http.HttpServletResponse;
 
+import org.glassfish.jersey.innate.io.InputStreamWrapper;
 import org.glassfish.jersey.internal.ServiceFinderBinder;
 import org.glassfish.jersey.internal.inject.AbstractBinder;
 import org.glassfish.jersey.internal.inject.InjectionManager;
@@ -423,15 +425,11 @@
             final ResponseWriter responseWriter) throws IOException {
 
         try {
-            boolean waitForInputEnable = requestContext.resolveProperty(ServletProperties.WAIT_FOR_INPUT, Boolean.TRUE);
-            long waitForInputTimeOut = requestContext.resolveProperty(ServletProperties.WAIT_FOR_INPUT_TIMEOUT,
-                    ServletProperties.WAIT_FOR_INPUT_DEFAULT_TIMEOUT);
-            requestContext.wrapEntityInputStream(new ServletEntityInputStream(waitForInputEnable,
-                    waitForInputTimeOut) {
-                private ServletInputStream wrappedStream;
+            requestContext.setEntityStream(new InputStreamWrapper() {
 
+                private ServletInputStream wrappedStream;
                 @Override
-                protected ServletInputStream getWrappedStream() {
+                protected InputStream getWrapped() {
                     if (wrappedStream == null) {
                         try {
                             wrappedStream = servletRequest.getInputStream();
diff --git a/core-common/src/main/java/org/glassfish/jersey/http/JerseyCookie.java b/core-common/src/main/java/org/glassfish/jersey/http/JerseyCookie.java
deleted file mode 100644
index 30ef997..0000000
--- a/core-common/src/main/java/org/glassfish/jersey/http/JerseyCookie.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright (c) 2025 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.glassfish.jersey.http;
-
-import jakarta.ws.rs.core.Cookie;
-
-/**
- * Jersey subclass of {@link Cookie} bearing information about optional version.
- * Complies with RFC 6265.
- */
-public final class JerseyCookie extends Cookie implements VersionOptional {
-    private final Integer version;
-    private JerseyCookie(Builder builder) throws IllegalArgumentException {
-        super(builder);
-        this.version = builder.version;
-    }
-
-    @Override
-    public boolean hasVersion() {
-        return version != null;
-    }
-
-    /**
-     * Builder for building Cookie.
-     */
-    public static final class Builder extends AbstractCookieBuilder<JerseyCookie.Builder> {
-        private Integer version;
-        /**
-         * Create a new instance.
-         *
-         * @param name the name of the cookie.
-         */
-        public Builder(String name) {
-            super(name);
-        }
-
-        @Override
-        public Builder version(int version) {
-            super.version(version);
-            this.version = version;
-            return this;
-        }
-
-        /**
-         * Set version as nullable Integer. {@code null} refers to RFC 6265 Cookie without a version.
-         * @param version the version of the HTTP Cookie.
-         * @return updated builder.
-         */
-        public Builder version(Integer version) {
-            super.version(version == null ? VersionOptional.NETSCAPE_VERSION : version);
-            this.version = version;
-            return this;
-        }
-
-        @Override
-        public Cookie build() {
-            return new JerseyCookie(this);
-        }
-
-    }
-
-}
diff --git a/core-common/src/main/java/org/glassfish/jersey/http/JerseyNewCookie.java b/core-common/src/main/java/org/glassfish/jersey/http/JerseyNewCookie.java
deleted file mode 100644
index 81419c6..0000000
--- a/core-common/src/main/java/org/glassfish/jersey/http/JerseyNewCookie.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Copyright (c) 2025 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.glassfish.jersey.http;
-
-import jakarta.ws.rs.core.Cookie;
-import jakarta.ws.rs.core.NewCookie;
-
-/**
- * Jersey subclass of {@link NewCookie} bearing information about optional version.
- * Complies with RFC 6265.
- */
-public final class JerseyNewCookie extends NewCookie implements VersionOptional {
-    private final Integer version;
-    private JerseyNewCookie(JerseyNewCookie.Builder builder) {
-        super(builder);
-        this.version = builder.version;
-    }
-
-    @Override
-    public boolean hasVersion() {
-        return version != null;
-    }
-
-    /**
-     * Builder class building the Jersey NewCookie subclass.
-     */
-    public static final class Builder extends AbstractNewCookieBuilder<JerseyNewCookie.Builder> {
-        private Integer version;
-
-
-        /**
-         * Create a new instance.
-         *
-         * @param name the name of the cookie.
-         */
-        public Builder(String name) {
-            super(name);
-        }
-
-        /**
-         * Create a new instance supplementing the information in the supplied cookie.
-         *
-         * @param cookie the cookie to copy.
-         */
-        public Builder(Cookie cookie) {
-            super(cookie);
-            if (cookie instanceof VersionOptional) {
-                this.version = ((VersionOptional) cookie).hasVersion() ? cookie.getVersion() : null;
-            }
-        }
-
-        @Override
-        public Builder version(int version) {
-            super.version(version);
-            this.version = version;
-            return this;
-        }
-
-        /**
-         * Set version. Can be {@code null} if RFC 6265.
-         * @param version the cookie version.
-         * @return updated builder.
-         */
-        public Builder version(Integer version) {
-            // Version 0 should refer to NETSCAPE, but NewCookie should be for RFC 2109 & 2965 - version 1, and forward - 6265.
-            // Hence in this case, 0 would be "no version" in RFC 6265.
-            super.version(version == null ? 0 : version);
-            this.version = version;
-            return this;
-        }
-
-        @Override
-        public NewCookie build() {
-            return new JerseyNewCookie(this);
-        }
-    }
-}
diff --git a/core-common/src/main/java/org/glassfish/jersey/http/VersionOptional.java b/core-common/src/main/java/org/glassfish/jersey/http/VersionOptional.java
deleted file mode 100644
index 2023d0d..0000000
--- a/core-common/src/main/java/org/glassfish/jersey/http/VersionOptional.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright (c) 2025 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.glassfish.jersey.http;
-
-/**
- * Provides information about optionality of version in {@code Cookie} and {@code NewCookie}.
- * The version is as follows: 0 - Netscape, 1 - RFC 2109 & 2965, not set RFC 6265.
- */
-public interface VersionOptional {
-
-    /**
-     * The version from the original Netscape specification.
-     */
-    public static final int NETSCAPE_VERSION = 0;
-
-    /**
-     * Defines if the version is set.
-     * @return {@code true} when the version is set.
-     */
-    boolean hasVersion();
-}
diff --git a/core-common/src/main/java/org/glassfish/jersey/innate/io/StreamListener.java b/core-common/src/main/java/org/glassfish/jersey/innate/io/StreamListener.java
deleted file mode 100644
index 406c765..0000000
--- a/core-common/src/main/java/org/glassfish/jersey/innate/io/StreamListener.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright (c) 2025 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.glassfish.jersey.innate.io;
-
-import org.glassfish.jersey.message.internal.EntityInputStream;
-
-import java.util.EventListener;
-
-/**
- * Provides possibility to check whether an input stream for an entity is empty or not.
- * <p>
- * Is being used in the {@link EntityInputStream#isEmpty()} check
- * </p>
- */
-public interface StreamListener extends EventListener {
-
-    /**
-     * Provides information if the underlying stream is empty
-     *
-     * @return true if the underlying stream is empty
-     */
-    boolean isEmpty();
-
-    /**
-     * Can be used to provide readiness information.
-     * <p>
-     * If the stream is not ready the calling check in the {@link EntityInputStream#isEmpty()} method will validate
-     * the underlying stream as not empty.
-     * </p>
-     * <p>
-     * Throws:
-     * IllegalStateException   - if one of the following conditions is true
-     *              the associated request is neither upgraded nor the async started
-     *              underlying setReadListener is called more than once within the scope of the same request.
-     * </p>
-     * @return true if the underlying stream is ready.
-     */
-    boolean isReady();
-}
diff --git a/core-common/src/main/java/org/glassfish/jersey/innate/io/StreamListenerCouple.java b/core-common/src/main/java/org/glassfish/jersey/innate/io/StreamListenerCouple.java
deleted file mode 100644
index 34d141d..0000000
--- a/core-common/src/main/java/org/glassfish/jersey/innate/io/StreamListenerCouple.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (c) 2025 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.glassfish.jersey.innate.io;
-
-import java.io.InputStream;
-
-/**
- * Couples stream and its listener (if any).
- * Could be used in connectors to help determine the stream's emptiness.
- */
-public interface StreamListenerCouple {
-
-    /**
-     * Provides a listener for the underlying input stream. The listener can reflect a particular state which
-     * helps to determine whether the underlying stream is empty or not.
-     *
-     * @return listener
-     */
-    StreamListener getListener();
-
-    /**
-     * Provides underlying input stream.
-     * @return underlying input stream
-     */
-    InputStream getExternalStream();
-
-}
diff --git a/core-common/src/main/java/org/glassfish/jersey/message/internal/CookieProvider.java b/core-common/src/main/java/org/glassfish/jersey/message/internal/CookieProvider.java
index 9a4b29a..a509120 100644
--- a/core-common/src/main/java/org/glassfish/jersey/message/internal/CookieProvider.java
+++ b/core-common/src/main/java/org/glassfish/jersey/message/internal/CookieProvider.java
@@ -21,7 +21,6 @@
 import jakarta.inject.Singleton;
 
 import org.glassfish.jersey.internal.LocalizationMessages;
-import org.glassfish.jersey.http.VersionOptional;
 import org.glassfish.jersey.spi.HeaderDelegateProvider;
 
 import static org.glassfish.jersey.message.internal.Utils.throwIllegalArgumentExceptionIfNull;
@@ -47,15 +46,7 @@
 
         StringBuilder b = new StringBuilder();
 
-        boolean printVersion = false;
-        if (cookie instanceof VersionOptional) {
-            printVersion = ((VersionOptional) cookie).hasVersion();
-        } else if (cookie.getVersion() == Cookie.DEFAULT_VERSION || cookie.getVersion() == VersionOptional.NETSCAPE_VERSION) {
-            printVersion = true;
-        }
-        if (printVersion) {
-            b.append("$Version=").append(cookie.getVersion()).append(';');
-        }
+        b.append("$Version=").append(cookie.getVersion()).append(';');
 
         b.append(cookie.getName()).append('=');
         StringBuilderUtils.appendQuotedIfWhitespace(b, cookie.getValue());
diff --git a/core-common/src/main/java/org/glassfish/jersey/message/internal/CookiesParser.java b/core-common/src/main/java/org/glassfish/jersey/message/internal/CookiesParser.java
index d535094..958a1bc 100644
--- a/core-common/src/main/java/org/glassfish/jersey/message/internal/CookiesParser.java
+++ b/core-common/src/main/java/org/glassfish/jersey/message/internal/CookiesParser.java
@@ -28,8 +28,6 @@
 import jakarta.ws.rs.core.NewCookie;
 
 import org.glassfish.jersey.internal.LocalizationMessages;
-import org.glassfish.jersey.http.JerseyCookie;
-import org.glassfish.jersey.http.JerseyNewCookie;
 
 /**
  * Cookies parser.
@@ -45,7 +43,7 @@
 
         String name;
         String value;
-        Integer version = null;
+        int version = Cookie.DEFAULT_VERSION;
         String path = null;
         String domain = null;
 
@@ -55,14 +53,14 @@
         }
 
         public Cookie getImmutableCookie() {
-            return new JerseyCookie.Builder(name).version(version).value(value).path(path).domain(domain).build();
+            return new Cookie(name, value, path, domain, version);
         }
     }
 
     public static Map<String, Cookie> parseCookies(String header) {
         String bites[] = header.split("[;,]");
         Map<String, Cookie> cookies = new LinkedHashMap<String, Cookie>();
-        Integer version = null;
+        int version = 0;
         MutableCookie cookie = null;
         for (String bite : bites) {
             String crumbs[] = bite.split("=", 2);
@@ -125,7 +123,7 @@
         String value = null;
         String path = null;
         String domain = null;
-        Integer version = null;
+        int version = Cookie.DEFAULT_VERSION;
         String comment = null;
         int maxAge = NewCookie.DEFAULT_MAX_AGE;
         boolean secure = false;
@@ -139,8 +137,7 @@
         }
 
         public NewCookie getImmutableNewCookie() {
-            return new JerseyNewCookie.Builder(name).version(version).value(value).path(path).domain(domain).comment(comment)
-                    .maxAge(maxAge).expiry(expiry).secure(secure).httpOnly(httpOnly).sameSite(sameSite).build();
+            return new NewCookie(name, value, path, domain, version, comment, maxAge, expiry, secure, httpOnly, sameSite);
         }
     }
 
diff --git a/core-common/src/main/java/org/glassfish/jersey/message/internal/EntityInputStream.java b/core-common/src/main/java/org/glassfish/jersey/message/internal/EntityInputStream.java
index ab5a3ec..72a5227 100644
--- a/core-common/src/main/java/org/glassfish/jersey/message/internal/EntityInputStream.java
+++ b/core-common/src/main/java/org/glassfish/jersey/message/internal/EntityInputStream.java
@@ -22,8 +22,6 @@
 
 import jakarta.ws.rs.ProcessingException;
 
-import org.glassfish.jersey.innate.io.StreamListener;
-import org.glassfish.jersey.innate.io.StreamListenerCouple;
 import org.glassfish.jersey.innate.io.InputStreamWrapper;
 import org.glassfish.jersey.internal.LocalizationMessages;
 
@@ -39,9 +37,6 @@
 public class EntityInputStream extends InputStreamWrapper {
 
     private InputStream input;
-
-    private StreamListener listener;
-
     private boolean closed = false;
 
     /**
@@ -98,12 +93,13 @@
      */
     @Override
     public void close() throws ProcessingException {
-        if (input == null) {
+        final InputStream in = input;
+        if (in == null) {
             return;
         }
         if (!closed) {
             try {
-                input.close();
+                in.close();
             } catch (IOException ex) {
                 // This e.g. means that the underlying socket stream got closed by other thread somehow...
                 throw new ProcessingException(LocalizationMessages.MESSAGE_CONTENT_INPUT_STREAM_CLOSE_FAILED(), ex);
@@ -123,46 +119,43 @@
      */
     public boolean isEmpty() {
         ensureNotClosed();
-        if (input == null) {
+
+        final InputStream in = input;
+        if (in == null) {
             return true;
         }
 
         try {
             // Try #markSupported first - #available on WLS waits until socked timeout is reached when chunked encoding is used.
-            if (input.markSupported()) {
-                input.mark(1);
-                int i = input.read();
-                input.reset();
+            if (in.markSupported()) {
+                in.mark(1);
+                int i = in.read();
+                in.reset();
                 return i == -1;
             } else {
-                int availableBytes = 0;
                 try {
-                    availableBytes = input.available();
+                    if (in.available() > 0) {
+                        return false;
+                    }
                 } catch (IOException ioe) {
                     // NOOP. Try other approaches as this can fail on WLS.
                 }
 
-                if (availableBytes > 0) {
-                    return false;
+                int b = in.read();
+                if (b == -1) {
+                    return true;
                 }
 
-                if (listener != null) {
-                    try {
-                        if (!listener.isReady()) {
-                            return false;
-                        }
-                        return listener.isEmpty();
-                    } catch (IllegalStateException ex) {
-                        // NOOP. Listener failed to process the emptiness, the final method to be applied
-                    }
+                PushbackInputStream pbis;
+                if (in instanceof PushbackInputStream) {
+                    pbis = (PushbackInputStream) in;
+                } else {
+                    pbis = new PushbackInputStream(in, 1);
+                    input = pbis;
                 }
+                pbis.unread(b);
 
-                final PushbackInputStream in = (input instanceof PushbackInputStream) ? (PushbackInputStream) input
-                       : new PushbackInputStream(input);
-                int i = in.read();
-                in.unread(i);
-                input = in;
-                return i == -1;
+                return false;
             }
         } catch (IOException ex) {
             throw new ProcessingException(ex);
@@ -195,7 +188,7 @@
      * @return wrapped input stream instance.
      */
     public final InputStream getWrappedStream() {
-        return getWrapped();
+        return input;
     }
 
     /**
@@ -208,21 +201,7 @@
     }
 
     @Override
-    public InputStream getWrapped() {
+    protected InputStream getWrapped() {
         return input;
     }
-
-    /**
-     * Decomposes existing {@link EntityInputStream} into this input stream
-     * @param stream instance of the {@link EntityInputStream}
-     */
-    public void wrapExternalStream(StreamListenerCouple stream) {
-        input = new InputStreamWrapper() {
-            @Override
-            public InputStream getWrapped() {
-                return stream.getExternalStream();
-            }
-        };
-        listener = stream.getListener();
-    }
 }
diff --git a/core-common/src/main/java/org/glassfish/jersey/message/internal/InboundMessageContext.java b/core-common/src/main/java/org/glassfish/jersey/message/internal/InboundMessageContext.java
index 0d88f13..46446a4 100644
--- a/core-common/src/main/java/org/glassfish/jersey/message/internal/InboundMessageContext.java
+++ b/core-common/src/main/java/org/glassfish/jersey/message/internal/InboundMessageContext.java
@@ -45,7 +45,6 @@
 
 import javax.xml.transform.Source;
 
-import org.glassfish.jersey.innate.io.StreamListenerCouple;
 import org.glassfish.jersey.innate.io.SafelyClosable;
 import org.glassfish.jersey.internal.LocalizationMessages;
 import org.glassfish.jersey.internal.PropertiesDelegate;
@@ -600,16 +599,6 @@
     }
 
     /**
-     * Provides the whole {@link EntityInputStream} to the request
-     *
-     * @param stream the whole input stream entity
-     */
-    public void wrapEntityInputStream(StreamListenerCouple stream) {
-        this.entityContent.wrapExternalStream(stream);
-        this.entityContent.buffered = false;
-    }
-
-    /**
      * Read entity from a context entity input stream.
      *
      * @param <T>                entity Java object type.
diff --git a/core-common/src/main/java/org/glassfish/jersey/message/internal/NewCookieProvider.java b/core-common/src/main/java/org/glassfish/jersey/message/internal/NewCookieProvider.java
index 4808a3c..2d7a2ea 100644
--- a/core-common/src/main/java/org/glassfish/jersey/message/internal/NewCookieProvider.java
+++ b/core-common/src/main/java/org/glassfish/jersey/message/internal/NewCookieProvider.java
@@ -16,13 +16,11 @@
 
 package org.glassfish.jersey.message.internal;
 
-import jakarta.ws.rs.core.Cookie;
 import jakarta.ws.rs.core.NewCookie;
 
 import jakarta.inject.Singleton;
 
 import org.glassfish.jersey.internal.LocalizationMessages;
-import org.glassfish.jersey.http.VersionOptional;
 import org.glassfish.jersey.spi.HeaderDelegateProvider;
 
 import java.util.Locale;
@@ -53,15 +51,7 @@
         b.append(cookie.getName()).append('=');
         StringBuilderUtils.appendQuotedIfWhitespace(b, cookie.getValue());
 
-        boolean printVersion = false;
-        if (cookie instanceof VersionOptional) {
-            printVersion = ((VersionOptional) cookie).hasVersion();
-        } else if (cookie.getVersion() == Cookie.DEFAULT_VERSION) {
-            printVersion = true;
-        }
-        if (printVersion) {
-            b.append(";").append("Version=").append(cookie.getVersion());
-        }
+        b.append(";").append("Version=").append(cookie.getVersion());
 
         if (cookie.getComment() != null) {
             b.append(";Comment=");
diff --git a/core-server/src/main/java/org/glassfish/jersey/server/ContainerRequest.java b/core-server/src/main/java/org/glassfish/jersey/server/ContainerRequest.java
index 65b033e..325bf93 100644
--- a/core-server/src/main/java/org/glassfish/jersey/server/ContainerRequest.java
+++ b/core-server/src/main/java/org/glassfish/jersey/server/ContainerRequest.java
@@ -48,7 +48,6 @@
 import jakarta.ws.rs.ext.WriterInterceptor;
 
 import org.glassfish.jersey.http.HttpHeaders;
-import org.glassfish.jersey.innate.io.StreamListenerCouple;
 import org.glassfish.jersey.internal.PropertiesDelegate;
 import org.glassfish.jersey.internal.guava.Preconditions;
 import org.glassfish.jersey.internal.PropertiesResolver;
@@ -548,12 +547,6 @@
     }
 
     @Override
-    public void wrapEntityInputStream(final StreamListenerCouple input) {
-        Preconditions.checkState(!inResponseProcessingPhase, ERROR_REQUEST_SET_ENTITY_STREAM_IN_RESPONSE_PHASE);
-        super.wrapEntityInputStream(input);
-    }
-
-    @Override
     public Request getRequest() {
         return this;
     }
diff --git a/core-server/src/test/java/org/glassfish/jersey/server/internal/inject/CookieParamAsCookieTest.java b/core-server/src/test/java/org/glassfish/jersey/server/internal/inject/CookieParamAsCookieTest.java
index 3eaa637..e81c446 100644
--- a/core-server/src/test/java/org/glassfish/jersey/server/internal/inject/CookieParamAsCookieTest.java
+++ b/core-server/src/test/java/org/glassfish/jersey/server/internal/inject/CookieParamAsCookieTest.java
@@ -16,24 +16,18 @@
 
 package org.glassfish.jersey.server.internal.inject;
 
-import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ExecutionException;
 
 import jakarta.ws.rs.CookieParam;
-import jakarta.ws.rs.GET;
-import jakarta.ws.rs.HeaderParam;
-import jakarta.ws.rs.HttpMethod;
 import jakarta.ws.rs.POST;
 import jakarta.ws.rs.Path;
 import jakarta.ws.rs.core.Context;
 import jakarta.ws.rs.core.Cookie;
 import jakarta.ws.rs.core.HttpHeaders;
 
-import org.glassfish.jersey.http.JerseyCookie;
 import org.glassfish.jersey.server.RequestContextBuilder;
 
-import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
@@ -44,63 +38,39 @@
  */
 public class CookieParamAsCookieTest extends AbstractTest {
 
-    private static final String ONE = "one";
-    private static final String TWO = "two";
-    private static final String VALUE_ONE = "value_one";
-    private static final String VALUE_TWO = "value_two";
-
 
     @Path("/")
     public static class CookieTypeResource {
         @POST
         public String post(
                 @Context HttpHeaders h,
-                @CookieParam(ONE) Cookie one,
-                @CookieParam(TWO) Cookie two,
+                @CookieParam("one") Cookie one,
+                @CookieParam("two") Cookie two,
                 @CookieParam("three") Cookie three) {
-            assertEquals(ONE, one.getName());
-            assertEquals(VALUE_ONE, one.getValue());
+            assertEquals("one", one.getName());
+            assertEquals("value_one", one.getValue());
 
-            assertEquals(TWO, two.getName());
-            assertEquals(VALUE_TWO, two.getValue());
+            assertEquals("two", two.getName());
+            assertEquals("value_two", two.getValue());
 
             assertEquals(null, three);
 
             Map<String, Cookie> cs = h.getCookies();
             assertEquals(2, cs.size());
-            assertEquals(VALUE_ONE, cs.get(ONE).getValue());
-            assertEquals(VALUE_TWO, cs.get(TWO).getValue());
+            assertEquals("value_one", cs.get("one").getValue());
+            assertEquals("value_two", cs.get("two").getValue());
 
             return "content";
         }
-
-        @Path("list")
-        @GET
-        public String list(@CookieParam(ONE) Cookie one,
-                           @CookieParam(TWO) Cookie two,
-                           @HeaderParam("Cookie") List<Cookie> cookies) {
-            return cookies.get(0).toString() + ',' + cookies.get(1).toString();
-        }
-
     }
 
     @Test
     public void testCookieParam() throws ExecutionException, InterruptedException {
         initiateWebApplication(CookieTypeResource.class);
 
-        Cookie one = new Cookie(ONE, VALUE_ONE);
-        Cookie two = new Cookie(TWO, VALUE_TWO);
+        Cookie one = new Cookie("one", "value_one");
+        Cookie two = new Cookie("two", "value_two");
 
         assertEquals("content", apply(RequestContextBuilder.from("/", "POST").cookie(one).cookie(two).build()).getEntity());
     }
-
-    @Test
-    public void testCookieList() throws ExecutionException, InterruptedException {
-        initiateWebApplication(CookieTypeResource.class);
-
-        Cookie one = new Cookie.Builder(ONE).version(-1).value(VALUE_ONE).build();
-        Cookie two = new JerseyCookie.Builder(TWO).value(VALUE_TWO).build();
-        Object response = apply(RequestContextBuilder.from("/list", HttpMethod.GET).cookie(one).cookie(two).build()).getEntity();
-        Assertions.assertEquals(ONE + '=' + VALUE_ONE + ',' + TWO + '=' + VALUE_TWO, response);
-    }
 }
diff --git a/core-server/src/test/java/org/glassfish/jersey/server/internal/inject/CookieParamAsStringTest.java b/core-server/src/test/java/org/glassfish/jersey/server/internal/inject/CookieParamAsStringTest.java
index 1ba1be5..0426b4b 100644
--- a/core-server/src/test/java/org/glassfish/jersey/server/internal/inject/CookieParamAsStringTest.java
+++ b/core-server/src/test/java/org/glassfish/jersey/server/internal/inject/CookieParamAsStringTest.java
@@ -22,14 +22,11 @@
 import jakarta.ws.rs.CookieParam;
 import jakarta.ws.rs.DefaultValue;
 import jakarta.ws.rs.GET;
-import jakarta.ws.rs.HeaderParam;
 import jakarta.ws.rs.POST;
 import jakarta.ws.rs.Path;
 import jakarta.ws.rs.Produces;
 import jakarta.ws.rs.core.Cookie;
 
-import jakarta.ws.rs.core.MediaType;
-import org.glassfish.jersey.http.JerseyCookie;
 import org.glassfish.jersey.server.ContainerResponse;
 import org.glassfish.jersey.server.RequestContextBuilder;
 
@@ -105,19 +102,6 @@
             assertEquals("a", args.get(0));
             return "content";
         }
-
-        @GET
-        @Path("headerparam/list")
-        public String list(@HeaderParam("Cookie") List<String> cookies) {
-            StringBuilder sb = new StringBuilder();
-            for (String c : cookies) {
-                if (sb.length() != 0) {
-                    sb.append(',');
-                }
-                sb.append(c);
-            }
-            return sb.toString();
-        }
     }
 
     @Path("/")
@@ -282,22 +266,6 @@
     }
 
     @Test
-    public void testStringListHeaderParam() throws ExecutionException, InterruptedException {
-        String cookieName1 = "COOKIE_1";
-        String cookieValue1 = "VALUE_1";
-        String cookieName2 = "COOKIE_2";
-        String cookieValue2 = "VALUE_2";
-
-        initiateWebApplication(ResourceStringList.class);
-
-        Cookie one = new Cookie.Builder(cookieName1).version(-1).value(cookieValue1).build();
-        Cookie two = new JerseyCookie.Builder(cookieName2).value(cookieValue2).build();
-
-        assertEquals(cookieName1 + '=' + cookieValue1 + "," + cookieName2 + '=' + cookieValue2,
-                getResponseContext("/headerparam/list", MediaType.MEDIA_TYPE_WILDCARD, one, two).getEntity());
-    }
-
-    @Test
     public void testStringListEmptyGet() throws ExecutionException, InterruptedException {
         initiateWebApplication(ResourceStringListEmpty.class);
 
diff --git a/docs/src/main/docbook/appendix-properties.xml b/docs/src/main/docbook/appendix-properties.xml
index c4d66aa..43b5bed 100644
--- a/docs/src/main/docbook/appendix-properties.xml
+++ b/docs/src/main/docbook/appendix-properties.xml
@@ -1022,25 +1022,6 @@
                             </para>
                         </entry>
                     </row>
-                    <row>
-                        <entry>&jersey.servlet.ServletProperties.WAIT_FOR_INPUT;</entry>
-                        <entry><literal>jersey.config.servlet.expect.input</literal></entry>
-                        <entry>
-                            <para>
-                                If <literal>true</literal> then Jersey will wait for input when the request is a POST or PUT.
-                            </para>
-                        </entry>
-                    </row>
-                    <row>
-                        <entry>&jersey.servlet.ServletProperties.WAIT_FOR_INPUT_TIMEOUT;</entry>
-                        <entry><literal>jersey.config.servlet.expect.input</literal></entry>
-                        <entry>
-                            <para>
-                                The timeout in milliseconds for waiting for input when the request is a POST or PUT.
-                                Default value is  <literal>100</literal> milliseconds.
-                            </para>
-                        </entry>
-                    </row>
                 </tbody>
             </tgroup>
         </table>
diff --git a/docs/src/main/docbook/jersey.ent b/docs/src/main/docbook/jersey.ent
index 905b8d1..614c765 100644
--- a/docs/src/main/docbook/jersey.ent
+++ b/docs/src/main/docbook/jersey.ent
@@ -726,8 +726,6 @@
 <!ENTITY jersey.servlet.ServletProperties.PROVIDER_WEB_APP "<link xlink:href='&jersey.javadoc.uri.prefix;/servlet/ServletProperties.html#PROVIDER_WEB_APP'>ServletProperties.PROVIDER_WEB_APP</link>">
 <!ENTITY jersey.servlet.ServletProperties.QUERY_PARAMS_AS_FORM_PARAMS_DISABLED "<link xlink:href='&jersey.javadoc.uri.prefix;/servlet/ServletProperties.html#QUERY_PARAMS_AS_FORM_PARAMS_DISABLED'>ServletProperties.QUERY_PARAMS_AS_FORM_PARAMS_DISABLED</link>">
 <!ENTITY jersey.servlet.ServletProperties.SERVICE_LOCATOR "<link xlink:href='&jersey.javadoc.uri.prefix;/servlet/ServletProperties.html#SERVICE_LOCATOR'>ServletProperties.SERVICE_LOCATOR</link>">
-<!ENTITY jersey.servlet.ServletProperties.WAIT_FOR_INPUT "<link xlink:href='&jersey.javadoc.uri.prefix;/servlet/ServletProperties.html#WAIT_FOR_INPUT'>ServletProperties.WAIT_FOR_INPUT</link>">
-<!ENTITY jersey.servlet.ServletProperties.WAIT_FOR_INPUT_TIMEOUT "<link xlink:href='&jersey.javadoc.uri.prefix;/servlet/ServletProperties.html#WAIT_FOR_INPUT_TIMEOUT'>ServletProperties.WAIT_FOR_INPUT_TIMEOUT</link>">
 <!ENTITY jersey.simple.SimpleContainer "<link xlink:href='&jersey.javadoc.uri.prefix;/simple/SimpleContainer.html'>SimpleContainer</link>">
 <!ENTITY jersey.simple.SimpleContainerFactory "<link xlink:href='&jersey.javadoc.uri.prefix;/simple/SimpleContainerFactory.html'>SimpleContainerFactory</link>">
 <!ENTITY jersey.simple.SimpleContainerProvider "<link xlink:href='&jersey.javadoc.uri.prefix;/simple/SimpleContainerProvider.html'>SimpleContainerProvider</link>">
diff --git a/tests/e2e-client/pom.xml b/tests/e2e-client/pom.xml
index 90426d5..3dce2ff 100644
--- a/tests/e2e-client/pom.xml
+++ b/tests/e2e-client/pom.xml
@@ -112,11 +112,6 @@
             <scope>test</scope>
         </dependency>
         <dependency>
-            <groupId>org.glassfish.jersey.media</groupId>
-            <artifactId>jersey-media-json-jackson</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
             <groupId>org.glassfish.jersey.ext</groupId>
             <artifactId>jersey-entity-filtering</artifactId>
             <scope>test</scope>
@@ -245,12 +240,6 @@
                     <groupId>org.glassfish.jersey.test-framework.providers</groupId>
                     <artifactId>jersey-test-framework-provider-jetty</artifactId>
                 </dependency>
-                <dependency>
-                    <groupId>org.eclipse.jetty.ee10</groupId>
-                    <artifactId>jetty-ee10-servlet</artifactId>
-                    <version>${jetty.version}</version>
-                    <scope>test</scope>
-                </dependency>
             </dependencies>
         </profile>
         <profile>
@@ -343,7 +332,6 @@
                                         <testExclude>org/glassfish/jersey/tests/e2e/client/connector/proxy/Proxy*Test.java</testExclude>
                                         <testExclude>org/glassfish/jersey/tests/e2e/client/connector/NoContentLengthTest.java</testExclude>
                                         <testExclude>org/glassfish/jersey/tests/e2e/client/nettyconnector/Expect100ContinueTest.java</testExclude>
-                                        <testExclude>org/glassfish/jersey/tests/e2e/client/ResponseReadEntityStreamTest.java</testExclude>
                                     </testExcludes>
                                 </configuration>
                                 <goals>
diff --git a/tests/e2e-client/src/test/java/org/glassfish/jersey/tests/e2e/client/ResponseReadEntityStreamTest.java b/tests/e2e-client/src/test/java/org/glassfish/jersey/tests/e2e/client/ResponseReadEntityStreamTest.java
deleted file mode 100644
index 2633d6b..0000000
--- a/tests/e2e-client/src/test/java/org/glassfish/jersey/tests/e2e/client/ResponseReadEntityStreamTest.java
+++ /dev/null
@@ -1,203 +0,0 @@
-/*
- * Copyright (c) 2025 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.glassfish.jersey.tests.e2e.client;
-
-import jakarta.inject.Inject;
-import jakarta.servlet.ServletInputStream;
-import jakarta.servlet.http.HttpServletRequest;
-import jakarta.ws.rs.Consumes;
-import jakarta.ws.rs.POST;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.Produces;
-import jakarta.ws.rs.client.Entity;
-import jakarta.ws.rs.client.Invocation;
-import jakarta.ws.rs.core.Application;
-import jakarta.ws.rs.core.MediaType;
-import jakarta.ws.rs.core.Response;
-import com.fasterxml.jackson.core.JsonFactory;
-import com.fasterxml.jackson.core.JsonGenerator;
-import org.eclipse.jetty.ee10.servlet.ServletContextHandler;
-import org.eclipse.jetty.ee10.servlet.ServletHolder;
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.server.ServerConnector;
-import org.glassfish.jersey.client.ClientConfig;
-import org.glassfish.jersey.jetty.JettyHttpContainerFactory;
-import org.glassfish.jersey.server.ResourceConfig;
-import org.glassfish.jersey.servlet.ServletContainer;
-import org.glassfish.jersey.test.JerseyTest;
-import org.glassfish.jersey.test.spi.TestContainer;
-import org.glassfish.jersey.test.spi.TestContainerException;
-import org.glassfish.jersey.test.spi.TestContainerFactory;
-import org.junit.jupiter.api.Test;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URI;
-import java.nio.file.Files;
-import java.nio.file.Paths;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-/**
- * Tests the presence of the first byte in very large stream in each of 1000 requests
- * Particularly for {@link org.glassfish.jersey.message.internal.EntityInputStream#isEmpty} method
- * <p>
- * Also introduces mixture of the Jetty server and servlet holder in which the error was reproduced.
- */
-public class ResponseReadEntityStreamTest extends JerseyTest {
-
-    @Override
-    protected TestContainerFactory getTestContainerFactory() throws TestContainerException {
-        return (baseUri, deploymentContext) -> {
-            final Server server = JettyHttpContainerFactory.createServer(baseUri, false);
-            final ServerConnector connector = new ServerConnector(server);
-            connector.setPort(9001);
-            server.addConnector(connector);
-
-            final ResourceConfig resConfig = new ResourceConfig(Analyze.class);
-
-            final ServletContainer jerseyServletContainer = new ServletContainer(resConfig);
-            final ServletHolder jettyServletHolder = new ServletHolder(jerseyServletContainer);
-
-            final ServletContextHandler context = new ServletContextHandler(ServletContextHandler.NO_SESSIONS);
-            context.setContextPath("/");
-
-            context.addServlet(jettyServletHolder, "/api/*");
-
-            server.setHandler(context);
-            return new TestContainer() {
-                @Override
-                public ClientConfig getClientConfig() {
-                    return new ClientConfig();
-                }
-
-                @Override
-                public URI getBaseUri() {
-                    return baseUri;
-                }
-
-                @Override
-                public void start() {
-                    try {
-                        server.start();
-                    } catch (Exception e) {
-                        throw new RuntimeException(e);
-                    }
-                }
-
-                @Override
-                public void stop() {
-                    try {
-                        server.stop();
-                    } catch (Exception e) {
-                        throw new RuntimeException(e);
-                    }
-                }
-            };
-        };
-    }
-
-    @Override
-    protected Application configure() {
-        return new ResourceConfig(ResponseReadEntityStreamTest.Analyze.class);
-    }
-
-    private static void generateJson(final String filePath, int recordCount) throws IOException {
-
-        try (final JsonGenerator generator = new JsonFactory().createGenerator(new FileWriter(filePath))) {
-            generator.writeStartArray();
-
-            for (int i = 0; i < recordCount; i++) {
-                generator.writeStartObject();
-                generator.writeNumberField("id", i);
-                generator.writeStringField("name", "User" + i);
-                // Add more fields as needed
-                generator.writeEndObject();
-
-                if (i % 10000 == 0) {
-                    generator.flush();
-                }
-            }
-
-            generator.writeEndArray();
-        }
-    }
-
-    @Test
-    public void readEntityTest() throws IOException {
-        final Invocation.Builder requestBuilder = target("/api/v1/analyze").request();
-        //iterate 1000 requests to be sure the first byte is not lost
-        final String fileName = "bigFile.json";
-        final String path = "target/" + fileName;
-
-        final java.nio.file.Path pathResource = Paths.get(path);
-
-        final java.nio.file.Path realFilePath = Files.createFile(pathResource.toAbsolutePath());
-
-        try {
-
-            generateJson(realFilePath.toString(), 1000000); // 33Mb real file size
-
-            final File bigFile = realFilePath.toFile();
-
-            for (int i = 1; i < 1000; i++) {
-                try (final FileInputStream stream = new FileInputStream(bigFile)) {
-                    final Response response = requestBuilder.post(Entity.entity(stream,
-                            MediaType.APPLICATION_FORM_URLENCODED_TYPE));
-                    assertEquals(200, response.getStatus());
-                    response.close();
-                }
-            }
-        } finally {
-            Files.deleteIfExists(pathResource);
-        }
-
-    }
-
-    @Path("/v1")
-    @Produces(MediaType.APPLICATION_JSON)
-    public static class Analyze {
-
-        @Inject
-        private HttpServletRequest request;
-
-        @POST
-        @Path("/analyze")
-        @Produces(MediaType.APPLICATION_JSON)
-        @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
-        public Response analyze() {
-
-            try (final ServletInputStream inputStream = request.getInputStream()) {
-                final byte[] content = inputStream.readAllBytes();
-
-                if (content[0] != 91 /* character [ */) { // https://www.ascii-code.com/91
-                    throw new Exception("Oops");
-                }
-
-                return Response.ok("{\"status\":\"OK\"}").build();
-
-            } catch (Exception e) {
-                return Response.serverError().build();
-            }
-
-        }
-    }
-
-}
diff --git a/tests/e2e/src/test/java/org/glassfish/jersey/tests/api/CookieImplTest.java b/tests/e2e/src/test/java/org/glassfish/jersey/tests/api/CookieImplTest.java
index b54228e..53cd76d 100644
--- a/tests/e2e/src/test/java/org/glassfish/jersey/tests/api/CookieImplTest.java
+++ b/tests/e2e/src/test/java/org/glassfish/jersey/tests/api/CookieImplTest.java
@@ -46,8 +46,8 @@
         expResult = "$Version=1;fred=flintstone;$Domain=.sun.com;$Path=/path";
         assertEquals(expResult, cookie.toString());
 
-        cookie = new Cookie("fred", "flintstone", "/path", ".sun.com", 0);
-        expResult = "$Version=0;fred=flintstone;$Domain=.sun.com;$Path=/path";
+        cookie = new Cookie("fred", "flintstone", "/path", ".sun.com", 2);
+        expResult = "$Version=2;fred=flintstone;$Domain=.sun.com;$Path=/path";
         assertEquals(expResult, cookie.toString());
     }
 
