You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hc.apache.org by ol...@apache.org on 2021/11/29 10:44:02 UTC

[httpcomponents-client] branch master updated: HTTPCLIENT-2189 - Use Time APIs for date internal class and Cookie.

This is an automated email from the ASF dual-hosted git repository.

olegk pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/httpcomponents-client.git


The following commit(s) were added to refs/heads/master by this push:
     new 6a360aa  HTTPCLIENT-2189 - Use Time APIs for date internal class and Cookie.
6a360aa is described below

commit 6a360aacc87b6623035d327b4b06b25febb5c439
Author: Arturo Bernal <ar...@gmail.com>
AuthorDate: Tue Nov 23 06:27:33 2021 +0100

    HTTPCLIENT-2189 - Use Time APIs for date internal class and Cookie.
---
 .../hc/client5/http/cache/HttpCacheEntry.java      |  98 ++++++++++-
 .../client5/http/impl/cache/AsyncCachingExec.java  |  36 ++--
 .../http/impl/cache/BasicHttpAsyncCache.java       |  14 +-
 .../hc/client5/http/impl/cache/BasicHttpCache.java |  14 +-
 .../impl/cache/ByteArrayCacheEntrySerializer.java  |   1 +
 .../http/impl/cache/CacheUpdateHandler.java        |  16 +-
 .../http/impl/cache/CacheValidityPolicy.java       |  49 +++---
 .../impl/cache/CachedHttpResponseGenerator.java    |   3 +-
 .../cache/CachedResponseSuitabilityChecker.java    |  10 +-
 .../hc/client5/http/impl/cache/CachingExec.java    |  24 +--
 .../client5/http/impl/cache/CachingExecBase.java   |  16 +-
 .../hc/client5/http/impl/cache/HttpAsyncCache.java |  14 +-
 .../cache/HttpByteArrayCacheEntrySerializer.java   |  16 +-
 .../hc/client5/http/impl/cache/HttpCache.java      |  14 +-
 .../impl/cache/ResponseProtocolCompliance.java     |   5 +-
 .../hc/client5/http/impl/cache/WarningValue.java   |  12 +-
 .../hc/client5/http/cache/TestHttpCacheEntry.java  |  78 +++++----
 ...HttpByteArrayCacheEntrySerializerTestUtils.java |  15 +-
 .../http/impl/cache/HttpCacheEntryMatcher.java     |  15 +-
 .../hc/client5/http/impl/cache/HttpTestUtils.java  |  54 +++---
 .../http/impl/cache/TestBasicHttpCache.java        |   9 +-
 .../cache/TestByteArrayCacheEntrySerializer.java   |  38 ++++-
 .../http/impl/cache/TestCacheUpdateHandler.java    |  33 ++--
 .../http/impl/cache/TestCacheValidityPolicy.java   |  41 +++--
 .../cache/TestCachedHttpResponseGenerator.java     |  10 +-
 .../TestCachedResponseSuitabilityChecker.java      |  40 ++---
 .../http/impl/cache/TestCachingExecChain.java      |  10 +-
 .../TestHttpByteArrayCacheEntrySerializer.java     | 181 +++++++++++----------
 .../client5/http/impl/cache/TestWarningValue.java  |   6 +-
 .../org/apache/hc/client5/http/fluent/Request.java |  28 ++++
 .../hc/client5/http/config/RequestConfig.java      |   2 +-
 .../hc/client5/http/cookie/BasicCookieStore.java   |  32 +++-
 .../org/apache/hc/client5/http/cookie/Cookie.java  |  39 +++++
 .../http/cookie/CookiePriorityComparator.java      |   8 +-
 .../apache/hc/client5/http/cookie/CookieStore.java |  14 ++
 .../apache/hc/client5/http/cookie/SetCookie.java   |  21 ++-
 .../http/impl/async/HttpAsyncClientBuilder.java    |   2 +-
 .../http/impl/cookie/BasicClientCookie.java        |  65 +++++++-
 .../http/impl/cookie/BasicExpiresHandler.java      |   2 +-
 .../http/impl/cookie/BasicMaxAgeHandler.java       |   4 +-
 .../http/impl/cookie/LaxExpiresHandler.java        |   3 +-
 .../client5/http/impl/cookie/LaxMaxAgeHandler.java |   6 +-
 .../http/impl/cookie/RFC6265CookieSpec.java        |   4 +-
 .../impl/io/BasicHttpClientConnectionManager.java  |   4 +-
 .../client5/http/protocol/RequestAddCookies.java   |   4 +-
 .../http/protocol/ResponseProcessCookies.java      |   2 +-
 .../client5/http/ssl/DefaultClientTlsStrategy.java |   1 +
 .../http/cookie/TestCookiePriorityComparator.java  |   6 +-
 .../impl/cookie/TestBasicCookieAttribHandlers.java |   4 +-
 .../http/impl/cookie/TestBasicCookieStore.java     |   8 +-
 .../impl/cookie/TestLaxCookieAttribHandlers.java   | 118 ++++++++++++--
 .../http/protocol/TestRequestAddCookies.java       |   6 +-
 52 files changed, 821 insertions(+), 434 deletions(-)

diff --git a/httpclient5-cache/src/main/java/org/apache/hc/client5/http/cache/HttpCacheEntry.java b/httpclient5-cache/src/main/java/org/apache/hc/client5/http/cache/HttpCacheEntry.java
index 578a722..11432ac 100644
--- a/httpclient5-cache/src/main/java/org/apache/hc/client5/http/cache/HttpCacheEntry.java
+++ b/httpclient5-cache/src/main/java/org/apache/hc/client5/http/cache/HttpCacheEntry.java
@@ -27,6 +27,7 @@
 package org.apache.hc.client5.http.cache;
 
 import java.io.Serializable;
+import java.time.Instant;
 import java.util.Collections;
 import java.util.Date;
 import java.util.HashMap;
@@ -59,13 +60,13 @@ public class HttpCacheEntry implements MessageHeaders, Serializable {
     private static final long serialVersionUID = -6300496422359477413L;
     private static final String REQUEST_METHOD_HEADER_NAME = "Hc-Request-Method";
 
-    private final Date requestDate;
-    private final Date responseDate;
+    private final Instant requestDate;
+    private final Instant responseDate;
     private final int status;
     private final HeaderGroup responseHeaders;
     private final Resource resource;
     private final Map<String, String> variantMap;
-    private final Date date;
+    private final Instant date;
 
     /**
      * Create a new {@link HttpCacheEntry} with variants.
@@ -84,7 +85,9 @@ public class HttpCacheEntry implements MessageHeaders, Serializable {
      *   of this parent entry; this maps a "variant key" (derived
      *   from the varying request headers) to a "cache key" (where
      *   in the cache storage the particular variant is located)
+     * @deprecated  Use {{@link #HttpCacheEntry(Instant, Instant, int, Header[], Resource, Map)}}
      */
+    @Deprecated
     public HttpCacheEntry(
             final Date requestDate,
             final Date responseDate,
@@ -97,6 +100,42 @@ public class HttpCacheEntry implements MessageHeaders, Serializable {
         Args.notNull(responseDate, "Response date");
         Args.check(status >= HttpStatus.SC_SUCCESS, "Status code");
         Args.notNull(responseHeaders, "Response headers");
+        this.requestDate = DateUtils.toInstant(requestDate);
+        this.responseDate = DateUtils.toInstant(responseDate);
+        this.status = status;
+        this.responseHeaders = new HeaderGroup();
+        this.responseHeaders.setHeaders(responseHeaders);
+        this.resource = resource;
+        this.variantMap = variantMap != null ? new HashMap<>(variantMap) : null;
+        this.date = parseDate();
+    }
+
+    /**
+     * Create a new {@link HttpCacheEntry} with variants.
+     *
+     * @param requestDate     Date/time when the request was made (Used for age calculations)
+     * @param responseDate    Date/time that the response came back (Used for age calculations)
+     * @param status          HTTP status from origin response
+     * @param responseHeaders Header[] from original HTTP Response
+     * @param resource        representing origin response body
+     * @param variantMap      describing cache entries that are variants of this parent entry; this
+     *                        maps a "variant key" (derived from the varying request headers) to a
+     *                        "cache key" (where in the cache storage the particular variant is
+     *                        located)
+     * @since 5.2
+     */
+    public HttpCacheEntry(
+            final Instant requestDate,
+            final Instant responseDate,
+            final int status,
+            final Header[] responseHeaders,
+            final Resource resource,
+            final Map<String, String> variantMap) {
+        super();
+        Args.notNull(requestDate, "Request date");
+        Args.notNull(responseDate, "Response date");
+        Args.check(status >= HttpStatus.SC_SUCCESS, "Status code");
+        Args.notNull(responseHeaders, "Response headers");
         this.requestDate = requestDate;
         this.responseDate = responseDate;
         this.status = status;
@@ -110,6 +149,21 @@ public class HttpCacheEntry implements MessageHeaders, Serializable {
     /**
      * Create a new {@link HttpCacheEntry}.
      *
+     * @param requestDate     Date/time when the request was made (Used for age calculations)
+     * @param responseDate    Date/time that the response came back (Used for age calculations)
+     * @param status          HTTP status from origin response
+     * @param responseHeaders Header[] from original HTTP Response
+     * @param resource        representing origin response body
+     * @deprecated {{@link #HttpCacheEntry(Instant, Instant, int, Header[], Resource)}}
+     */
+    @Deprecated
+    public HttpCacheEntry(final Date requestDate, final Date responseDate, final int status,
+                          final Header[] responseHeaders, final Resource resource) {
+        this(requestDate, responseDate, status, responseHeaders, resource, new HashMap<>());
+    }
+    /**
+     * Create a new {@link HttpCacheEntry}.
+     *
      * @param requestDate
      *          Date/time when the request was made (Used for age
      *            calculations)
@@ -122,17 +176,17 @@ public class HttpCacheEntry implements MessageHeaders, Serializable {
      *          Header[] from original HTTP Response
      * @param resource representing origin response body
      */
-    public HttpCacheEntry(final Date requestDate, final Date responseDate, final int status,
-            final Header[] responseHeaders, final Resource resource) {
+    public HttpCacheEntry(final Instant requestDate, final Instant responseDate, final int status,
+                          final Header[] responseHeaders, final Resource resource) {
         this(requestDate, responseDate, status, responseHeaders, resource, new HashMap<>());
     }
 
     /**
-     * Find the "Date" response header and parse it into a java.util.Date
+     * Find the "Date" response header and parse it into a {@link Instant}
      * @return the Date value of the header or null if the header is not present
      */
-    private Date parseDate() {
-        return DateUtils.toDate(DateUtils.parseStandardDate(this, HttpHeaders.DATE));
+    private Instant parseDate() {
+        return DateUtils.parseStandardDate(this, HttpHeaders.DATE);
     }
 
     /**
@@ -146,16 +200,40 @@ public class HttpCacheEntry implements MessageHeaders, Serializable {
      * Returns the time the associated origin request was initiated by the
      * caching module.
      * @return {@link Date}
+     * @deprecated USe {@link #getRequestInstant()}
      */
+    @Deprecated
     public Date getRequestDate() {
+        return DateUtils.toDate(requestDate);
+    }
+
+    /**
+     * Returns the time the associated origin request was initiated by the
+     * caching module.
+     * @return {@link Instant}
+     * @since 5.2
+     */
+    public Instant getRequestInstant() {
         return requestDate;
     }
 
     /**
      * Returns the time the origin response was received by the caching module.
      * @return {@link Date}
+     * @deprecated  Use {@link #getResponseInstant()}
      */
+    @Deprecated
     public Date getResponseDate() {
+        return DateUtils.toDate(responseDate);
+    }
+
+    /**
+     * Returns the time the origin response was received by the caching module.
+     *
+     * @return {@link Instant}
+     * @since 5.2
+     */
+    public Instant getResponseInstant() {
         return responseDate;
     }
 
@@ -253,6 +331,10 @@ public class HttpCacheEntry implements MessageHeaders, Serializable {
      * @since 4.3
      */
     public Date getDate() {
+        return DateUtils.toDate(date);
+    }
+
+    public Instant getInstant() {
         return date;
     }
 
diff --git a/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/AsyncCachingExec.java b/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/AsyncCachingExec.java
index 6cc9832..ad7704d 100644
--- a/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/AsyncCachingExec.java
+++ b/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/AsyncCachingExec.java
@@ -29,7 +29,7 @@ package org.apache.hc.client5.http.impl.cache;
 import java.io.IOException;
 import java.io.InterruptedIOException;
 import java.nio.ByteBuffer;
-import java.util.Date;
+import java.time.Instant;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ScheduledExecutorService;
@@ -309,7 +309,7 @@ class AsyncCachingExec extends CachingExecBase implements AsyncExecChainHandler
             final AsyncExecChain chain,
             final AsyncExecCallback asyncExecCallback) {
         LOG.debug("Calling the backend");
-        final Date requestDate = getCurrentDate();
+        final Instant requestDate = getCurrentDate();
         final AtomicReference<AsyncExecCallback> callbackRef = new AtomicReference<>();
         chainProceed(request, entityProducer, scope, chain, new AsyncExecCallback() {
 
@@ -317,7 +317,7 @@ class AsyncCachingExec extends CachingExecBase implements AsyncExecChainHandler
             public AsyncDataConsumer handleResponse(
                     final HttpResponse backendResponse,
                     final EntityDetails entityDetails) throws HttpException, IOException {
-                final Date responseDate = getCurrentDate();
+                final Instant responseDate = getCurrentDate();
                 backendResponse.addHeader("Via", generateViaHeader(backendResponse));
 
                 final AsyncExecCallback callback = new BackendResponseHandler(target, request, requestDate, responseDate, scope, asyncExecCallback);
@@ -446,8 +446,8 @@ class AsyncCachingExec extends CachingExecBase implements AsyncExecChainHandler
 
         private final HttpHost target;
         private final HttpRequest request;
-        private final Date requestDate;
-        private final Date responseDate;
+        private final Instant requestDate;
+        private final Instant responseDate;
         private final AsyncExecChain.Scope scope;
         private final AsyncExecCallback asyncExecCallback;
         private final AtomicReference<CachingAsyncDataConsumer> cachingConsumerRef;
@@ -455,8 +455,8 @@ class AsyncCachingExec extends CachingExecBase implements AsyncExecChainHandler
         BackendResponseHandler(
                 final HttpHost target,
                 final HttpRequest request,
-                final Date requestDate,
-                final Date responseDate,
+                final Instant requestDate,
+                final Instant responseDate,
                 final AsyncExecChain.Scope scope,
                 final AsyncExecCallback asyncExecCallback) {
             this.target = target;
@@ -525,7 +525,7 @@ class AsyncCachingExec extends CachingExecBase implements AsyncExecChainHandler
             asyncExecCallback.handleInformationResponse(response);
         }
 
-        void triggerNewCacheEntryResponse(final HttpResponse backendResponse, final Date responseDate, final ByteArrayBuffer buffer) {
+        void triggerNewCacheEntryResponse(final HttpResponse backendResponse, final Instant responseDate, final ByteArrayBuffer buffer) {
             final CancellableDependency operation = scope.cancellableDependency;
             operation.setDependency(responseCache.createCacheEntry(
                     target,
@@ -622,7 +622,7 @@ class AsyncCachingExec extends CachingExecBase implements AsyncExecChainHandler
             final HttpCacheEntry entry) {
         final HttpClientContext context  = scope.clientContext;
         recordCacheHit(target, request);
-        final Date now = getCurrentDate();
+        final Instant now = getCurrentDate();
         if (suitabilityChecker.canCachedResponseBeUsed(target, request, entry, now)) {
             LOG.debug("Cache hit");
             try {
@@ -690,7 +690,7 @@ class AsyncCachingExec extends CachingExecBase implements AsyncExecChainHandler
             final AsyncExecChain chain,
             final AsyncExecCallback asyncExecCallback,
             final HttpCacheEntry cacheEntry) {
-        final Date requestDate = getCurrentDate();
+        final Instant requestDate = getCurrentDate();
         final HttpRequest conditionalRequest = conditionalRequestBuilder.buildConditionalRequest(
                 BasicRequestBuilder.copy(scope.originalRequest).build(),
                 cacheEntry);
@@ -698,7 +698,7 @@ class AsyncCachingExec extends CachingExecBase implements AsyncExecChainHandler
 
             final AtomicReference<AsyncExecCallback> callbackRef = new AtomicReference<>();
 
-            void triggerUpdatedCacheEntryResponse(final HttpResponse backendResponse, final Date responseDate) {
+            void triggerUpdatedCacheEntryResponse(final HttpResponse backendResponse, final Instant responseDate) {
                 final CancellableDependency operation = scope.cancellableDependency;
                 recordCacheUpdate(scope.clientContext);
                 operation.setDependency(responseCache.updateCacheEntry(
@@ -713,7 +713,7 @@ class AsyncCachingExec extends CachingExecBase implements AsyncExecChainHandler
                             @Override
                             public void completed(final HttpCacheEntry updatedEntry) {
                                 if (suitabilityChecker.isConditional(request)
-                                        && suitabilityChecker.allConditionalsMatch(request, updatedEntry, new Date())) {
+                                        && suitabilityChecker.allConditionalsMatch(request, updatedEntry, Instant.now())) {
                                     final SimpleHttpResponse cacheResponse = responseGenerator.generateNotModifiedResponse(updatedEntry);
                                     triggerResponse(cacheResponse, scope, asyncExecCallback);
                                 } else {
@@ -749,7 +749,7 @@ class AsyncCachingExec extends CachingExecBase implements AsyncExecChainHandler
                 }
             }
 
-            AsyncExecCallback evaluateResponse(final HttpResponse backendResponse, final Date responseDate) {
+            AsyncExecCallback evaluateResponse(final HttpResponse backendResponse, final Instant responseDate) {
                 backendResponse.addHeader(HeaderConstants.VIA, generateViaHeader(backendResponse));
 
                 final int statusCode = backendResponse.getCode();
@@ -772,7 +772,7 @@ class AsyncCachingExec extends CachingExecBase implements AsyncExecChainHandler
                     final HttpResponse backendResponse1,
                     final EntityDetails entityDetails) throws HttpException, IOException {
 
-                final Date responseDate1 = getCurrentDate();
+                final Instant responseDate1 = getCurrentDate();
 
                 final AsyncExecCallback callback1;
                 if (revalidationResponseIsTooOld(backendResponse1, cacheEntry)
@@ -787,7 +787,7 @@ class AsyncCachingExec extends CachingExecBase implements AsyncExecChainHandler
                         public AsyncDataConsumer handleResponse(
                                 final HttpResponse backendResponse2,
                                 final EntityDetails entityDetails1) throws HttpException, IOException {
-                            final Date responseDate2 = getCurrentDate();
+                            final Instant responseDate2 = getCurrentDate();
                             final AsyncExecCallback callback2 = evaluateResponse(backendResponse2, responseDate2);
                             callbackRef.set(callback2);
                             return callback2.handleResponse(backendResponse2, entityDetails1);
@@ -920,12 +920,12 @@ class AsyncCachingExec extends CachingExecBase implements AsyncExecChainHandler
                 BasicRequestBuilder.copy(request).build(),
                 variants);
 
-        final Date requestDate = getCurrentDate();
+        final Instant requestDate = getCurrentDate();
         chainProceed(conditionalRequest, entityProducer, scope, chain, new AsyncExecCallback() {
 
             final AtomicReference<AsyncExecCallback> callbackRef = new AtomicReference<>();
 
-            void updateVariantCacheEntry(final HttpResponse backendResponse, final Date responseDate, final Variant matchingVariant) {
+            void updateVariantCacheEntry(final HttpResponse backendResponse, final Instant responseDate, final Variant matchingVariant) {
                 recordCacheUpdate(scope.clientContext);
                 operation.setDependency(responseCache.updateVariantCacheEntry(
                         target,
@@ -989,7 +989,7 @@ class AsyncCachingExec extends CachingExecBase implements AsyncExecChainHandler
             public AsyncDataConsumer handleResponse(
                     final HttpResponse backendResponse,
                     final EntityDetails entityDetails) throws HttpException, IOException {
-                final Date responseDate = getCurrentDate();
+                final Instant responseDate = getCurrentDate();
                 backendResponse.addHeader("Via", generateViaHeader(backendResponse));
 
                 final AsyncExecCallback callback;
diff --git a/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/BasicHttpAsyncCache.java b/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/BasicHttpAsyncCache.java
index 508c814..d89def8 100644
--- a/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/BasicHttpAsyncCache.java
+++ b/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/BasicHttpAsyncCache.java
@@ -26,7 +26,7 @@
  */
 package org.apache.hc.client5.http.impl.cache;
 
-import java.util.Date;
+import java.time.Instant;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Set;
@@ -309,8 +309,8 @@ class BasicHttpAsyncCache implements HttpAsyncCache {
             final HttpRequest request,
             final HttpCacheEntry stale,
             final HttpResponse originResponse,
-            final Date requestSent,
-            final Date responseReceived,
+            final Instant requestSent,
+            final Instant responseReceived,
             final FutureCallback<HttpCacheEntry> callback) {
         if (LOG.isDebugEnabled()) {
             LOG.debug("Update cache entry: {}; {}", host, new RequestLine(request));
@@ -356,8 +356,8 @@ class BasicHttpAsyncCache implements HttpAsyncCache {
             final HttpRequest request,
             final HttpResponse originResponse,
             final Variant variant,
-            final Date requestSent,
-            final Date responseReceived,
+            final Instant requestSent,
+            final Instant responseReceived,
             final FutureCallback<HttpCacheEntry> callback) {
         if (LOG.isDebugEnabled()) {
             LOG.debug("Update variant cache entry: {}; {} / {}", host, new RequestLine(request), variant);
@@ -404,8 +404,8 @@ class BasicHttpAsyncCache implements HttpAsyncCache {
             final HttpRequest request,
             final HttpResponse originResponse,
             final ByteArrayBuffer content,
-            final Date requestSent,
-            final Date responseReceived,
+            final Instant requestSent,
+            final Instant responseReceived,
             final FutureCallback<HttpCacheEntry> callback) {
         if (LOG.isDebugEnabled()) {
             LOG.debug("Create cache entry: {}; {}", host, new RequestLine(request));
diff --git a/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/BasicHttpCache.java b/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/BasicHttpCache.java
index e6a7c1d..0dd4089 100644
--- a/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/BasicHttpCache.java
+++ b/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/BasicHttpCache.java
@@ -26,7 +26,7 @@
  */
 package org.apache.hc.client5.http.impl.cache;
 
-import java.util.Date;
+import java.time.Instant;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -204,8 +204,8 @@ class BasicHttpCache implements HttpCache {
             final HttpRequest request,
             final HttpCacheEntry stale,
             final HttpResponse originResponse,
-            final Date requestSent,
-            final Date responseReceived) {
+            final Instant requestSent,
+            final Instant responseReceived) {
         if (LOG.isDebugEnabled()) {
             LOG.debug("Update cache entry: {}; {}", host, new RequestLine(request));
         }
@@ -233,8 +233,8 @@ class BasicHttpCache implements HttpCache {
             final HttpRequest request,
             final HttpResponse originResponse,
             final Variant variant,
-            final Date requestSent,
-            final Date responseReceived) {
+            final Instant requestSent,
+            final Instant responseReceived) {
         if (LOG.isDebugEnabled()) {
             LOG.debug("Update variant cache entry: {}; {} / {}", host, new RequestLine(request), variant);
         }
@@ -263,8 +263,8 @@ class BasicHttpCache implements HttpCache {
             final HttpRequest request,
             final HttpResponse originResponse,
             final ByteArrayBuffer content,
-            final Date requestSent,
-            final Date responseReceived) {
+            final Instant requestSent,
+            final Instant responseReceived) {
         if (LOG.isDebugEnabled()) {
             LOG.debug("Create cache entry: {}; {}", host, new RequestLine(request));
         }
diff --git a/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/ByteArrayCacheEntrySerializer.java b/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/ByteArrayCacheEntrySerializer.java
index edef053..1bebc95 100644
--- a/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/ByteArrayCacheEntrySerializer.java
+++ b/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/ByteArrayCacheEntrySerializer.java
@@ -90,6 +90,7 @@ public final class ByteArrayCacheEntrySerializer implements HttpCacheEntrySerial
                 Pattern.compile("^(\\[L)?org\\.apache\\.hc\\.(.*)"),
                 Pattern.compile("^(?:\\[+L)?java\\.util\\..*$"),
                 Pattern.compile("^(?:\\[+L)?java\\.lang\\..*$"),
+                Pattern.compile("^(?:\\[+L)?java\\.time\\..*$"), // java 8 time
                 Pattern.compile("^\\[+Z$"), // boolean
                 Pattern.compile("^\\[+B$"), // byte
                 Pattern.compile("^\\[+C$"), // char
diff --git a/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/CacheUpdateHandler.java b/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/CacheUpdateHandler.java
index bdb0d32..29ef51e 100644
--- a/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/CacheUpdateHandler.java
+++ b/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/CacheUpdateHandler.java
@@ -26,7 +26,7 @@
  */
 package org.apache.hc.client5.http.impl.cache;
 
-import java.util.Date;
+import java.time.Instant;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
@@ -69,8 +69,8 @@ class CacheUpdateHandler {
             final HttpRequest request,
             final HttpResponse originResponse,
             final ByteArrayBuffer content,
-            final Date requestSent,
-            final Date responseReceived) throws ResourceIOException {
+            final Instant requestSent,
+            final Instant responseReceived) throws ResourceIOException {
         return new HttpCacheEntry(
                 requestSent,
                 responseReceived,
@@ -86,8 +86,8 @@ class CacheUpdateHandler {
     public HttpCacheEntry updateCacheEntry(
             final String requestId,
             final HttpCacheEntry entry,
-            final Date requestDate,
-            final Date responseDate,
+            final Instant requestDate,
+            final Instant responseDate,
             final HttpResponse response) throws ResourceIOException {
         Args.check(response.getCode() == HttpStatus.SC_NOT_MODIFIED,
                 "Response must have 304 status code");
@@ -103,7 +103,7 @@ class CacheUpdateHandler {
                 mergedHeaders,
                 resource);
     }
-
+    @SuppressWarnings("deprecation")
     public HttpCacheEntry updateParentCacheEntry(
             final String requestId,
             final HttpCacheEntry existing,
@@ -122,8 +122,8 @@ class CacheUpdateHandler {
         final Map<String,String> variantMap = new HashMap<>(src.getVariantMap());
         variantMap.put(variantKey, variantCacheKey);
         return new HttpCacheEntry(
-                src.getRequestDate(),
-                src.getResponseDate(),
+                src.getRequestInstant(),
+                src.getResponseInstant(),
                 src.getStatus(),
                 src.getHeaders(),
                 resource,
diff --git a/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/CacheValidityPolicy.java b/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/CacheValidityPolicy.java
index f29159a..b657e60 100644
--- a/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/CacheValidityPolicy.java
+++ b/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/CacheValidityPolicy.java
@@ -26,8 +26,8 @@
  */
 package org.apache.hc.client5.http.impl.cache;
 
+import java.time.Duration;
 import java.time.Instant;
-import java.util.Date;
 import java.util.Iterator;
 
 import org.apache.hc.client5.http.cache.HeaderConstants;
@@ -50,7 +50,8 @@ class CacheValidityPolicy {
         super();
     }
 
-    public TimeValue getCurrentAge(final HttpCacheEntry entry, final Date now) {
+
+    public TimeValue getCurrentAge(final HttpCacheEntry entry, final Instant now) {
         return TimeValue.ofSeconds(getCorrectedInitialAge(entry).toSeconds() + getResidentTime(entry, now).toSeconds());
     }
 
@@ -60,7 +61,7 @@ class CacheValidityPolicy {
             return TimeValue.ofSeconds(maxAge);
         }
 
-        final Date dateValue = entry.getDate();
+        final Instant dateValue = entry.getInstant();
         if (dateValue == null) {
             return TimeValue.ZERO_MILLISECONDS;
         }
@@ -69,11 +70,11 @@ class CacheValidityPolicy {
         if (expiry == null) {
             return TimeValue.ZERO_MILLISECONDS;
         }
-        final long diff = expiry.toEpochMilli() - dateValue.getTime();
-        return TimeValue.ofSeconds(diff / 1000);
+        final Duration diff = Duration.between(dateValue, expiry);
+        return TimeValue.ofSeconds(diff.getSeconds());
     }
 
-    public boolean isResponseFresh(final HttpCacheEntry entry, final Date now) {
+    public boolean isResponseFresh(final HttpCacheEntry entry, final Instant now) {
         return getCurrentAge(entry, now).compareTo(getFreshnessLifetime(entry)) == -1;
     }
 
@@ -92,21 +93,22 @@ class CacheValidityPolicy {
      * @return {@code true} if the response is fresh
      */
     public boolean isResponseHeuristicallyFresh(final HttpCacheEntry entry,
-            final Date now, final float coefficient, final TimeValue defaultLifetime) {
+            final Instant now, final float coefficient, final TimeValue defaultLifetime) {
         return getCurrentAge(entry, now).compareTo(getHeuristicFreshnessLifetime(entry, coefficient, defaultLifetime)) == -1;
     }
 
     public TimeValue getHeuristicFreshnessLifetime(final HttpCacheEntry entry,
             final float coefficient, final TimeValue defaultLifetime) {
-        final Date dateValue = entry.getDate();
+        final Instant dateValue = entry.getInstant();
         final Instant lastModifiedValue = DateUtils.parseStandardDate(entry, HeaderConstants.LAST_MODIFIED);
 
         if (dateValue != null && lastModifiedValue != null) {
-            final long diff = dateValue.getTime() - lastModifiedValue.toEpochMilli();
-            if (diff < 0) {
+            final Duration diff = Duration.between(lastModifiedValue, dateValue);
+
+            if (diff.isNegative()) {
                 return TimeValue.ZERO_MILLISECONDS;
             }
-            return TimeValue.ofSeconds((long) (coefficient * diff / 1000));
+            return TimeValue.ofSeconds((long) (coefficient * diff.getSeconds()));
         }
 
         return defaultLifetime;
@@ -125,7 +127,7 @@ class CacheValidityPolicy {
         return hasCacheControlDirective(entry, HeaderConstants.CACHE_CONTROL_PROXY_REVALIDATE);
     }
 
-    public boolean mayReturnStaleWhileRevalidating(final HttpCacheEntry entry, final Date now) {
+    public boolean mayReturnStaleWhileRevalidating(final HttpCacheEntry entry, final Instant now) {
         final Iterator<HeaderElement> it = MessageSupport.iterate(entry, HeaderConstants.CACHE_CONTROL);
         while (it.hasNext()) {
             final HeaderElement elt = it.next();
@@ -145,7 +147,7 @@ class CacheValidityPolicy {
         return false;
     }
 
-    public boolean mayReturnStaleIfError(final HttpRequest request, final HttpCacheEntry entry, final Date now) {
+    public boolean mayReturnStaleIfError(final HttpRequest request, final HttpCacheEntry entry, final Instant now) {
         final TimeValue staleness = getStaleness(entry, now);
         return mayReturnStaleIfError(request, HeaderConstants.CACHE_CONTROL, staleness)
                 || mayReturnStaleIfError(entry, HeaderConstants.CACHE_CONTROL, staleness);
@@ -198,15 +200,15 @@ class CacheValidityPolicy {
     }
 
     protected TimeValue getApparentAge(final HttpCacheEntry entry) {
-        final Date dateValue = entry.getDate();
+        final Instant dateValue = entry.getInstant();
         if (dateValue == null) {
             return MAX_AGE;
         }
-        final long diff = entry.getResponseDate().getTime() - dateValue.getTime();
-        if (diff < 0L) {
+        final Duration diff = Duration.between(dateValue, entry.getResponseInstant());
+        if (diff.isNegative()) {
             return TimeValue.ZERO_MILLISECONDS;
         }
-        return TimeValue.ofSeconds(diff / 1000);
+        return TimeValue.ofSeconds(diff.getSeconds());
     }
 
     protected long getAgeValue(final HttpCacheEntry entry) {
@@ -234,19 +236,20 @@ class CacheValidityPolicy {
     }
 
     protected TimeValue getResponseDelay(final HttpCacheEntry entry) {
-        final long diff = entry.getResponseDate().getTime() - entry.getRequestDate().getTime();
-        return TimeValue.ofSeconds(diff / 1000);
+        final Duration diff = Duration.between(entry.getRequestInstant(), entry.getResponseInstant());
+        return TimeValue.ofSeconds(diff.getSeconds());
     }
 
     protected TimeValue getCorrectedInitialAge(final HttpCacheEntry entry) {
         return TimeValue.ofSeconds(getCorrectedReceivedAge(entry).toSeconds() + getResponseDelay(entry).toSeconds());
     }
 
-    protected TimeValue getResidentTime(final HttpCacheEntry entry, final Date now) {
-        final long diff = now.getTime() - entry.getResponseDate().getTime();
-        return TimeValue.ofSeconds(diff / 1000);
+    protected TimeValue getResidentTime(final HttpCacheEntry entry, final Instant now) {
+        final Duration diff = Duration.between(entry.getResponseInstant(), now);
+        return TimeValue.ofSeconds(diff.getSeconds());
     }
 
+
     protected long getMaxAge(final HttpCacheEntry entry) {
         // This is a header value, we leave as-is
         long maxAge = -1;
@@ -279,7 +282,7 @@ class CacheValidityPolicy {
         return false;
     }
 
-    public TimeValue getStaleness(final HttpCacheEntry entry, final Date now) {
+    public TimeValue getStaleness(final HttpCacheEntry entry, final Instant now) {
         final TimeValue age = getCurrentAge(entry, now);
         final TimeValue freshness = getFreshnessLifetime(entry);
         if (age.compareTo(freshness) <= 0) {
diff --git a/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/CachedHttpResponseGenerator.java b/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/CachedHttpResponseGenerator.java
index fab60b6..968330e 100644
--- a/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/CachedHttpResponseGenerator.java
+++ b/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/CachedHttpResponseGenerator.java
@@ -27,7 +27,6 @@
 package org.apache.hc.client5.http.impl.cache;
 
 import java.time.Instant;
-import java.util.Date;
 
 import org.apache.hc.client5.http.async.methods.SimpleHttpResponse;
 import org.apache.hc.client5.http.cache.HeaderConstants;
@@ -65,7 +64,7 @@ class CachedHttpResponseGenerator {
      * @return {@link SimpleHttpResponse} constructed response
      */
     SimpleHttpResponse generateResponse(final HttpRequest request, final HttpCacheEntry entry) throws ResourceIOException {
-        final Date now = new Date();
+        final Instant now =Instant.now();
         final SimpleHttpResponse response = new SimpleHttpResponse(entry.getStatus());
         response.setVersion(HttpVersion.DEFAULT);
 
diff --git a/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/CachedResponseSuitabilityChecker.java b/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/CachedResponseSuitabilityChecker.java
index 7e1200a..2653f87 100644
--- a/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/CachedResponseSuitabilityChecker.java
+++ b/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/CachedResponseSuitabilityChecker.java
@@ -27,7 +27,6 @@
 package org.apache.hc.client5.http.impl.cache;
 
 import java.time.Instant;
-import java.util.Date;
 import java.util.Iterator;
 
 import org.apache.hc.client5.http.cache.HeaderConstants;
@@ -71,7 +70,7 @@ class CachedResponseSuitabilityChecker {
         this(new CacheValidityPolicy(), config);
     }
 
-    private boolean isFreshEnough(final HttpCacheEntry entry, final HttpRequest request, final Date now) {
+    private boolean isFreshEnough(final HttpCacheEntry entry, final HttpRequest request, final Instant now) {
         if (validityStrategy.isResponseFresh(entry, now)) {
             return true;
         }
@@ -142,7 +141,7 @@ class CachedResponseSuitabilityChecker {
      *            Right now in time
      * @return boolean yes/no answer
      */
-    public boolean canCachedResponseBeUsed(final HttpHost host, final HttpRequest request, final HttpCacheEntry entry, final Date now) {
+    public boolean canCachedResponseBeUsed(final HttpHost host, final HttpRequest request, final HttpCacheEntry entry, final Instant now) {
         if (!isFreshEnough(entry, request, now)) {
             LOG.debug("Cache entry is not fresh enough");
             return false;
@@ -274,13 +273,12 @@ class CachedResponseSuitabilityChecker {
      * @param now right NOW in time
      * @return {@code true} if the request matches all conditionals
      */
-    public boolean allConditionalsMatch(final HttpRequest request, final HttpCacheEntry entry, final Date now) {
+    public boolean allConditionalsMatch(final HttpRequest request, final HttpCacheEntry entry, final Instant now) {
         final boolean hasEtagValidator = hasSupportedEtagValidator(request);
         final boolean hasLastModifiedValidator = hasSupportedLastModifiedValidator(request);
 
         final boolean etagValidatorMatches = (hasEtagValidator) && etagValidatorMatches(request, entry);
-        final boolean lastModifiedValidatorMatches = (hasLastModifiedValidator) && lastModifiedValidatorMatches(request, entry,
-                DateUtils.toInstant(now));
+        final boolean lastModifiedValidatorMatches = (hasLastModifiedValidator) && lastModifiedValidatorMatches(request, entry, now);
 
         if ((hasEtagValidator && hasLastModifiedValidator)
             && !(etagValidatorMatches && lastModifiedValidatorMatches)) {
diff --git a/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/CachingExec.java b/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/CachingExec.java
index f72ebeb..dcfd705 100644
--- a/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/CachingExec.java
+++ b/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/CachingExec.java
@@ -28,7 +28,7 @@ package org.apache.hc.client5.http.impl.cache;
 
 import java.io.IOException;
 import java.io.InputStream;
-import java.util.Date;
+import java.time.Instant;
 import java.util.Iterator;
 import java.util.Map;
 import java.util.concurrent.ScheduledExecutorService;
@@ -231,7 +231,7 @@ class CachingExec extends CachingExecBase implements ExecChainHandler {
             final ExecChain.Scope scope,
             final ExecChain chain) throws IOException, HttpException  {
 
-        final Date requestDate = getCurrentDate();
+        final Instant requestDate = getCurrentDate();
 
         LOG.debug("Calling the backend");
         final ClassicHttpResponse backendResponse = chain.proceed(request, scope);
@@ -253,7 +253,7 @@ class CachingExec extends CachingExecBase implements ExecChainHandler {
         final HttpClientContext context  = scope.clientContext;
         context.setAttribute(HttpCoreContext.HTTP_REQUEST, request);
         recordCacheHit(target, request);
-        final Date now = getCurrentDate();
+        final Instant now = getCurrentDate();
         if (suitabilityChecker.canCachedResponseBeUsed(target, request, entry, now)) {
             LOG.debug("Cache hit");
             try {
@@ -306,13 +306,13 @@ class CachingExec extends CachingExecBase implements ExecChainHandler {
             final ExecChain.Scope scope,
             final ExecChain chain,
             final HttpCacheEntry cacheEntry) throws IOException, HttpException {
-        Date requestDate = getCurrentDate();
+        Instant requestDate = getCurrentDate();
         final ClassicHttpRequest conditionalRequest = conditionalRequestBuilder.buildConditionalRequest(
                 scope.originalRequest, cacheEntry);
 
         ClassicHttpResponse backendResponse = chain.proceed(conditionalRequest, scope);
         try {
-            Date responseDate = getCurrentDate();
+            Instant responseDate = getCurrentDate();
 
             if (revalidationResponseIsTooOld(backendResponse, cacheEntry)) {
                 backendResponse.close();
@@ -334,7 +334,7 @@ class CachingExec extends CachingExecBase implements ExecChainHandler {
                 final HttpCacheEntry updatedEntry = responseCache.updateCacheEntry(
                         target, request, cacheEntry, backendResponse, requestDate, responseDate);
                 if (suitabilityChecker.isConditional(request)
-                        && suitabilityChecker.allConditionalsMatch(request, updatedEntry, new Date())) {
+                        && suitabilityChecker.allConditionalsMatch(request, updatedEntry, Instant.now())) {
                     return convert(responseGenerator.generateNotModifiedResponse(updatedEntry), scope);
                 }
                 return convert(responseGenerator.generateResponse(request, updatedEntry), scope);
@@ -362,8 +362,8 @@ class CachingExec extends CachingExecBase implements ExecChainHandler {
             final HttpHost target,
             final ClassicHttpRequest request,
             final ExecChain.Scope scope,
-            final Date requestDate,
-            final Date responseDate,
+            final Instant requestDate,
+            final Instant responseDate,
             final ClassicHttpResponse backendResponse) throws IOException {
 
         responseCompliance.ensureProtocolCompliance(scope.originalRequest, request, backendResponse);
@@ -384,8 +384,8 @@ class CachingExec extends CachingExecBase implements ExecChainHandler {
             final HttpRequest request,
             final ClassicHttpResponse backendResponse,
             final ExecChain.Scope scope,
-            final Date requestSent,
-            final Date responseReceived) throws IOException {
+            final Instant requestSent,
+            final Instant responseReceived) throws IOException {
         LOG.debug("Caching backend response");
         final ByteArrayBuffer buf;
         final HttpEntity entity = backendResponse.getEntity();
@@ -453,10 +453,10 @@ class CachingExec extends CachingExecBase implements ExecChainHandler {
             final Map<String, Variant> variants) throws IOException, HttpException {
         final ClassicHttpRequest conditionalRequest = conditionalRequestBuilder.buildConditionalRequestFromVariants(request, variants);
 
-        final Date requestDate = getCurrentDate();
+        final Instant requestDate = getCurrentDate();
         final ClassicHttpResponse backendResponse = chain.proceed(conditionalRequest, scope);
         try {
-            final Date responseDate = getCurrentDate();
+            final Instant responseDate = getCurrentDate();
 
             backendResponse.addHeader("Via", generateViaHeader(backendResponse));
 
diff --git a/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/CachingExecBase.java b/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/CachingExecBase.java
index cec75bf..f9c5575 100644
--- a/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/CachingExecBase.java
+++ b/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/CachingExecBase.java
@@ -27,7 +27,7 @@
 package org.apache.hc.client5.http.impl.cache;
 
 import java.io.IOException;
-import java.util.Date;
+import java.time.Instant;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
@@ -183,7 +183,7 @@ public class CachingExecBase {
             final HttpRequest request,
             final HttpContext context,
             final HttpCacheEntry entry,
-            final Date now) throws ResourceIOException {
+            final Instant now) throws ResourceIOException {
         final SimpleHttpResponse cachedResponse;
         if (request.containsHeader(HeaderConstants.IF_NONE_MATCH)
                 || request.containsHeader(HeaderConstants.IF_MODIFIED_SINCE)) {
@@ -202,7 +202,7 @@ public class CachingExecBase {
             final HttpRequest request,
             final HttpContext context,
             final HttpCacheEntry entry,
-            final Date now) throws IOException {
+            final Instant now) throws IOException {
         if (staleResponseNotAllowed(request, entry, now)) {
             return generateGatewayTimeout(context);
         } else {
@@ -226,7 +226,7 @@ public class CachingExecBase {
         return cachedResponse;
     }
 
-    boolean staleResponseNotAllowed(final HttpRequest request, final HttpCacheEntry entry, final Date now) {
+    boolean staleResponseNotAllowed(final HttpRequest request, final HttpCacheEntry entry, final Instant now) {
         return validityPolicy.mustRevalidate(entry)
             || (cacheConfig.isSharedCache() && validityPolicy.proxyRevalidate(entry))
             || explicitFreshnessRequest(request, entry, now);
@@ -244,7 +244,7 @@ public class CachingExecBase {
         return true;
     }
 
-    boolean explicitFreshnessRequest(final HttpRequest request, final HttpCacheEntry entry, final Date now) {
+    boolean explicitFreshnessRequest(final HttpRequest request, final HttpCacheEntry entry, final Instant now) {
         final Iterator<HeaderElement> it = MessageSupport.iterate(request, HeaderConstants.CACHE_CONTROL);
         while (it.hasNext()) {
             final HeaderElement elt = it.next();
@@ -313,8 +313,8 @@ public class CachingExecBase {
         return SUPPORTS_RANGE_AND_CONTENT_RANGE_HEADERS;
     }
 
-    Date getCurrentDate() {
-        return new Date();
+    Instant getCurrentDate() {
+        return Instant.now();
     }
 
     boolean clientRequestsOurOptions(final HttpRequest request) {
@@ -340,7 +340,7 @@ public class CachingExecBase {
 
     boolean shouldSendNotModifiedResponse(final HttpRequest request, final HttpCacheEntry responseEntry) {
         return (suitabilityChecker.isConditional(request)
-                && suitabilityChecker.allConditionalsMatch(request, responseEntry, new Date()));
+                && suitabilityChecker.allConditionalsMatch(request, responseEntry, Instant.now()));
     }
 
     boolean staleIfErrorAppliesTo(final int statusCode) {
diff --git a/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/HttpAsyncCache.java b/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/HttpAsyncCache.java
index 6ba9262..2ad5767 100644
--- a/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/HttpAsyncCache.java
+++ b/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/HttpAsyncCache.java
@@ -26,7 +26,7 @@
  */
 package org.apache.hc.client5.http.impl.cache;
 
-import java.util.Date;
+import java.time.Instant;
 import java.util.Map;
 
 import org.apache.hc.client5.http.cache.HttpCacheEntry;
@@ -79,8 +79,8 @@ interface HttpAsyncCache {
             HttpRequest request,
             HttpResponse originResponse,
             ByteArrayBuffer content,
-            Date requestSent,
-            Date responseReceived,
+            Instant requestSent,
+            Instant responseReceived,
             FutureCallback<HttpCacheEntry> callback);
 
     /**
@@ -91,8 +91,8 @@ interface HttpAsyncCache {
             HttpRequest request,
             HttpCacheEntry stale,
             HttpResponse originResponse,
-            Date requestSent,
-            Date responseReceived,
+            Instant requestSent,
+            Instant responseReceived,
             FutureCallback<HttpCacheEntry> callback);
 
     /**
@@ -104,8 +104,8 @@ interface HttpAsyncCache {
             HttpRequest request,
             HttpResponse originResponse,
             Variant variant,
-            Date requestSent,
-            Date responseReceived,
+            Instant requestSent,
+            Instant responseReceived,
             FutureCallback<HttpCacheEntry> callback);
 
     /**
diff --git a/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/HttpByteArrayCacheEntrySerializer.java b/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/HttpByteArrayCacheEntrySerializer.java
index a2aa75d..ce82e73 100644
--- a/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/HttpByteArrayCacheEntrySerializer.java
+++ b/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/HttpByteArrayCacheEntrySerializer.java
@@ -32,7 +32,7 @@ import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
-import java.util.Date;
+import java.time.Instant;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -150,8 +150,8 @@ public class HttpByteArrayCacheEntrySerializer implements HttpCacheEntrySerializ
 
             // Extract metadata pseudo-headers
             final String storageKey = getCachePseudoHeaderAndRemove(response, SC_HEADER_NAME_STORAGE_KEY);
-            final Date requestDate = getCachePseudoHeaderDateAndRemove(response, SC_HEADER_NAME_REQUEST_DATE);
-            final Date responseDate = getCachePseudoHeaderDateAndRemove(response, SC_HEADER_NAME_RESPONSE_DATE);
+            final Instant requestDate = getCachePseudoHeaderDateAndRemove(response, SC_HEADER_NAME_REQUEST_DATE);
+            final Instant responseDate = getCachePseudoHeaderDateAndRemove(response, SC_HEADER_NAME_RESPONSE_DATE);
             final boolean noBody = getCachePseudoHeaderBooleanAndRemove(response, SC_HEADER_NAME_NO_CONTENT);
             final Map<String, String> variantMap = getVariantMapPseudoHeadersAndRemove(response);
             unescapeHeaders(response);
@@ -255,8 +255,8 @@ public class HttpByteArrayCacheEntrySerializer implements HttpCacheEntrySerializ
      */
     private void addMetadataPseudoHeaders(final HttpResponse httpResponse, final HttpCacheStorageEntry httpCacheEntry) {
         httpResponse.addHeader(SC_HEADER_NAME_STORAGE_KEY, httpCacheEntry.getKey());
-        httpResponse.addHeader(SC_HEADER_NAME_RESPONSE_DATE, Long.toString(httpCacheEntry.getContent().getResponseDate().getTime()));
-        httpResponse.addHeader(SC_HEADER_NAME_REQUEST_DATE, Long.toString(httpCacheEntry.getContent().getRequestDate().getTime()));
+        httpResponse.addHeader(SC_HEADER_NAME_RESPONSE_DATE, Long.toString(httpCacheEntry.getContent().getResponseInstant().toEpochMilli()));
+        httpResponse.addHeader(SC_HEADER_NAME_REQUEST_DATE, Long.toString(httpCacheEntry.getContent().getRequestInstant().toEpochMilli()));
 
         // Encode these so map entries are stored in a pair of headers, one for key and one for value.
         // Header keys look like: {Accept-Encoding=gzip}
@@ -308,12 +308,12 @@ public class HttpByteArrayCacheEntrySerializer implements HttpCacheEntrySerializ
      * @return Value for metadata pseudo-header
      * @throws ResourceIOException if the given pseudo-header is not found, or contains invalid data
      */
-    private static Date getCachePseudoHeaderDateAndRemove(final HttpResponse response, final String name) throws ResourceIOException{
+    private static Instant getCachePseudoHeaderDateAndRemove(final HttpResponse response, final String name) throws ResourceIOException{
         final String value = getCachePseudoHeaderAndRemove(response, name);
         response.removeHeaders(name);
         try {
             final long timestamp = Long.parseLong(value);
-            return new Date(timestamp);
+            return Instant.ofEpochMilli(timestamp);
         } catch (final NumberFormatException e) {
             throw new ResourceIOException("Invalid value for header '" + name + "'", e);
         }
@@ -410,7 +410,7 @@ public class HttpByteArrayCacheEntrySerializer implements HttpCacheEntrySerializ
      */
     private static class NoAgeCacheValidityPolicy extends CacheValidityPolicy {
         @Override
-        public TimeValue getCurrentAge(final HttpCacheEntry entry, final Date now) {
+        public TimeValue getCurrentAge(final HttpCacheEntry entry, final Instant now) {
             return TimeValue.ZERO_MILLISECONDS;
         }
     }
diff --git a/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/HttpCache.java b/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/HttpCache.java
index 66f4af9..a26005f 100644
--- a/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/HttpCache.java
+++ b/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/HttpCache.java
@@ -26,7 +26,7 @@
  */
 package org.apache.hc.client5.http.impl.cache;
 
-import java.util.Date;
+import java.time.Instant;
 import java.util.Map;
 
 import org.apache.hc.client5.http.cache.HttpCacheEntry;
@@ -73,8 +73,8 @@ interface HttpCache {
             HttpRequest request,
             HttpResponse originResponse,
             ByteArrayBuffer content,
-            Date requestSent,
-            Date responseReceived);
+            Instant requestSent,
+            Instant responseReceived);
 
     /**
      * Update a {@link HttpCacheEntry} using a 304 {@link HttpResponse}.
@@ -84,8 +84,8 @@ interface HttpCache {
             HttpRequest request,
             HttpCacheEntry stale,
             HttpResponse originResponse,
-            Date requestSent,
-            Date responseReceived);
+            Instant requestSent,
+            Instant responseReceived);
 
     /**
      * Update a specific {@link HttpCacheEntry} representing a cached variant
@@ -96,8 +96,8 @@ interface HttpCache {
             HttpRequest request,
             HttpResponse originResponse,
             Variant variant,
-            Date requestSent,
-            Date responseReceived);
+            Instant requestSent,
+            Instant responseReceived);
 
     /**
      * Specifies cache should reuse the given cached variant to satisfy
diff --git a/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/ResponseProtocolCompliance.java b/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/ResponseProtocolCompliance.java
index 31dec99..cd051af 100644
--- a/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/ResponseProtocolCompliance.java
+++ b/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/ResponseProtocolCompliance.java
@@ -29,7 +29,6 @@ package org.apache.hc.client5.http.impl.cache;
 import java.io.IOException;
 import java.time.Instant;
 import java.util.ArrayList;
-import java.util.Date;
 import java.util.List;
 
 import org.apache.hc.client5.http.ClientProtocolException;
@@ -101,8 +100,8 @@ class ResponseProtocolCompliance {
         boolean modified = false;
         for(final Header h : warningHeaders) {
             for(final WarningValue wv : WarningValue.getWarningValues(h)) {
-                final Date warnDate = wv.getWarnDate();
-                if (warnDate == null || warnDate.equals(responseDate)) {
+                final Instant warnInstant = wv.getWarnDate();
+                if (warnInstant == null || warnInstant.equals(responseDate)) {
                     newWarningHeaders.add(new BasicHeader(HeaderConstants.WARNING,wv.toString()));
                 } else {
                     modified = true;
diff --git a/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/WarningValue.java b/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/WarningValue.java
index ed76872..6969e6f 100644
--- a/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/WarningValue.java
+++ b/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/WarningValue.java
@@ -26,8 +26,8 @@
  */
 package org.apache.hc.client5.http.impl.cache;
 
+import java.time.Instant;
 import java.util.ArrayList;
-import java.util.Date;
 import java.util.List;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -48,7 +48,7 @@ class WarningValue {
     private int warnCode;
     private String warnAgent;
     private String warnText;
-    private Date warnDate;
+    private Instant warnDate;
 
     WarningValue(final String s) {
         this(s, 0);
@@ -265,7 +265,7 @@ class WarningValue {
             parseError();
         }
         offs += m.end();
-        warnDate = DateUtils.toDate(DateUtils.parseStandardDate(src.substring(curr+1,offs-1)));
+        warnDate = DateUtils.parseStandardDate(src.substring(curr+1,offs-1));
     }
 
     /*
@@ -342,9 +342,9 @@ class WarningValue {
     /** Returns the date and time when this warning was added, or
      * {@code null} if a warning date was not supplied in the
      * header.
-     * @return {@link Date}
+     * @return {@link Instant}
      */
-    public Date getWarnDate() { return warnDate; }
+    public Instant getWarnDate() { return warnDate; }
 
     /** Formats a {@code WarningValue} as a {@link String}
      * suitable for including in a header. For example, you can:
@@ -359,7 +359,7 @@ class WarningValue {
     public String toString() {
         if (warnDate != null) {
             return String.format("%d %s %s \"%s\"", warnCode,
-                    warnAgent, warnText, DateUtils.formatStandardDate(DateUtils.toInstant(warnDate)));
+                    warnAgent, warnText, DateUtils.formatStandardDate(warnDate));
         } else {
             return String.format("%d %s %s", warnCode, warnAgent, warnText);
         }
diff --git a/httpclient5-cache/src/test/java/org/apache/hc/client5/http/cache/TestHttpCacheEntry.java b/httpclient5-cache/src/test/java/org/apache/hc/client5/http/cache/TestHttpCacheEntry.java
index 437e296..ef94bfa 100644
--- a/httpclient5-cache/src/test/java/org/apache/hc/client5/http/cache/TestHttpCacheEntry.java
+++ b/httpclient5-cache/src/test/java/org/apache/hc/client5/http/cache/TestHttpCacheEntry.java
@@ -27,7 +27,6 @@
 package org.apache.hc.client5.http.cache;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertNotEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertNull;
@@ -66,7 +65,7 @@ public class TestHttpCacheEntry {
     }
 
     private HttpCacheEntry makeEntry(final Header[] headers) {
-        return new HttpCacheEntry(DateUtils.toDate(elevenSecondsAgo), DateUtils.toDate(nineSecondsAgo),
+        return new HttpCacheEntry(elevenSecondsAgo, nineSecondsAgo,
                 HttpStatus.SC_OK, headers, mockResource);
     }
 
@@ -111,13 +110,6 @@ public class TestHttpCacheEntry {
     }
 
     @Test
-    public void testCacheEntryWithNoVaryHeaderDoesNotHaveVariants() {
-        final Header[] headers = new Header[0];
-        entry = makeEntry(headers);
-        assertFalse(entry.hasVariants());
-    }
-
-    @Test
     public void testCacheEntryWithOneVaryHeaderHasVariants() {
         final Header[] headers = { new BasicHeader("Vary", "User-Agent") };
         entry = makeEntry(headers);
@@ -140,11 +132,24 @@ public class TestHttpCacheEntry {
         assertTrue(entry.hasVariants());
     }
 
+
+    @Test
+    public void testGetMethodReturnsCorrectRequestMethod() {
+        final Header[] headers = { new BasicHeader("foo", "fooValue"),
+                new BasicHeader("bar", "barValue1"),
+                new BasicHeader("bar", "barValue2")
+        };
+        entry = makeEntry(headers);
+        assertEquals(HeaderConstants.GET_METHOD, entry.getRequestMethod());
+    }
+
+
+
     @SuppressWarnings("unused")
     @Test
     public void mustProvideRequestDate() {
         try {
-            new HttpCacheEntry(null, new Date(), HttpStatus.SC_OK, new Header[]{}, mockResource);
+            new HttpCacheEntry(null, Instant.now(), HttpStatus.SC_OK, new Header[]{}, mockResource);
             fail("Should have thrown exception");
         } catch (final NullPointerException expected) {
         }
@@ -154,7 +159,7 @@ public class TestHttpCacheEntry {
     @Test
     public void mustProvideResponseDate() {
         try {
-            new HttpCacheEntry(new Date(), null, HttpStatus.SC_OK, new Header[]{}, mockResource);
+            new HttpCacheEntry(Instant.now(), null, HttpStatus.SC_OK, new Header[]{}, mockResource);
             fail("Should have thrown exception");
         } catch (final NullPointerException expected) {
         }
@@ -164,7 +169,7 @@ public class TestHttpCacheEntry {
     @Test
     public void mustProvideResponseHeaders() {
         try {
-            new HttpCacheEntry(new Date(), new Date(), HttpStatus.SC_OK, null, mockResource);
+            new HttpCacheEntry(Instant.now(), Instant.now(), HttpStatus.SC_OK, null, mockResource);
             fail("Should have thrown exception");
         } catch (final NullPointerException expected) {
         }
@@ -172,27 +177,27 @@ public class TestHttpCacheEntry {
 
     @Test
     public void statusCodeComesFromOriginalStatusLine() {
-        entry = new HttpCacheEntry(new Date(), new Date(), HttpStatus.SC_OK, new Header[]{}, mockResource);
+        entry = new HttpCacheEntry(Instant.now(), Instant.now(), HttpStatus.SC_OK, new Header[]{}, mockResource);
         assertEquals(HttpStatus.SC_OK, entry.getStatus());
     }
 
     @Test
     public void canGetOriginalRequestDate() {
-        final Date requestDate = new Date();
-        entry = new HttpCacheEntry(requestDate, new Date(), HttpStatus.SC_OK, new Header[]{}, mockResource);
-        assertSame(requestDate, entry.getRequestDate());
+        final Instant requestDate = Instant.now();
+        entry = new HttpCacheEntry(requestDate, Instant.now(), HttpStatus.SC_OK, new Header[]{}, mockResource);
+        assertEquals(requestDate, entry.getRequestInstant());
     }
 
     @Test
     public void canGetOriginalResponseDate() {
-        final Date responseDate = new Date();
-        entry = new HttpCacheEntry(new Date(), responseDate, HttpStatus.SC_OK, new Header[]{}, mockResource);
-        assertSame(responseDate, entry.getResponseDate());
+        final Instant responseDate = Instant.now();
+        entry = new HttpCacheEntry(Instant.now(), responseDate, HttpStatus.SC_OK, new Header[]{}, mockResource);
+        assertEquals(responseDate, entry.getResponseInstant());
     }
 
     @Test
     public void canGetOriginalResource() {
-        entry = new HttpCacheEntry(new Date(), new Date(), HttpStatus.SC_OK, new Header[]{}, mockResource);
+        entry = new HttpCacheEntry(Instant.now(), Instant.now(), HttpStatus.SC_OK, new Header[]{}, mockResource);
         assertSame(mockResource, entry.getResource());
     }
 
@@ -202,7 +207,7 @@ public class TestHttpCacheEntry {
                 new BasicHeader("Server", "MockServer/1.0"),
                 new BasicHeader("Date", DateUtils.formatStandardDate(now))
         };
-        entry = new HttpCacheEntry(new Date(), new Date(), HttpStatus.SC_OK, headers, mockResource);
+        entry = new HttpCacheEntry(Instant.now(), Instant.now(), HttpStatus.SC_OK, headers, mockResource);
         final Header[] result = entry.getHeaders();
         assertEquals(headers.length, result.length);
         for(int i=0; i<headers.length; i++) {
@@ -213,13 +218,13 @@ public class TestHttpCacheEntry {
     @SuppressWarnings("unused")
     @Test
     public void canConstructWithoutVariants() {
-        new HttpCacheEntry(new Date(), new Date(), HttpStatus.SC_OK, new Header[]{}, mockResource);
+        new HttpCacheEntry(Instant.now(), Instant.now(), HttpStatus.SC_OK, new Header[]{}, mockResource);
     }
 
     @SuppressWarnings("unused")
     @Test
     public void canProvideVariantMap() {
-        new HttpCacheEntry(new Date(), new Date(), HttpStatus.SC_OK,
+        new HttpCacheEntry(Instant.now(), Instant.now(), HttpStatus.SC_OK,
                 new Header[]{}, mockResource,
                 new HashMap<>());
     }
@@ -229,7 +234,7 @@ public class TestHttpCacheEntry {
         final Map<String,String> variantMap = new HashMap<>();
         variantMap.put("A","B");
         variantMap.put("C","D");
-        entry = new HttpCacheEntry(new Date(), new Date(), HttpStatus.SC_OK,
+        entry = new HttpCacheEntry(Instant.now(), Instant.now(), HttpStatus.SC_OK,
                 new Header[]{}, mockResource,
                 variantMap);
         final Map<String,String> result = entry.getVariantMap();
@@ -243,7 +248,7 @@ public class TestHttpCacheEntry {
         final Map<String,String> variantMap = new HashMap<>();
         variantMap.put("A","B");
         variantMap.put("C","D");
-        entry = new HttpCacheEntry(new Date(), new Date(), HttpStatus.SC_OK,
+        entry = new HttpCacheEntry(Instant.now(), Instant.now(), HttpStatus.SC_OK,
                 new Header[]{}, mockResource,
                 variantMap);
         final Map<String,String> result = entry.getVariantMap();
@@ -261,7 +266,7 @@ public class TestHttpCacheEntry {
 
     @Test
     public void canConvertToString() {
-        entry = new HttpCacheEntry(new Date(), new Date(), HttpStatus.SC_OK,
+        entry = new HttpCacheEntry(Instant.now(), Instant.now(), HttpStatus.SC_OK,
                 new Header[]{}, mockResource);
         assertNotNull(entry.toString());
         assertNotEquals("", entry.toString());
@@ -270,16 +275,16 @@ public class TestHttpCacheEntry {
     @Test
     public void testMissingDateHeaderIsIgnored() {
         final Header[] headers = new Header[] {};
-        entry = new HttpCacheEntry(new Date(), new Date(), HttpStatus.SC_OK,
-                                   headers, mockResource);
+        entry = new HttpCacheEntry(Instant.now(), Instant.now(), HttpStatus.SC_OK,
+                headers, mockResource);
         assertNull(entry.getDate());
     }
 
     @Test
     public void testMalformedDateHeaderIsIgnored() {
         final Header[] headers = new Header[] { new BasicHeader("Date", "asdf") };
-        entry = new HttpCacheEntry(new Date(), new Date(), HttpStatus.SC_OK,
-                                   headers, mockResource);
+        entry = new HttpCacheEntry(Instant.now(), Instant.now(), HttpStatus.SC_OK,
+                headers, mockResource);
         assertNull(entry.getDate());
     }
 
@@ -287,20 +292,11 @@ public class TestHttpCacheEntry {
     public void testValidDateHeaderIsParsed() {
         final Instant date = Instant.now().with(ChronoField.MILLI_OF_SECOND, 0);
         final Header[] headers = new Header[] { new BasicHeader("Date", DateUtils.formatStandardDate(date)) };
-        entry = new HttpCacheEntry(new Date(), new Date(), HttpStatus.SC_OK,
-                                   headers, mockResource);
+        entry = new HttpCacheEntry(Instant.now(), Instant.now(), HttpStatus.SC_OK,
+                headers, mockResource);
         final Date dateHeaderValue = entry.getDate();
         assertNotNull(dateHeaderValue);
         assertEquals(DateUtils.toDate(date), dateHeaderValue);
     }
 
-    @Test
-    public void testGetMethodReturnsCorrectRequestMethod() {
-        final Header[] headers = { new BasicHeader("foo", "fooValue"),
-                new BasicHeader("bar", "barValue1"),
-                new BasicHeader("bar", "barValue2")
-        };
-        entry = makeEntry(headers);
-        assertEquals(HeaderConstants.GET_METHOD, entry.getRequestMethod());
-    }
 }
diff --git a/httpclient5-cache/src/test/java/org/apache/hc/client5/http/impl/cache/HttpByteArrayCacheEntrySerializerTestUtils.java b/httpclient5-cache/src/test/java/org/apache/hc/client5/http/impl/cache/HttpByteArrayCacheEntrySerializerTestUtils.java
index 2a20259..950585f 100644
--- a/httpclient5-cache/src/test/java/org/apache/hc/client5/http/impl/cache/HttpByteArrayCacheEntrySerializerTestUtils.java
+++ b/httpclient5-cache/src/test/java/org/apache/hc/client5/http/impl/cache/HttpByteArrayCacheEntrySerializerTestUtils.java
@@ -34,8 +34,8 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.nio.charset.StandardCharsets;
+import java.time.Instant;
 import java.util.Collections;
-import java.util.Date;
 import java.util.Map;
 
 import org.apache.hc.client5.http.cache.HttpCacheEntry;
@@ -59,8 +59,8 @@ class HttpByteArrayCacheEntrySerializerTestUtils {
      */
     static class HttpCacheStorageEntryTestTemplate {
         Resource resource;
-        Date requestDate;
-        Date responseDate;
+        Instant requestDate;
+        Instant responseDate;
         int responseCode;
         Header[] responseHeaders;
         Map<String, String> variantMap;
@@ -120,8 +120,8 @@ class HttpByteArrayCacheEntrySerializerTestUtils {
     private static final HttpCacheStorageEntryTestTemplate DEFAULT_HTTP_CACHE_STORAGE_ENTRY_TEST_TEMPLATE = new HttpCacheStorageEntryTestTemplate();
     static {
         DEFAULT_HTTP_CACHE_STORAGE_ENTRY_TEST_TEMPLATE.resource = new HeapResource("Hello World".getBytes(StandardCharsets.UTF_8));
-        DEFAULT_HTTP_CACHE_STORAGE_ENTRY_TEST_TEMPLATE.requestDate = new Date(165214800000L);
-        DEFAULT_HTTP_CACHE_STORAGE_ENTRY_TEST_TEMPLATE.responseDate = new Date(2611108800000L);
+        DEFAULT_HTTP_CACHE_STORAGE_ENTRY_TEST_TEMPLATE.requestDate = Instant.ofEpochMilli(165214800000L);
+        DEFAULT_HTTP_CACHE_STORAGE_ENTRY_TEST_TEMPLATE.responseDate = Instant.ofEpochMilli(2611108800000L);
         DEFAULT_HTTP_CACHE_STORAGE_ENTRY_TEST_TEMPLATE.responseCode = 200;
         DEFAULT_HTTP_CACHE_STORAGE_ENTRY_TEST_TEMPLATE.responseHeaders = new Header[]{
                 new BasicHeader("Content-type", "text/html"),
@@ -220,8 +220,9 @@ class HttpByteArrayCacheEntrySerializerTestUtils {
         final HttpCacheEntry expectedContent = expected.getContent();
         final HttpCacheEntry actualContent = actual.getContent();
 
-        assertEquals(expectedContent.getRequestDate(), actualContent.getRequestDate());
-        assertEquals(expectedContent.getResponseDate(), actualContent.getResponseDate());
+        assertEquals(expectedContent.getRequestInstant(), actualContent.getRequestInstant());
+        assertEquals(expectedContent.getResponseInstant(), actualContent.getResponseInstant());
+
         assertEquals(expectedContent.getStatus(), actualContent.getStatus());
 
         assertArrayEquals(expectedContent.getVariantMap().keySet().toArray(), actualContent.getVariantMap().keySet().toArray());
diff --git a/httpclient5-cache/src/test/java/org/apache/hc/client5/http/impl/cache/HttpCacheEntryMatcher.java b/httpclient5-cache/src/test/java/org/apache/hc/client5/http/impl/cache/HttpCacheEntryMatcher.java
index 157abe5..ec4b742 100644
--- a/httpclient5-cache/src/test/java/org/apache/hc/client5/http/impl/cache/HttpCacheEntryMatcher.java
+++ b/httpclient5-cache/src/test/java/org/apache/hc/client5/http/impl/cache/HttpCacheEntryMatcher.java
@@ -26,8 +26,8 @@
  */
 package org.apache.hc.client5.http.impl.cache;
 
+import java.time.Instant;
 import java.util.Arrays;
-import java.util.Date;
 
 import org.apache.hc.client5.http.cache.HttpCacheEntry;
 import org.apache.hc.client5.http.cache.Resource;
@@ -57,16 +57,17 @@ public class HttpCacheEntryMatcher extends BaseMatcher<HttpCacheEntry> {
                 if (expectedStatus != otherStatus) {
                     return false;
                 }
-                final Date expectedRequestDate = expectedValue.getRequestDate();
-                final Date otherRequestDate = otherValue.getRequestDate();
-                if (!LangUtils.equals(expectedRequestDate, otherRequestDate)) {
+                final Instant expectedRequestInstant = expectedValue.getRequestInstant();
+                final Instant otherRequestInstant = otherValue.getRequestInstant();
+                if (!LangUtils.equals(expectedRequestInstant, otherRequestInstant)) {
                     return false;
                 }
-                final Date expectedResponseDate = expectedValue.getResponseDate();
-                final Date otherResponseDate = otherValue.getResponseDate();
-                if (!LangUtils.equals(expectedResponseDate, otherResponseDate)) {
+                final Instant expectedResponseInstant = expectedValue.getResponseInstant();
+                final Instant otherResponseInstant = otherValue.getResponseInstant();
+                if (!LangUtils.equals(expectedResponseInstant, otherResponseInstant)) {
                     return false;
                 }
+
                 final Header[] expectedHeaders = expectedValue.getHeaders();
                 final Header[] otherHeaders = otherValue.getHeaders();
                 if (expectedHeaders.length != otherHeaders.length) {
diff --git a/httpclient5-cache/src/test/java/org/apache/hc/client5/http/impl/cache/HttpTestUtils.java b/httpclient5-cache/src/test/java/org/apache/hc/client5/http/impl/cache/HttpTestUtils.java
index 65e5849..d0703e4 100644
--- a/httpclient5-cache/src/test/java/org/apache/hc/client5/http/impl/cache/HttpTestUtils.java
+++ b/httpclient5-cache/src/test/java/org/apache/hc/client5/http/impl/cache/HttpTestUtils.java
@@ -29,7 +29,6 @@ package org.apache.hc.client5.http.impl.cache;
 import java.io.InputStream;
 import java.time.Duration;
 import java.time.Instant;
-import java.util.Date;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
@@ -268,7 +267,7 @@ public class HttpTestUtils {
         return makeCacheEntry(now, now, getStockHeaders(now),
                 getRandomBytes(128), variantMap);
     }
-
+    @SuppressWarnings("deprecation")
     public static HttpCacheEntry makeCacheEntry(final Instant requestDate,
             final Instant responseDate, final Header[] headers, final byte[] bytes,
             final Map<String,String> variantMap) {
@@ -295,31 +294,6 @@ public class HttpTestUtils {
         return makeCacheEntry(now, now);
     }
 
-    public static HttpCacheEntry makeCacheEntryWithNoRequestMethodOrEntity(final Header... headers) {
-        final Date now = new Date();
-        return new HttpCacheEntry(now, now, HttpStatus.SC_OK, headers, null, null);
-    }
-
-    public static HttpCacheEntry makeCacheEntryWithNoRequestMethod(final Header... headers) {
-        final Date now = new Date();
-        return new HttpCacheEntry(now, now, HttpStatus.SC_OK, headers, new HeapResource(getRandomBytes(128)), null);
-    }
-
-    public static HttpCacheEntry make204CacheEntryWithNoRequestMethod(final Header... headers) {
-        final Date now = new Date();
-        return new HttpCacheEntry(now, now, HttpStatus.SC_NO_CONTENT, headers, null, null);
-    }
-
-    public static HttpCacheEntry makeHeadCacheEntry(final Header... headers) {
-        final Date now = new Date();
-        return new HttpCacheEntry(now, now, HttpStatus.SC_OK, headers, null, null);
-    }
-
-    public static HttpCacheEntry makeHeadCacheEntryWithNoRequestMethod(final Header... headers) {
-        final Date now = new Date();
-        return new HttpCacheEntry(now, now, HttpStatus.SC_OK, headers, null, null);
-    }
-
     public static ClassicHttpResponse make200Response() {
         final ClassicHttpResponse out = new BasicClassicHttpResponse(HttpStatus.SC_OK, "OK");
         out.setHeader("Date", DateUtils.formatStandardDate(Instant.now()));
@@ -373,4 +347,30 @@ public class HttpTestUtils {
 
         return variants;
     }
+
+
+    public static HttpCacheEntry makeCacheEntryWithNoRequestMethodOrEntity(final Header... headers) {
+        final Instant now = Instant.now();
+        return new HttpCacheEntry(now, now, HttpStatus.SC_OK, headers, null, null);
+    }
+
+    public static HttpCacheEntry makeCacheEntryWithNoRequestMethod(final Header... headers) {
+        final Instant now = Instant.now();
+        return new HttpCacheEntry(now, now, HttpStatus.SC_OK, headers, new HeapResource(getRandomBytes(128)), null);
+    }
+
+    public static HttpCacheEntry make204CacheEntryWithNoRequestMethod(final Header... headers) {
+        final Instant now = Instant.now();
+        return new HttpCacheEntry(now, now, HttpStatus.SC_NO_CONTENT, headers, null, null);
+    }
+
+    public static HttpCacheEntry makeHeadCacheEntry(final Header... headers) {
+        final Instant now = Instant.now();
+        return new HttpCacheEntry(now, now, HttpStatus.SC_OK, headers, null, null);
+    }
+
+    public static HttpCacheEntry makeHeadCacheEntryWithNoRequestMethod(final Header... headers) {
+        final Instant now = Instant.now();
+        return new HttpCacheEntry(now, now, HttpStatus.SC_OK, headers, null, null);
+    }
 }
diff --git a/httpclient5-cache/src/test/java/org/apache/hc/client5/http/impl/cache/TestBasicHttpCache.java b/httpclient5-cache/src/test/java/org/apache/hc/client5/http/impl/cache/TestBasicHttpCache.java
index 5023324..0322b08 100644
--- a/httpclient5-cache/src/test/java/org/apache/hc/client5/http/impl/cache/TestBasicHttpCache.java
+++ b/httpclient5-cache/src/test/java/org/apache/hc/client5/http/impl/cache/TestBasicHttpCache.java
@@ -34,7 +34,6 @@ import static org.junit.jupiter.api.Assertions.assertNull;
 import static org.junit.jupiter.api.Assertions.assertSame;
 
 import java.time.Instant;
-import java.util.Date;
 import java.util.Map;
 
 import org.apache.hc.client5.http.cache.HeaderConstants;
@@ -231,7 +230,7 @@ public class TestBasicHttpCache {
         origResponse.setHeader("Vary", "Accept-Encoding");
         origResponse.setHeader("Content-Encoding","gzip");
 
-        impl.createCacheEntry(host, origRequest, origResponse, buf, new Date(), new Date());
+        impl.createCacheEntry(host, origRequest, origResponse, buf, Instant.now(), Instant.now());
 
         final HttpRequest request = new HttpGet("http://foo.example.com/bar");
         final HttpCacheEntry result = impl.getCacheEntry(host, request);
@@ -253,7 +252,7 @@ public class TestBasicHttpCache {
         origResponse.setHeader("Vary", "Accept-Encoding");
         origResponse.setHeader("Content-Encoding","gzip");
 
-        impl.createCacheEntry(host, origRequest, origResponse, buf, new Date(), new Date());
+        impl.createCacheEntry(host, origRequest, origResponse, buf, Instant.now(), Instant.now());
 
         final HttpRequest request = new HttpGet("http://foo.example.com/bar");
         request.setHeader("Accept-Encoding","gzip");
@@ -297,8 +296,8 @@ public class TestBasicHttpCache {
         resp2.setHeader("Content-Encoding","gzip");
         resp2.setHeader("Vary", "Accept-Encoding");
 
-        impl.createCacheEntry(host, req1, resp1, null, new Date(), new Date());
-        impl.createCacheEntry(host, req2, resp2, null, new Date(), new Date());
+        impl.createCacheEntry(host, req1, resp1, null, Instant.now(), Instant.now());
+        impl.createCacheEntry(host, req2, resp2, null, Instant.now(), Instant.now());
 
         final Map<String,Variant> variants = impl.getVariantCacheEntriesWithEtags(host, req1);
 
diff --git a/httpclient5-cache/src/test/java/org/apache/hc/client5/http/impl/cache/TestByteArrayCacheEntrySerializer.java b/httpclient5-cache/src/test/java/org/apache/hc/client5/http/impl/cache/TestByteArrayCacheEntrySerializer.java
index e2a3a25..81cb9b3 100644
--- a/httpclient5-cache/src/test/java/org/apache/hc/client5/http/impl/cache/TestByteArrayCacheEntrySerializer.java
+++ b/httpclient5-cache/src/test/java/org/apache/hc/client5/http/impl/cache/TestByteArrayCacheEntrySerializer.java
@@ -37,6 +37,7 @@ import java.io.IOException;
 import java.io.ObjectOutputStream;
 import java.math.BigDecimal;
 import java.nio.charset.StandardCharsets;
+import java.time.Instant;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.Map;
@@ -61,7 +62,12 @@ public class TestByteArrayCacheEntrySerializer {
     }
 
     @Test
-    public void canSerializeEntriesWithVariantMaps() throws Exception {
+    public void canSerializeEntriesWithVariantMapsDeprecatedConstructor() throws Exception {
+        readWriteVerify(makeCacheEntryDeprecatedConstructorWithVariantMap("somekey"));
+    }
+
+    @Test
+    public void canSerializeEntriesWithVariantMapsAndInstant() throws Exception {
         readWriteVerify(makeCacheEntryWithVariantMap("somekey"));
     }
 
@@ -86,6 +92,11 @@ public class TestByteArrayCacheEntrySerializer {
     }
 
     @Test
+    public void isAllowedClassNameInstantTrue() {
+        assertIsAllowedClassNameTrue(Instant.class.getName());
+    }
+
+    @Test
     public void isAllowedClassNameStatusLineTrue() {
         assertIsAllowedClassNameTrue(StatusLine.class.getName());
     }
@@ -257,6 +268,27 @@ public class TestByteArrayCacheEntrySerializer {
         assertThat(readEntry.getContent(), HttpCacheEntryMatcher.equivalent(writeEntry.getContent()));
     }
 
+
+    private HttpCacheStorageEntry makeCacheEntryDeprecatedConstructorWithVariantMap(final String key) {
+        final Header[] headers = new Header[5];
+        for (int i = 0; i < headers.length; i++) {
+            headers[i] = new BasicHeader("header" + i, "value" + i);
+        }
+        final String body = "Lorem ipsum dolor sit amet";
+
+        final Map<String,String> variantMap = new HashMap<>();
+        variantMap.put("test variant 1","true");
+        variantMap.put("test variant 2","true");
+        final HttpCacheEntry cacheEntry = new HttpCacheEntry(
+                Instant.now(),
+                Instant.now(),
+                HttpStatus.SC_OK,
+                headers,
+                new HeapResource(body.getBytes(StandardCharsets.UTF_8)), variantMap);
+
+        return new HttpCacheStorageEntry(key, cacheEntry);
+    }
+
     private HttpCacheStorageEntry makeCacheEntryWithVariantMap(final String key) {
         final Header[] headers = new Header[5];
         for (int i = 0; i < headers.length; i++) {
@@ -268,8 +300,8 @@ public class TestByteArrayCacheEntrySerializer {
         variantMap.put("test variant 1","true");
         variantMap.put("test variant 2","true");
         final HttpCacheEntry cacheEntry = new HttpCacheEntry(
-                new Date(),
-                new Date(),
+                Instant.now(),
+                Instant.now(),
                 HttpStatus.SC_OK,
                 headers,
                 new HeapResource(body.getBytes(StandardCharsets.UTF_8)), variantMap);
diff --git a/httpclient5-cache/src/test/java/org/apache/hc/client5/http/impl/cache/TestCacheUpdateHandler.java b/httpclient5-cache/src/test/java/org/apache/hc/client5/http/impl/cache/TestCacheUpdateHandler.java
index 2470288..cb72d9e 100644
--- a/httpclient5-cache/src/test/java/org/apache/hc/client5/http/impl/cache/TestCacheUpdateHandler.java
+++ b/httpclient5-cache/src/test/java/org/apache/hc/client5/http/impl/cache/TestCacheUpdateHandler.java
@@ -34,7 +34,6 @@ import static org.junit.jupiter.api.Assertions.fail;
 
 import java.io.IOException;
 import java.time.Instant;
-import java.util.Date;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -83,7 +82,7 @@ public class TestCacheUpdateHandler {
             throws IOException {
         entry = HttpTestUtils.makeCacheEntry();
         final HttpCacheEntry newEntry = impl.updateCacheEntry(null, entry,
-                DateUtils.toDate(requestDate), DateUtils.toDate(responseDate), response);
+                requestDate, responseDate, response);
         assertNotSame(newEntry, entry);
     }
 
@@ -96,7 +95,7 @@ public class TestCacheUpdateHandler {
         response.setHeaders();
 
         final HttpCacheEntry updatedEntry = impl.updateCacheEntry(null, entry,
-                new Date(), new Date(), response);
+                Instant.now(), Instant.now(), response);
 
          assertThat(updatedEntry, ContainsHeaderMatcher.contains("Date", DateUtils.formatStandardDate(responseDate)));
          assertThat(updatedEntry, ContainsHeaderMatcher.contains("ETag", "\"etag\""));
@@ -116,7 +115,7 @@ public class TestCacheUpdateHandler {
                 new BasicHeader("Cache-Control", "public"));
 
         final HttpCacheEntry updatedEntry = impl.updateCacheEntry(null, entry,
-                new Date(), new Date(), response);
+                Instant.now(), Instant.now(), response);
 
          assertThat(updatedEntry, ContainsHeaderMatcher.contains("Date", DateUtils.formatStandardDate(requestDate)));
          assertThat(updatedEntry, ContainsHeaderMatcher.contains("ETag", "\"etag\""));
@@ -136,7 +135,7 @@ public class TestCacheUpdateHandler {
                 new BasicHeader("Cache-Control", "public"));
 
         final HttpCacheEntry updatedEntry = impl.updateCacheEntry(null, entry,
-                new Date(), new Date(), response);
+                Instant.now(), Instant.now(), response);
 
          assertThat(updatedEntry, ContainsHeaderMatcher.contains("Date", DateUtils.formatStandardDate(requestDate)));
          assertThat(updatedEntry, ContainsHeaderMatcher.contains("ETag", "\"etag\""));
@@ -154,8 +153,8 @@ public class TestCacheUpdateHandler {
         entry = HttpTestUtils.makeCacheEntry(twoSecondsAgo, now, headers);
         response.setHeader("Date", DateUtils.formatStandardDate(tenSecondsAgo));
         response.setHeader("ETag", "\"old-etag\"");
-        final HttpCacheEntry result = impl.updateCacheEntry("A", entry, new Date(),
-                new Date(), response);
+        final HttpCacheEntry result = impl.updateCacheEntry("A", entry, Instant.now(),
+                Instant.now(), response);
          assertThat(result, ContainsHeaderMatcher.contains("Date", DateUtils.formatStandardDate(oneSecondAgo)));
          assertThat(result, ContainsHeaderMatcher.contains("ETag", "\"new-etag\""));
     }
@@ -165,10 +164,10 @@ public class TestCacheUpdateHandler {
             throws IOException {
         entry = HttpTestUtils.makeCacheEntry(tenSecondsAgo, eightSecondsAgo);
         final HttpCacheEntry updated = impl.updateCacheEntry(null, entry,
-                DateUtils.toDate(twoSecondsAgo), DateUtils.toDate(oneSecondAgo), response);
+                twoSecondsAgo, oneSecondAgo, response);
 
-        assertEquals(DateUtils.toDate(twoSecondsAgo), updated.getRequestDate());
-        assertEquals(DateUtils.toDate(oneSecondAgo), updated.getResponseDate());
+        assertEquals(twoSecondsAgo, updated.getRequestInstant());
+        assertEquals(oneSecondAgo, updated.getResponseInstant());
     }
 
     @Test
@@ -182,7 +181,7 @@ public class TestCacheUpdateHandler {
         response.setHeader("ETag", "\"new\"");
         response.setHeader("Date", DateUtils.formatStandardDate(twoSecondsAgo));
         final HttpCacheEntry updated = impl.updateCacheEntry(null, entry,
-                DateUtils.toDate(twoSecondsAgo), DateUtils.toDate(oneSecondAgo), response);
+                twoSecondsAgo, oneSecondAgo, response);
 
         assertEquals(0, updated.getHeaders("Warning").length);
     }
@@ -197,7 +196,7 @@ public class TestCacheUpdateHandler {
         response.setHeader("ETag", "\"new\"");
         response.setHeader("Date", DateUtils.formatStandardDate(twoSecondsAgo));
         final HttpCacheEntry updated = impl.updateCacheEntry(null, entry,
-                DateUtils.toDate(twoSecondsAgo), DateUtils.toDate(oneSecondAgo), response);
+                twoSecondsAgo, oneSecondAgo, response);
 
         assertEquals("\"new\"", updated.getFirstHeader("ETag").getValue());
     }
@@ -211,8 +210,8 @@ public class TestCacheUpdateHandler {
         entry = HttpTestUtils.makeCacheEntry(tenSecondsAgo, eightSecondsAgo, headers);
         response.setHeader("ETag", "\"new\"");
         response.setHeader("Date", "bad-date");
-        final HttpCacheEntry updated = impl.updateCacheEntry(null, entry,
-                DateUtils.toDate(twoSecondsAgo), DateUtils.toDate(oneSecondAgo), response);
+        final HttpCacheEntry updated = impl.updateCacheEntry(null, entry, twoSecondsAgo,
+                oneSecondAgo, response);
 
         assertEquals("\"new\"", updated.getFirstHeader("ETag").getValue());
     }
@@ -222,7 +221,7 @@ public class TestCacheUpdateHandler {
         entry = HttpTestUtils.makeCacheEntry();
         response = new BasicHttpResponse(HttpStatus.SC_OK, "OK");
         try {
-            impl.updateCacheEntry("A", entry, new Date(), new Date(),
+            impl.updateCacheEntry("A", entry, Instant.now(), Instant.now(),
                     response);
             fail("should have thrown exception");
         } catch (final IllegalArgumentException expected) {
@@ -261,7 +260,7 @@ public class TestCacheUpdateHandler {
                 new BasicHeader("Content-Encoding", "gzip"));
 
         final HttpCacheEntry updatedEntry = impl.updateCacheEntry(null, entry,
-                new Date(), new Date(), response);
+                Instant.now(), Instant.now(), response);
 
         final Header[] updatedHeaders = updatedEntry.getHeaders();
         headersContain(updatedHeaders, "Content-Encoding", "identity");
@@ -281,7 +280,7 @@ public class TestCacheUpdateHandler {
                 new BasicHeader("Content-Length", "0"));
 
         final HttpCacheEntry updatedEntry = impl.updateCacheEntry(null, entry,
-                new Date(), new Date(), response);
+                Instant.now(), Instant.now(), response);
 
         final Header[] updatedHeaders = updatedEntry.getHeaders();
         headersContain(updatedHeaders, "Transfer-Encoding", "chunked");
diff --git a/httpclient5-cache/src/test/java/org/apache/hc/client5/http/impl/cache/TestCacheValidityPolicy.java b/httpclient5-cache/src/test/java/org/apache/hc/client5/http/impl/cache/TestCacheValidityPolicy.java
index 6372222..60dc0f7 100644
--- a/httpclient5-cache/src/test/java/org/apache/hc/client5/http/impl/cache/TestCacheValidityPolicy.java
+++ b/httpclient5-cache/src/test/java/org/apache/hc/client5/http/impl/cache/TestCacheValidityPolicy.java
@@ -33,7 +33,6 @@ import static org.junit.jupiter.api.Assertions.assertSame;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import java.time.Instant;
-import java.util.Date;
 
 import org.apache.hc.client5.http.cache.HttpCacheEntry;
 import org.apache.hc.client5.http.utils.DateUtils;
@@ -141,7 +140,7 @@ public class TestCacheValidityPolicy {
     @Test
     public void testResidentTimeSecondsIsTimeSinceResponseTime() {
         final HttpCacheEntry entry = HttpTestUtils.makeCacheEntry(now, sixSecondsAgo);
-        assertEquals(TimeValue.ofSeconds(6), impl.getResidentTime(entry, DateUtils.toDate(now)));
+        assertEquals(TimeValue.ofSeconds(6), impl.getResidentTime(entry, now));
     }
 
     @Test
@@ -153,11 +152,11 @@ public class TestCacheValidityPolicy {
                 return TimeValue.ofSeconds(11);
             }
             @Override
-            protected TimeValue getResidentTime(final HttpCacheEntry ent, final Date d) {
+            protected TimeValue getResidentTime(final HttpCacheEntry ent, final Instant d) {
                 return TimeValue.ofSeconds(17);
             }
         };
-        assertEquals(TimeValue.ofSeconds(28), impl.getCurrentAge(entry, new Date()));
+        assertEquals(TimeValue.ofSeconds(28), impl.getCurrentAge(entry, Instant.now()));
     }
 
     @Test
@@ -250,9 +249,9 @@ public class TestCacheValidityPolicy {
         final HttpCacheEntry entry = HttpTestUtils.makeCacheEntry();
         impl = new CacheValidityPolicy() {
             @Override
-            public TimeValue getCurrentAge(final HttpCacheEntry e, final Date d) {
+            public TimeValue getCurrentAge(final HttpCacheEntry e, final Instant d) {
                 assertSame(entry, e);
-                assertEquals(DateUtils.toDate(now), d);
+                assertEquals(now, d);
                 return TimeValue.ofSeconds(6);
             }
             @Override
@@ -261,7 +260,7 @@ public class TestCacheValidityPolicy {
                 return TimeValue.ofSeconds(10);
             }
         };
-        assertTrue(impl.isResponseFresh(entry, DateUtils.toDate(now)));
+        assertTrue(impl.isResponseFresh(entry, now));
     }
 
     @Test
@@ -269,8 +268,8 @@ public class TestCacheValidityPolicy {
         final HttpCacheEntry entry = HttpTestUtils.makeCacheEntry();
         impl = new CacheValidityPolicy() {
             @Override
-            public TimeValue getCurrentAge(final HttpCacheEntry e, final Date d) {
-                assertEquals(DateUtils.toDate(now), d);
+            public TimeValue getCurrentAge(final HttpCacheEntry e, final Instant d) {
+                assertEquals(now, d);
                 assertSame(entry, e);
                 return TimeValue.ofSeconds(6);
             }
@@ -280,7 +279,7 @@ public class TestCacheValidityPolicy {
                 return TimeValue.ofSeconds(6);
             }
         };
-        assertFalse(impl.isResponseFresh(entry, DateUtils.toDate(now)));
+        assertFalse(impl.isResponseFresh(entry, now));
     }
 
     @Test
@@ -288,8 +287,8 @@ public class TestCacheValidityPolicy {
         final HttpCacheEntry entry = HttpTestUtils.makeCacheEntry();
         impl = new CacheValidityPolicy() {
             @Override
-            public TimeValue getCurrentAge(final HttpCacheEntry e, final Date d) {
-                assertEquals(DateUtils.toDate(now), d);
+            public TimeValue getCurrentAge(final HttpCacheEntry e, final Instant d) {
+                assertEquals(now, d);
                 assertSame(entry, e);
                 return TimeValue.ofSeconds(10);
             }
@@ -299,7 +298,7 @@ public class TestCacheValidityPolicy {
                 return TimeValue.ofSeconds(6);
             }
         };
-        assertFalse(impl.isResponseFresh(entry, DateUtils.toDate(now)));
+        assertFalse(impl.isResponseFresh(entry, now));
     }
 
     @Test
@@ -421,7 +420,7 @@ public class TestCacheValidityPolicy {
         };
         final HttpCacheEntry entry = HttpTestUtils.makeCacheEntry(now, now, headers);
         final HttpRequest req = new BasicHttpRequest("GET","/");
-        assertTrue(impl.mayReturnStaleIfError(req, entry, DateUtils.toDate(now)));
+        assertTrue(impl.mayReturnStaleIfError(req, entry, now));
     }
 
     @Test
@@ -433,7 +432,7 @@ public class TestCacheValidityPolicy {
         final HttpCacheEntry entry = HttpTestUtils.makeCacheEntry(now, now, headers);
         final HttpRequest req = new BasicHttpRequest("GET","/");
         req.setHeader("Cache-Control","stale-if-error=15");
-        assertTrue(impl.mayReturnStaleIfError(req, entry, DateUtils.toDate(now)));
+        assertTrue(impl.mayReturnStaleIfError(req, entry, now));
     }
 
     @Test
@@ -444,7 +443,7 @@ public class TestCacheValidityPolicy {
         };
         final HttpCacheEntry entry = HttpTestUtils.makeCacheEntry(now, now, headers);
         final HttpRequest req = new BasicHttpRequest("GET","/");
-        assertFalse(impl.mayReturnStaleIfError(req, entry, DateUtils.toDate(now)));
+        assertFalse(impl.mayReturnStaleIfError(req, entry, now));
     }
 
     @Test
@@ -456,7 +455,7 @@ public class TestCacheValidityPolicy {
         final HttpCacheEntry entry = HttpTestUtils.makeCacheEntry(now, now, headers);
         final HttpRequest req = new BasicHttpRequest("GET","/");
         req.setHeader("Cache-Control","stale-if-error=1");
-        assertFalse(impl.mayReturnStaleIfError(req, entry, DateUtils.toDate(now)));
+        assertFalse(impl.mayReturnStaleIfError(req, entry, now));
     }
 
     @Test
@@ -464,7 +463,7 @@ public class TestCacheValidityPolicy {
         final Header[] headers = new Header[] { new BasicHeader("Cache-control", "public") };
         final HttpCacheEntry entry = HttpTestUtils.makeCacheEntry(headers);
 
-        assertFalse(impl.mayReturnStaleWhileRevalidating(entry, DateUtils.toDate(now)));
+        assertFalse(impl.mayReturnStaleWhileRevalidating(entry, now));
     }
 
     @Test
@@ -475,7 +474,7 @@ public class TestCacheValidityPolicy {
         };
         final HttpCacheEntry entry = HttpTestUtils.makeCacheEntry(now, now, headers);
 
-        assertTrue(impl.mayReturnStaleWhileRevalidating(entry, DateUtils.toDate(now)));
+        assertTrue(impl.mayReturnStaleWhileRevalidating(entry, now));
     }
 
     @Test
@@ -487,7 +486,7 @@ public class TestCacheValidityPolicy {
         };
         final HttpCacheEntry entry = HttpTestUtils.makeCacheEntry(now, now, headers);
 
-        assertFalse(impl.mayReturnStaleWhileRevalidating(entry, DateUtils.toDate(now)));
+        assertFalse(impl.mayReturnStaleWhileRevalidating(entry, now));
     }
 
     @Test
@@ -498,6 +497,6 @@ public class TestCacheValidityPolicy {
         };
         final HttpCacheEntry entry = HttpTestUtils.makeCacheEntry(now, now, headers);
 
-        assertFalse(impl.mayReturnStaleWhileRevalidating(entry, DateUtils.toDate(now)));
+        assertFalse(impl.mayReturnStaleWhileRevalidating(entry, now));
     }
 }
diff --git a/httpclient5-cache/src/test/java/org/apache/hc/client5/http/impl/cache/TestCachedHttpResponseGenerator.java b/httpclient5-cache/src/test/java/org/apache/hc/client5/http/impl/cache/TestCachedHttpResponseGenerator.java
index fec7719..7f4396f 100644
--- a/httpclient5-cache/src/test/java/org/apache/hc/client5/http/impl/cache/TestCachedHttpResponseGenerator.java
+++ b/httpclient5-cache/src/test/java/org/apache/hc/client5/http/impl/cache/TestCachedHttpResponseGenerator.java
@@ -32,7 +32,7 @@ import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
-import java.util.Date;
+import java.time.Instant;
 import java.util.HashMap;
 
 import org.apache.hc.client5.http.async.methods.SimpleHttpResponse;
@@ -112,7 +112,7 @@ public class TestCachedHttpResponseGenerator {
 
         final SimpleHttpResponse response = impl.generateResponse(request, entry);
 
-        verify(mockValidityPolicy).getCurrentAge(same(entry), isA(Date.class));
+        verify(mockValidityPolicy).getCurrentAge(same(entry), isA(Instant.class));
 
         final Header ageHdr = response.getFirstHeader("Age");
         Assertions.assertNotNull(ageHdr);
@@ -125,7 +125,7 @@ public class TestCachedHttpResponseGenerator {
 
         final SimpleHttpResponse response = impl.generateResponse(request, entry);
 
-        verify(mockValidityPolicy).getCurrentAge(same(entry), isA(Date.class));
+        verify(mockValidityPolicy).getCurrentAge(same(entry), isA(Instant.class));
 
         final Header ageHdr = response.getFirstHeader("Age");
         Assertions.assertNull(ageHdr);
@@ -137,7 +137,7 @@ public class TestCachedHttpResponseGenerator {
 
         final SimpleHttpResponse response = impl.generateResponse(request, entry);
 
-        verify(mockValidityPolicy).getCurrentAge(same(entry), isA(Date.class));
+        verify(mockValidityPolicy).getCurrentAge(same(entry), isA(Instant.class));
 
         final Header ageHdr = response.getFirstHeader("Age");
         Assertions.assertNotNull(ageHdr);
@@ -147,7 +147,7 @@ public class TestCachedHttpResponseGenerator {
     private void currentAge(final TimeValue age) {
         when(
                 mockValidityPolicy.getCurrentAge(same(entry),
-                        isA(Date.class))).thenReturn(age);
+                        isA(Instant.class))).thenReturn(age);
     }
 
     @Test
diff --git a/httpclient5-cache/src/test/java/org/apache/hc/client5/http/impl/cache/TestCachedResponseSuitabilityChecker.java b/httpclient5-cache/src/test/java/org/apache/hc/client5/http/impl/cache/TestCachedResponseSuitabilityChecker.java
index 32cc5fe..ab1ee84 100644
--- a/httpclient5-cache/src/test/java/org/apache/hc/client5/http/impl/cache/TestCachedResponseSuitabilityChecker.java
+++ b/httpclient5-cache/src/test/java/org/apache/hc/client5/http/impl/cache/TestCachedResponseSuitabilityChecker.java
@@ -78,7 +78,7 @@ public class TestCachedResponseSuitabilityChecker {
                 new BasicHeader("Content-Length","1")
         };
         entry = getEntry(headers);
-        Assertions.assertFalse(impl.canCachedResponseBeUsed(host, request, entry, DateUtils.toDate(now)));
+        Assertions.assertFalse(impl.canCachedResponseBeUsed(host, request, entry, now));
     }
 
     @Test
@@ -89,7 +89,7 @@ public class TestCachedResponseSuitabilityChecker {
                 new BasicHeader("Content-Length","128")
         };
         entry = getEntry(headers);
-        Assertions.assertTrue(impl.canCachedResponseBeUsed(host, request, entry, DateUtils.toDate(now)));
+        Assertions.assertTrue(impl.canCachedResponseBeUsed(host, request, entry, now));
     }
 
     @Test
@@ -100,7 +100,7 @@ public class TestCachedResponseSuitabilityChecker {
                 new BasicHeader("Content-Length","128")
         };
         entry = getEntry(headers);
-        Assertions.assertFalse(impl.canCachedResponseBeUsed(host, request, entry, DateUtils.toDate(now)));
+        Assertions.assertFalse(impl.canCachedResponseBeUsed(host, request, entry, now));
     }
 
     @Test
@@ -112,7 +112,7 @@ public class TestCachedResponseSuitabilityChecker {
                 new BasicHeader("Content-Length","128")
         };
         entry = getEntry(headers);
-        Assertions.assertFalse(impl.canCachedResponseBeUsed(host, request, entry, DateUtils.toDate(now)));
+        Assertions.assertFalse(impl.canCachedResponseBeUsed(host, request, entry, now));
     }
 
     @Test
@@ -124,7 +124,7 @@ public class TestCachedResponseSuitabilityChecker {
                 new BasicHeader("Content-Length","128")
         };
         entry = getEntry(headers);
-        Assertions.assertFalse(impl.canCachedResponseBeUsed(host, request, entry, DateUtils.toDate(now)));
+        Assertions.assertFalse(impl.canCachedResponseBeUsed(host, request, entry, now));
     }
 
     @Test
@@ -136,7 +136,7 @@ public class TestCachedResponseSuitabilityChecker {
                 new BasicHeader("Content-Length","128")
         };
         entry = getEntry(headers);
-        Assertions.assertTrue(impl.canCachedResponseBeUsed(host, request, entry, DateUtils.toDate(now)));
+        Assertions.assertTrue(impl.canCachedResponseBeUsed(host, request, entry, now));
     }
 
     @Test
@@ -148,7 +148,7 @@ public class TestCachedResponseSuitabilityChecker {
                 new BasicHeader("Content-Length","128")
         };
         entry = getEntry(headers);
-        Assertions.assertTrue(impl.canCachedResponseBeUsed(host, request, entry, DateUtils.toDate(now)));
+        Assertions.assertTrue(impl.canCachedResponseBeUsed(host, request, entry, now));
     }
 
     @Test
@@ -160,7 +160,7 @@ public class TestCachedResponseSuitabilityChecker {
                 new BasicHeader("Content-Length","128")
         };
         entry = getEntry(headers);
-        Assertions.assertFalse(impl.canCachedResponseBeUsed(host, request, entry, DateUtils.toDate(now)));
+        Assertions.assertFalse(impl.canCachedResponseBeUsed(host, request, entry, now));
     }
 
     @Test
@@ -172,7 +172,7 @@ public class TestCachedResponseSuitabilityChecker {
                 new BasicHeader("Content-Length","128")
         };
         entry = getEntry(headers);
-        Assertions.assertTrue(impl.canCachedResponseBeUsed(host, request, entry, DateUtils.toDate(now)));
+        Assertions.assertTrue(impl.canCachedResponseBeUsed(host, request, entry, now));
     }
 
     @Test
@@ -184,7 +184,7 @@ public class TestCachedResponseSuitabilityChecker {
                 new BasicHeader("Content-Length","128")
         };
         entry = getEntry(headers);
-        Assertions.assertFalse(impl.canCachedResponseBeUsed(host, request, entry, DateUtils.toDate(now)));
+        Assertions.assertFalse(impl.canCachedResponseBeUsed(host, request, entry, now));
     }
 
 
@@ -197,7 +197,7 @@ public class TestCachedResponseSuitabilityChecker {
                 new BasicHeader("Content-Length","128")
         };
         entry = getEntry(headers);
-        Assertions.assertFalse(impl.canCachedResponseBeUsed(host, request, entry, DateUtils.toDate(now)));
+        Assertions.assertFalse(impl.canCachedResponseBeUsed(host, request, entry, now));
     }
 
     @Test
@@ -209,7 +209,7 @@ public class TestCachedResponseSuitabilityChecker {
                 new BasicHeader("Content-Length","128")
         };
         entry = getEntry(headers);
-        Assertions.assertFalse(impl.canCachedResponseBeUsed(host, request, entry, DateUtils.toDate(now)));
+        Assertions.assertFalse(impl.canCachedResponseBeUsed(host, request, entry, now));
     }
 
     @Test
@@ -230,7 +230,7 @@ public class TestCachedResponseSuitabilityChecker {
             .setHeuristicCoefficient(0.1f).build();
         impl = new CachedResponseSuitabilityChecker(config);
 
-        Assertions.assertTrue(impl.canCachedResponseBeUsed(host, request, entry, DateUtils.toDate(now)));
+        Assertions.assertTrue(impl.canCachedResponseBeUsed(host, request, entry, now));
     }
 
     @Test
@@ -248,7 +248,7 @@ public class TestCachedResponseSuitabilityChecker {
             .build();
         impl = new CachedResponseSuitabilityChecker(config);
 
-        Assertions.assertTrue(impl.canCachedResponseBeUsed(host, request, entry, DateUtils.toDate(now)));
+        Assertions.assertTrue(impl.canCachedResponseBeUsed(host, request, entry, now));
     }
 
     @Test
@@ -261,7 +261,7 @@ public class TestCachedResponseSuitabilityChecker {
         };
         entry = getEntry(headers);
 
-        Assertions.assertTrue(impl.canCachedResponseBeUsed(host, headRequest, entry, DateUtils.toDate(now)));
+        Assertions.assertTrue(impl.canCachedResponseBeUsed(host, headRequest, entry, now));
     }
 
     @Test
@@ -273,7 +273,7 @@ public class TestCachedResponseSuitabilityChecker {
         };
         entry = HttpTestUtils.makeHeadCacheEntry(headers);
 
-        Assertions.assertFalse(impl.canCachedResponseBeUsed(host, request, entry, DateUtils.toDate(now)));
+        Assertions.assertFalse(impl.canCachedResponseBeUsed(host, request, entry, now));
     }
 
     @Test
@@ -286,7 +286,7 @@ public class TestCachedResponseSuitabilityChecker {
         };
         entry = HttpTestUtils.makeCacheEntryWithNoRequestMethodOrEntity(headers);
 
-        Assertions.assertFalse(impl.canCachedResponseBeUsed(host, request, entry, DateUtils.toDate(now)));
+        Assertions.assertFalse(impl.canCachedResponseBeUsed(host, request, entry, now));
     }
 
     @Test
@@ -299,7 +299,7 @@ public class TestCachedResponseSuitabilityChecker {
         };
         entry = HttpTestUtils.makeCacheEntryWithNoRequestMethod(headers);
 
-        Assertions.assertTrue(impl.canCachedResponseBeUsed(host, request, entry, DateUtils.toDate(now)));
+        Assertions.assertTrue(impl.canCachedResponseBeUsed(host, request, entry, now));
     }
 
     @Test
@@ -311,7 +311,7 @@ public class TestCachedResponseSuitabilityChecker {
         };
         entry = HttpTestUtils.make204CacheEntryWithNoRequestMethod(headers);
 
-        Assertions.assertTrue(impl.canCachedResponseBeUsed(host, request, entry, DateUtils.toDate(now)));
+        Assertions.assertTrue(impl.canCachedResponseBeUsed(host, request, entry, now));
     }
 
     @Test
@@ -325,6 +325,6 @@ public class TestCachedResponseSuitabilityChecker {
         };
         entry = HttpTestUtils.makeHeadCacheEntryWithNoRequestMethod(headers);
 
-        Assertions.assertTrue(impl.canCachedResponseBeUsed(host, headRequest, entry, DateUtils.toDate(now)));
+        Assertions.assertTrue(impl.canCachedResponseBeUsed(host, headRequest, entry, now));
     }
 }
diff --git a/httpclient5-cache/src/test/java/org/apache/hc/client5/http/impl/cache/TestCachingExecChain.java b/httpclient5-cache/src/test/java/org/apache/hc/client5/http/impl/cache/TestCachingExecChain.java
index 53630fc..0a3db16 100644
--- a/httpclient5-cache/src/test/java/org/apache/hc/client5/http/impl/cache/TestCachingExecChain.java
+++ b/httpclient5-cache/src/test/java/org/apache/hc/client5/http/impl/cache/TestCachingExecChain.java
@@ -1009,8 +1009,7 @@ public class TestCachingExecChain {
         originResponse.setHeader("ETag", "\"etag\"");
 
         final ExecChain.Scope scope = new ExecChain.Scope("test", route, request, mockExecRuntime, context);
-        impl.cacheAndReturnResponse(host, request, originResponse, scope,
-                DateUtils.toDate(requestSent), DateUtils.toDate(responseReceived));
+        impl.cacheAndReturnResponse(host, request, originResponse, scope, requestSent, responseReceived);
 
         Mockito.verify(cache, Mockito.never()).createCacheEntry(
                 Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any());
@@ -1043,12 +1042,11 @@ public class TestCachingExecChain {
                 RequestEquivalent.eq(request),
                 ResponseEquivalent.eq(response),
                 Mockito.any(),
-                Mockito.eq(DateUtils.toDate(requestSent)),
-                Mockito.eq(DateUtils.toDate(responseReceived)))).thenReturn(httpCacheEntry);
+                Mockito.eq(requestSent),
+                Mockito.eq(responseReceived))).thenReturn(httpCacheEntry);
 
         final ExecChain.Scope scope = new ExecChain.Scope("test", route, request, mockExecRuntime, context);
-        impl.cacheAndReturnResponse(host, request, originResponse, scope,
-                DateUtils.toDate(requestSent), DateUtils.toDate(responseReceived));
+        impl.cacheAndReturnResponse(host, request, originResponse, scope, requestSent, responseReceived);
 
         Mockito.verify(mockCache).createCacheEntry(
                 Mockito.any(),
diff --git a/httpclient5-cache/src/test/java/org/apache/hc/client5/http/impl/cache/TestHttpByteArrayCacheEntrySerializer.java b/httpclient5-cache/src/test/java/org/apache/hc/client5/http/impl/cache/TestHttpByteArrayCacheEntrySerializer.java
index 613e19d..19f3cb5 100644
--- a/httpclient5-cache/src/test/java/org/apache/hc/client5/http/impl/cache/TestHttpByteArrayCacheEntrySerializer.java
+++ b/httpclient5-cache/src/test/java/org/apache/hc/client5/http/impl/cache/TestHttpByteArrayCacheEntrySerializer.java
@@ -83,6 +83,98 @@ public class TestHttpByteArrayCacheEntrySerializer {
     }
 
     /**
+     * Deserialize a cache entry in a bad format, expecting an exception.
+     *
+     * @throws Exception is expected
+     */
+    @Test
+    public void testInvalidCacheEntry() throws Exception {
+        // This file is a JPEG not a cache entry, so should fail to deserialize
+        final byte[] bytes = readTestFileBytes(TEST_CONTENT_FILE_NAME);
+        Assertions.assertThrows(ResourceIOException.class, () ->
+                httpCacheStorageEntryFromBytes(serializer, bytes));
+    }
+
+    /**
+     * Deserialize a cache entry with a missing header, from a previously saved file.
+     *
+     * @throws Exception is expected
+     */
+    @Test
+    public void testMissingHeaderCacheEntry() throws Exception {
+        // This file hand-edited to be missing a necessary header
+        final byte[] bytes = readTestFileBytes(MISSING_HEADER_TEST_SERIALIZED_NAME);
+        Assertions.assertThrows(ResourceIOException.class, () ->
+                httpCacheStorageEntryFromBytes(serializer, bytes));
+    }
+
+    /**
+     * Deserialize a cache entry with an invalid header value, from a previously saved file.
+     *
+     * @throws Exception is expected
+     */
+    @Test
+    public void testInvalidHeaderCacheEntry() throws Exception {
+        // This file hand-edited to have an invalid header
+        final byte[] bytes = readTestFileBytes(INVALID_HEADER_TEST_SERIALIZED_NAME);
+        Assertions.assertThrows(ResourceIOException.class, () ->
+                httpCacheStorageEntryFromBytes(serializer, bytes));
+    }
+
+    /**
+     * Deserialize a cache entry with a missing variant map key, from a previously saved file.
+     *
+     * @throws Exception is expected
+     */
+    @Test
+    public void testVariantMapMissingKeyCacheEntry() throws Exception {
+        // This file hand-edited to be missing a VariantCache key
+        final byte[] bytes = readTestFileBytes(VARIANTMAP_MISSING_KEY_TEST_SERIALIZED_NAME);
+        Assertions.assertThrows(ResourceIOException.class, () ->
+                httpCacheStorageEntryFromBytes(serializer, bytes));
+    }
+
+    /**
+     * Deserialize a cache entry with a missing variant map value, from a previously saved file.
+     *
+     * @throws Exception is expected
+     */
+    @Test
+    public void testVariantMapMissingValueCacheEntry() throws Exception {
+        // This file hand-edited to be missing a VariantCache value
+        final byte[] bytes = readTestFileBytes(VARIANTMAP_MISSING_VALUE_TEST_SERIALIZED_NAME);
+        Assertions.assertThrows(ResourceIOException.class, () ->
+                httpCacheStorageEntryFromBytes(serializer, bytes));
+    }
+
+    /**
+     * Test an IOException being thrown while deserializing.
+     *
+     * @throws Exception is expected
+     */
+    @Test
+    public void testDeserializeWithIOException() throws Exception {
+        final AbstractMessageParser<ClassicHttpResponse> throwyParser = Mockito.mock(AbstractMessageParser.class);
+        Mockito.
+                doThrow(new IOException("Test Exception")).
+                when(throwyParser).
+                parse(Mockito.any(SessionInputBuffer.class), Mockito.any(InputStream.class));
+
+        final HttpByteArrayCacheEntrySerializer testSerializer = new HttpByteArrayCacheEntrySerializer() {
+            @Override
+            protected AbstractMessageParser<ClassicHttpResponse> makeHttpResponseParser() {
+                return throwyParser;
+            }
+        };
+        Assertions.assertThrows(ResourceIOException.class, () ->
+                testSerializer.deserialize(new byte[0]));
+    }
+
+
+    ////////////// Using new Constructor with Instant  //////////////
+
+
+    /**
      * Serialize and deserialize a simple object with a tiny body.
      *
      * @throws Exception if anything goes wrong
@@ -194,10 +286,9 @@ public class TestHttpByteArrayCacheEntrySerializer {
     /**
      * Attempt to store a cache entry with a null storage key.
      *
-     * @throws Exception is expected
      */
     @Test
-    public void testNullStorageKey() throws Exception {
+    public void testNullStorageKey() {
         final HttpCacheStorageEntryTestTemplate cacheObjectValues = HttpCacheStorageEntryTestTemplate.makeDefault();
         cacheObjectValues.storageKey = null;
 
@@ -292,71 +383,6 @@ public class TestHttpByteArrayCacheEntrySerializer {
     }
 
     /**
-     * Deserialize a cache entry in a bad format, expecting an exception.
-     *
-     * @throws Exception is expected
-     */
-    @Test
-    public void testInvalidCacheEntry() throws Exception {
-        // This file is a JPEG not a cache entry, so should fail to deserialize
-        final byte[] bytes = readTestFileBytes(TEST_CONTENT_FILE_NAME);
-        Assertions.assertThrows(ResourceIOException.class, () ->
-                httpCacheStorageEntryFromBytes(serializer, bytes));
-    }
-
-    /**
-     * Deserialize a cache entry with a missing header, from a previously saved file.
-     *
-     * @throws Exception is expected
-     */
-    @Test
-    public void testMissingHeaderCacheEntry() throws Exception {
-        // This file hand-edited to be missing a necessary header
-        final byte[] bytes = readTestFileBytes(MISSING_HEADER_TEST_SERIALIZED_NAME);
-        Assertions.assertThrows(ResourceIOException.class, () ->
-                httpCacheStorageEntryFromBytes(serializer, bytes));
-    }
-
-    /**
-     * Deserialize a cache entry with an invalid header value, from a previously saved file.
-     *
-     * @throws Exception is expected
-     */
-    @Test
-    public void testInvalidHeaderCacheEntry() throws Exception {
-        // This file hand-edited to have an invalid header
-        final byte[] bytes = readTestFileBytes(INVALID_HEADER_TEST_SERIALIZED_NAME);
-        Assertions.assertThrows(ResourceIOException.class, () ->
-                httpCacheStorageEntryFromBytes(serializer, bytes));
-    }
-
-    /**
-     * Deserialize a cache entry with a missing variant map key, from a previously saved file.
-     *
-     * @throws Exception is expected
-     */
-    @Test
-    public void testVariantMapMissingKeyCacheEntry() throws Exception {
-        // This file hand-edited to be missing a VariantCache key
-        final byte[] bytes = readTestFileBytes(VARIANTMAP_MISSING_KEY_TEST_SERIALIZED_NAME);
-        Assertions.assertThrows(ResourceIOException.class, () ->
-                httpCacheStorageEntryFromBytes(serializer, bytes));
-    }
-
-    /**
-     * Deserialize a cache entry with a missing variant map value, from a previously saved file.
-     *
-     * @throws Exception is expected
-     */
-    @Test
-    public void testVariantMapMissingValueCacheEntry() throws Exception {
-        // This file hand-edited to be missing a VariantCache value
-        final byte[] bytes = readTestFileBytes(VARIANTMAP_MISSING_VALUE_TEST_SERIALIZED_NAME);
-        Assertions.assertThrows(ResourceIOException.class, () ->
-                httpCacheStorageEntryFromBytes(serializer, bytes));
-    }
-
-    /**
      * Test an HttpException being thrown while serializing.
      *
      * @throws Exception is expected
@@ -382,26 +408,5 @@ public class TestHttpByteArrayCacheEntrySerializer {
                 testSerializer.serialize(testEntry));
     }
 
-    /**
-     * Test an IOException being thrown while deserializing.
-     *
-     * @throws Exception is expected
-     */
-    @Test
-    public void testDeserializeWithIOException() throws Exception {
-        final AbstractMessageParser<ClassicHttpResponse> throwyParser = Mockito.mock(AbstractMessageParser.class);
-        Mockito.
-                doThrow(new IOException("Test Exception")).
-                when(throwyParser).
-                parse(Mockito.any(SessionInputBuffer.class), Mockito.any(InputStream.class));
 
-        final HttpByteArrayCacheEntrySerializer testSerializer = new HttpByteArrayCacheEntrySerializer() {
-            @Override
-            protected AbstractMessageParser<ClassicHttpResponse> makeHttpResponseParser() {
-                return throwyParser;
-            }
-        };
-        Assertions.assertThrows(ResourceIOException.class, () ->
-                testSerializer.deserialize(new byte[0]));
-    }
 }
diff --git a/httpclient5-cache/src/test/java/org/apache/hc/client5/http/impl/cache/TestWarningValue.java b/httpclient5-cache/src/test/java/org/apache/hc/client5/http/impl/cache/TestWarningValue.java
index bab22f1..e9b661f 100644
--- a/httpclient5-cache/src/test/java/org/apache/hc/client5/http/impl/cache/TestWarningValue.java
+++ b/httpclient5-cache/src/test/java/org/apache/hc/client5/http/impl/cache/TestWarningValue.java
@@ -204,7 +204,7 @@ public class TestWarningValue {
         Assertions.assertEquals("fred", impl.getWarnAgent());
         Assertions.assertEquals("\"stale\"", impl.getWarnText());
         final Instant target = DateUtils.parseStandardDate("Sun Nov  6 08:49:37 1994");
-        Assertions.assertEquals(target, DateUtils.toInstant(impl.getWarnDate()));
+        Assertions.assertEquals(target, impl.getWarnDate());
     }
 
     @Test
@@ -214,7 +214,7 @@ public class TestWarningValue {
         Assertions.assertEquals("fred", impl.getWarnAgent());
         Assertions.assertEquals("\"stale\"", impl.getWarnText());
         final Instant target = DateUtils.parseStandardDate("Sunday, 06-Nov-94 08:49:37 GMT");
-        Assertions.assertEquals(target, DateUtils.toInstant(impl.getWarnDate()));
+        Assertions.assertEquals(target, impl.getWarnDate());
     }
 
     @Test
@@ -224,7 +224,7 @@ public class TestWarningValue {
         Assertions.assertEquals("fred", impl.getWarnAgent());
         Assertions.assertEquals("\"stale\"", impl.getWarnText());
         final Instant target = DateUtils.parseStandardDate("Sun, 06 Nov 1994 08:49:37 GMT");
-        Assertions.assertEquals(target, DateUtils.toInstant(impl.getWarnDate()));
+        Assertions.assertEquals(target, impl.getWarnDate());
     }
 
 }
diff --git a/httpclient5-fluent/src/main/java/org/apache/hc/client5/http/fluent/Request.java b/httpclient5-fluent/src/main/java/org/apache/hc/client5/http/fluent/Request.java
index ea4b094..8e2bbf1 100644
--- a/httpclient5-fluent/src/main/java/org/apache/hc/client5/http/fluent/Request.java
+++ b/httpclient5-fluent/src/main/java/org/apache/hc/client5/http/fluent/Request.java
@@ -33,6 +33,7 @@ import java.net.URI;
 import java.net.URISyntaxException;
 import java.nio.charset.Charset;
 import java.nio.charset.StandardCharsets;
+import java.time.Instant;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Date;
@@ -260,21 +261,48 @@ public class Request {
       return request;
     }
 
+    /**
+     * @deprecated Use {@link #setDate(Instant)}
+     */
+    @Deprecated
     public Request setDate(final Date date) {
         this.request.setHeader(HttpHeader.DATE, DateUtils.formatStandardDate(DateUtils.toInstant(date)));
         return this;
     }
 
+    /**
+     * @deprecated Use {@link #setIfModifiedSince(Instant)}
+     */
+    @Deprecated
     public Request setIfModifiedSince(final Date date) {
         this.request.setHeader(HttpHeader.IF_MODIFIED_SINCE, DateUtils.formatStandardDate(DateUtils.toInstant(date)));
         return this;
     }
 
+    /**
+     * @deprecated Use {@link #setIfUnmodifiedSince(Instant)}
+     */
+    @Deprecated
     public Request setIfUnmodifiedSince(final Date date) {
         this.request.setHeader(HttpHeader.IF_UNMODIFIED_SINCE, DateUtils.formatStandardDate(DateUtils.toInstant(date)));
         return this;
     }
 
+    public Request setDate(final Instant instant) {
+        this.request.setHeader(HttpHeader.DATE, DateUtils.formatStandardDate(instant));
+        return this;
+    }
+
+    public Request setIfModifiedSince(final Instant instant) {
+        this.request.setHeader(HttpHeader.IF_MODIFIED_SINCE, DateUtils.formatStandardDate(instant));
+        return this;
+    }
+
+    public Request setIfUnmodifiedSince(final Instant instant) {
+        this.request.setHeader(HttpHeader.IF_UNMODIFIED_SINCE, DateUtils.formatStandardDate(instant));
+        return this;
+    }
+
     //// HTTP protocol parameter operations
 
     public Request version(final HttpVersion version) {
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/config/RequestConfig.java b/httpclient5/src/main/java/org/apache/hc/client5/http/config/RequestConfig.java
index b3a7860..7696a28 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/config/RequestConfig.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/config/RequestConfig.java
@@ -248,7 +248,7 @@ public class RequestConfig implements Cloneable {
     public static RequestConfig.Builder custom() {
         return new Builder();
     }
-
+    @SuppressWarnings("deprecation")
     public static RequestConfig.Builder copy(final RequestConfig config) {
         return new Builder()
             .setExpectContinueEnabled(config.isExpectContinueEnabled())
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/cookie/BasicCookieStore.java b/httpclient5/src/main/java/org/apache/hc/client5/http/cookie/BasicCookieStore.java
index a3d6e2b..3f10013 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/cookie/BasicCookieStore.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/cookie/BasicCookieStore.java
@@ -29,6 +29,7 @@ package org.apache.hc.client5.http.cookie;
 import java.io.IOException;
 import java.io.ObjectInputStream;
 import java.io.Serializable;
+import java.time.Instant;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.Iterator;
@@ -83,7 +84,7 @@ public class BasicCookieStore implements CookieStore, Serializable {
             try {
                 // first remove any old cookie that is equivalent
                 cookies.remove(cookie);
-                if (!cookie.isExpired(new Date())) {
+                if (!cookie.isExpired(Instant.now())) {
                     cookies.add(cookie);
                 }
             } finally {
@@ -136,6 +137,7 @@ public class BasicCookieStore implements CookieStore, Serializable {
      * @see Cookie#isExpired(Date)
      */
     @Override
+    @SuppressWarnings("deprecation")
     public boolean clearExpired(final Date date) {
         if (date == null) {
             return false;
@@ -156,6 +158,34 @@ public class BasicCookieStore implements CookieStore, Serializable {
     }
 
     /**
+     * Removes all of {@link Cookie cookies} in this HTTP state that have expired by the specified
+     * {@link Instant date}.
+     *
+     * @return true if any cookies were purged.
+     * @see Cookie#isExpired(Instant)
+     * @since 5.2
+     */
+    @Override
+    public boolean clearExpired(final Instant instant) {
+        if (instant == null) {
+            return false;
+        }
+        lock.writeLock().lock();
+        try {
+            boolean removed = false;
+            for (final Iterator<Cookie> it = cookies.iterator(); it.hasNext(); ) {
+                if (it.next().isExpired(instant)) {
+                    it.remove();
+                    removed = true;
+                }
+            }
+            return removed;
+        } finally {
+            lock.writeLock().unlock();
+        }
+    }
+
+    /**
      * Clears all cookies.
      */
     @Override
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/cookie/Cookie.java b/httpclient5/src/main/java/org/apache/hc/client5/http/cookie/Cookie.java
index e2ee347..2eae943 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/cookie/Cookie.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/cookie/Cookie.java
@@ -27,6 +27,7 @@
 
 package org.apache.hc.client5.http.cookie;
 
+import java.time.Instant;
 import java.util.Date;
 
 /**
@@ -77,10 +78,27 @@ public interface Cookie {
      * considered immutable. Changing it (e.g. using setTime()) could result
      * in undefined behaviour. Do so at your peril. </p>
      * @return Expiration {@link Date}, or {@code null}.
+     * @deprecated Use {{@link #getExpiryInstant()}}
      */
+    @Deprecated
     Date getExpiryDate();
 
     /**
+     * Returns the expiration {@link Instant} of the cookie, or {@code null} if none exists.
+     * <p><strong>Note:</strong> the object returned by this method is
+     * considered immutable. Changing it (e.g. using setTime()) could result in undefined behaviour.
+     * Do so at your peril. </p>
+     *
+     * @return Expiration {@link Instant}, or {@code null}.
+     * @since 5.2
+     */
+    @SuppressWarnings("deprecated")
+    default Instant getExpiryInstant() {
+        final Date date = getExpiryDate();
+        return date != null ? Instant.ofEpochMilli(date.getTime()) : null;
+    }
+
+    /**
      * Returns {@code false} if the cookie should be discarded at the end
      * of the "session"; {@code true} otherwise.
      *
@@ -119,15 +137,36 @@ public interface Cookie {
      * @param date Current time
      *
      * @return {@code true} if the cookie has expired.
+     * @deprecated Use {{@link #isExpired(Instant)}}
      */
+    @Deprecated
     boolean isExpired(final Date date);
 
     /**
+     * Returns true if this cookie has expired.
+     *
+     * @param date Current time
+     * @return {@code true} if the cookie has expired.
+     * @since 5.2
+     */
+    @SuppressWarnings("deprecation")
+    default boolean isExpired(final Instant date) {
+        return isExpired(date != null ? new Date(date.toEpochMilli()) : null);
+    }
+
+    /**
      * Returns creation time of the cookie.
+     * @deprecated Use {@link #getCreationInstant()}
      */
+    @Deprecated
     Date getCreationDate();
 
     /**
+     * Returns creation time of the cookie.
+     */
+    default Instant getCreationInstant() { return null;  }
+
+    /**
      * Checks whether this Cookie has been marked as {@code httpOnly}.
      * <p>The default implementation returns {@code false}.
      *
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/cookie/CookiePriorityComparator.java b/httpclient5/src/main/java/org/apache/hc/client5/http/cookie/CookiePriorityComparator.java
index f33f80b..2a80783 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/cookie/CookiePriorityComparator.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/cookie/CookiePriorityComparator.java
@@ -27,8 +27,8 @@
 
 package org.apache.hc.client5.http.cookie;
 
+import java.time.Instant;
 import java.util.Comparator;
-import java.util.Date;
 
 import org.apache.hc.core5.annotation.Contract;
 import org.apache.hc.core5.annotation.ThreadingBehavior;
@@ -56,10 +56,10 @@ public class CookiePriorityComparator implements Comparator<Cookie> {
         final int l2 = getPathLength(c2);
         final int result = l2 - l1;
         if (result == 0) {
-            final Date d1 = c1.getCreationDate();
-            final Date d2 = c2.getCreationDate();
+            final Instant d1 = c1.getCreationInstant();
+            final Instant d2 = c2.getCreationInstant();
             if (d1 != null && d2 != null) {
-                return (int) (d1.getTime() - d2.getTime());
+                return (int) (d1.toEpochMilli() - d2.toEpochMilli());
             }
         }
         return result;
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/cookie/CookieStore.java b/httpclient5/src/main/java/org/apache/hc/client5/http/cookie/CookieStore.java
index 19e209b..543e6c5 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/cookie/CookieStore.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/cookie/CookieStore.java
@@ -26,6 +26,7 @@
  */
 package org.apache.hc.client5.http.cookie;
 
+import java.time.Instant;
 import java.util.Date;
 import java.util.List;
 
@@ -58,10 +59,23 @@ public interface CookieStore {
      * the specified {@link java.util.Date}.
      *
      * @return true if any cookies were purged.
+     * @deprecated  Use {@link #clearExpired(Instant)}
      */
+    @Deprecated
     boolean clearExpired(Date date);
 
     /**
+     * Removes all of {@link Cookie}s in this store that have expired by
+     * the specified {@link Instant}.
+     *
+     * @return true if any cookies were purged.
+     */
+    @SuppressWarnings("deprecation")
+    default boolean clearExpired(Instant date) {
+        return clearExpired(date != null ? new Date(date.toEpochMilli()) : null);
+    }
+
+    /**
      * Clears all cookies.
      */
     void clear();
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/cookie/SetCookie.java b/httpclient5/src/main/java/org/apache/hc/client5/http/cookie/SetCookie.java
index 546476a..39ccefe 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/cookie/SetCookie.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/cookie/SetCookie.java
@@ -27,8 +27,11 @@
 
 package org.apache.hc.client5.http.cookie;
 
+import java.time.Instant;
 import java.util.Date;
 
+import org.apache.hc.client5.http.utils.DateUtils;
+
 /**
  * This interface represents a {@code Set-Cookie} response header sent by the
  * origin server to the HTTP agent in order to maintain a conversational state.
@@ -48,11 +51,27 @@ public interface SetCookie extends Cookie {
      * @param expiryDate the {@link Date} after which this cookie is no longer valid.
      *
      * @see Cookie#getExpiryDate
-     *
+     * @deprecated Use {{@link #setExpiryDate(Instant)}}
      */
+    @Deprecated
     void setExpiryDate (Date expiryDate);
 
     /**
+     * Sets expiration date.
+     * <p><strong>Note:</strong> the object returned by this method is considered
+     * immutable. Changing it (e.g. using setTime()) could result in undefined behaviour. Do so at
+     * your peril.</p>
+     *
+     * @param expiryDate the {@link Instant} after which this cookie is no longer valid.
+     * @see Cookie#getExpiryInstant()
+     * @since 5.2
+     */
+    @SuppressWarnings("deprecated")
+    default void setExpiryDate(Instant expiryDate) {
+        setExpiryDate(DateUtils.toDate(expiryDate));
+    }
+
+    /**
      * Sets the domain attribute.
      *
      * @param domain The value of the domain attribute
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/HttpAsyncClientBuilder.java b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/HttpAsyncClientBuilder.java
index 16db56e..20a1a37 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/HttpAsyncClientBuilder.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/HttpAsyncClientBuilder.java
@@ -749,7 +749,7 @@ public class HttpAsyncClientBuilder {
         }
         closeables.add(closeable);
     }
-
+    @SuppressWarnings("deprecated")
     public CloseableHttpAsyncClient build() {
         AsyncClientConnectionManager connManagerCopy = this.connManager;
         if (connManagerCopy == null) {
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/cookie/BasicClientCookie.java b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/cookie/BasicClientCookie.java
index e2cf88f..e7a0ce0 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/cookie/BasicClientCookie.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/cookie/BasicClientCookie.java
@@ -28,12 +28,14 @@
 package org.apache.hc.client5.http.impl.cookie;
 
 import java.io.Serializable;
+import java.time.Instant;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.Locale;
 import java.util.Map;
 
 import org.apache.hc.client5.http.cookie.SetCookie;
+import org.apache.hc.client5.http.utils.DateUtils;
 import org.apache.hc.core5.util.Args;
 
 /**
@@ -102,6 +104,14 @@ public final class BasicClientCookie implements SetCookie, Cloneable, Serializab
      */
     @Override
     public Date getExpiryDate() {
+        return DateUtils.toDate(cookieExpiryDate);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public Instant getExpiryInstant() {
         return cookieExpiryDate;
     }
 
@@ -118,7 +128,22 @@ public final class BasicClientCookie implements SetCookie, Cloneable, Serializab
      */
     @Override
     public void setExpiryDate (final Date expiryDate) {
-        cookieExpiryDate = expiryDate;
+        cookieExpiryDate = DateUtils.toInstant(expiryDate);
+    }
+
+    /**
+     * Sets expiration date.
+     * <p><strong>Note:</strong> the object returned by this method is considered
+     * immutable. Changing it (e.g. using setTime()) could result in undefined behaviour. Do so at
+     * your peril.</p>
+     *
+     * @param expiryInstant the {@link Instant} after which this cookie is no longer valid.
+     * @see #getExpiryInstant()
+     * @since 5.2
+     */
+    @Override
+    public void setExpiryDate (final Instant expiryInstant) {
+        cookieExpiryDate = expiryInstant;
     }
 
 
@@ -238,7 +263,20 @@ public final class BasicClientCookie implements SetCookie, Cloneable, Serializab
     public boolean isExpired(final Date date) {
         Args.notNull(date, "Date");
         return (cookieExpiryDate != null
-            && cookieExpiryDate.getTime() <= date.getTime());
+            && cookieExpiryDate.toEpochMilli() <= DateUtils.toInstant(date).toEpochMilli());
+    }
+
+    /**
+     * Returns true if this cookie has expired.
+     * @param instant Current time
+     *
+     * @return {@code true} if the cookie has expired.
+     */
+    @Override
+    public boolean isExpired(final Instant instant) {
+        Args.notNull(instant, "Instant");
+        return (cookieExpiryDate != null
+                && cookieExpiryDate.toEpochMilli() <= instant.toEpochMilli());
     }
 
     /**
@@ -246,6 +284,14 @@ public final class BasicClientCookie implements SetCookie, Cloneable, Serializab
      */
     @Override
     public Date getCreationDate() {
+        return DateUtils.toDate(creationDate);
+    }
+
+    /**
+     * @since 5.2
+     */
+    @Override
+    public Instant getCreationInstant() {
         return creationDate;
     }
 
@@ -261,8 +307,17 @@ public final class BasicClientCookie implements SetCookie, Cloneable, Serializab
 
     /**
      * @since 4.4
+     * @deprecated Use {@link #setCreationDate(Instant)}
      */
+    @Deprecated
     public void setCreationDate(final Date creationDate) {
+        this.creationDate = DateUtils.toInstant(creationDate);
+    }
+
+    /**
+     * @since 5.2
+     */
+    public void setCreationDate(final Instant creationDate) {
         this.creationDate = creationDate;
     }
 
@@ -329,8 +384,8 @@ public final class BasicClientCookie implements SetCookie, Cloneable, Serializab
     /** Domain attribute. */
     private String  cookieDomain;
 
-    /** Expiration {@link Date}. */
-    private Date cookieExpiryDate;
+    /** Expiration {@link Instant}. */
+    private Instant cookieExpiryDate;
 
     /** Path attribute. */
     private String cookiePath;
@@ -338,7 +393,7 @@ public final class BasicClientCookie implements SetCookie, Cloneable, Serializab
     /** My secure flag. */
     private boolean isSecure;
 
-    private Date creationDate;
+    private Instant creationDate;
 
     /** The {@code httpOnly} flag. */
     private boolean httpOnly;
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/cookie/BasicExpiresHandler.java b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/cookie/BasicExpiresHandler.java
index a3c2028..af67fb9 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/cookie/BasicExpiresHandler.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/cookie/BasicExpiresHandler.java
@@ -86,7 +86,7 @@ public class BasicExpiresHandler extends AbstractCookieAttributeHandler implemen
             throw new MalformedCookieException("Invalid 'expires' attribute: "
                     + value);
         }
-        cookie.setExpiryDate(DateUtils.toDate(expiry));
+        cookie.setExpiryDate(expiry);
     }
 
     @Override
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/cookie/BasicMaxAgeHandler.java b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/cookie/BasicMaxAgeHandler.java
index 599ad2c..07445a6 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/cookie/BasicMaxAgeHandler.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/cookie/BasicMaxAgeHandler.java
@@ -26,7 +26,7 @@
  */
 package org.apache.hc.client5.http.impl.cookie;
 
-import java.util.Date;
+import java.time.Instant;
 
 import org.apache.hc.client5.http.cookie.CommonCookieAttributeHandler;
 import org.apache.hc.client5.http.cookie.Cookie;
@@ -66,7 +66,7 @@ public class BasicMaxAgeHandler extends AbstractCookieAttributeHandler implement
             throw new MalformedCookieException ("Negative 'max-age' attribute: "
                     + value);
         }
-        cookie.setExpiryDate(new Date(System.currentTimeMillis() + age * 1000L));
+        cookie.setExpiryDate(Instant.now().plusSeconds(age));
     }
 
     @Override
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/cookie/LaxExpiresHandler.java b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/cookie/LaxExpiresHandler.java
index fcca1c3..a81d61e 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/cookie/LaxExpiresHandler.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/cookie/LaxExpiresHandler.java
@@ -41,7 +41,6 @@ import org.apache.hc.client5.http.cookie.CommonCookieAttributeHandler;
 import org.apache.hc.client5.http.cookie.Cookie;
 import org.apache.hc.client5.http.cookie.MalformedCookieException;
 import org.apache.hc.client5.http.cookie.SetCookie;
-import org.apache.hc.client5.http.utils.DateUtils;
 import org.apache.hc.core5.annotation.Contract;
 import org.apache.hc.core5.annotation.ThreadingBehavior;
 import org.apache.hc.core5.util.Args;
@@ -180,7 +179,7 @@ public class LaxExpiresHandler extends AbstractCookieAttributeHandler implements
 
         final Instant expiryDate = ZonedDateTime.of(year, month.getValue(), day, hour, minute, second, 0,
                 ZoneId.of("UTC")).toInstant();
-        cookie.setExpiryDate(DateUtils.toDate(expiryDate));
+        cookie.setExpiryDate(expiryDate);
     }
 
     private void skipDelims(final CharSequence buf, final Tokenizer.Cursor cursor) {
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/cookie/LaxMaxAgeHandler.java b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/cookie/LaxMaxAgeHandler.java
index a1d2f7f..7bf9a21 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/cookie/LaxMaxAgeHandler.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/cookie/LaxMaxAgeHandler.java
@@ -26,7 +26,7 @@
  */
 package org.apache.hc.client5.http.impl.cookie;
 
-import java.util.Date;
+import java.time.Instant;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -68,8 +68,8 @@ public class LaxMaxAgeHandler extends AbstractCookieAttributeHandler implements
             } catch (final NumberFormatException e) {
                 return;
             }
-            final Date expiryDate = age >= 0 ? new Date(System.currentTimeMillis() + age * 1000L) :
-                    new Date(Long.MIN_VALUE);
+            final Instant expiryDate = age >= 0 ? Instant.now().plusSeconds(age) :
+                    Instant.EPOCH;
             cookie.setExpiryDate(expiryDate);
         }
     }
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/cookie/RFC6265CookieSpec.java b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/cookie/RFC6265CookieSpec.java
index 8b2c08d..d87e866 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/cookie/RFC6265CookieSpec.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/cookie/RFC6265CookieSpec.java
@@ -27,10 +27,10 @@
 
 package org.apache.hc.client5.http.impl.cookie;
 
+import java.time.Instant;
 import java.util.ArrayList;
 import java.util.BitSet;
 import java.util.Collections;
-import java.util.Date;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Locale;
@@ -146,7 +146,7 @@ public class RFC6265CookieSpec implements CookieSpec {
         final BasicClientCookie cookie = new BasicClientCookie(name, value);
         cookie.setPath(getDefaultPath(origin));
         cookie.setDomain(getDefaultDomain(origin));
-        cookie.setCreationDate(new Date());
+        cookie.setCreationDate(Instant.now());
 
         final Map<String, String> attribMap = new LinkedHashMap<>();
         while (!cursor.atEnd()) {
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/io/BasicHttpClientConnectionManager.java b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/io/BasicHttpClientConnectionManager.java
index cfa82dc..05d8ac4 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/io/BasicHttpClientConnectionManager.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/io/BasicHttpClientConnectionManager.java
@@ -28,7 +28,7 @@
 package org.apache.hc.client5.http.impl.io;
 
 import java.io.IOException;
-import java.util.Date;
+import java.time.Instant;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeoutException;
 import java.util.concurrent.atomic.AtomicBoolean;
@@ -259,7 +259,7 @@ public class BasicHttpClientConnectionManager implements HttpClientConnectionMan
     private void checkExpiry() {
         if (this.conn != null && System.currentTimeMillis() >= this.expiry) {
             if (LOG.isDebugEnabled()) {
-                LOG.debug("{} Connection expired @ {}", id, new Date(this.expiry));
+                LOG.debug("{} Connection expired @ {}", id, Instant.ofEpochMilli(this.expiry));
             }
             closeConnection(CloseMode.GRACEFUL);
         }
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/protocol/RequestAddCookies.java b/httpclient5/src/main/java/org/apache/hc/client5/http/protocol/RequestAddCookies.java
index 7bd5199..68e9ba6 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/protocol/RequestAddCookies.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/protocol/RequestAddCookies.java
@@ -28,8 +28,8 @@
 package org.apache.hc.client5.http.protocol;
 
 import java.io.IOException;
+import java.time.Instant;
 import java.util.ArrayList;
-import java.util.Date;
 import java.util.List;
 
 import org.apache.hc.client5.http.RouteInfo;
@@ -150,7 +150,7 @@ public class RequestAddCookies implements HttpRequestInterceptor {
         final List<Cookie> cookies = cookieStore.getCookies();
         // Find cookies matching the given origin
         final List<Cookie> matchedCookies = new ArrayList<>();
-        final Date now = new Date();
+        final Instant now = Instant.now();
         boolean expired = false;
         for (final Cookie cookie : cookies) {
             if (!cookie.isExpired(now)) {
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/protocol/ResponseProcessCookies.java b/httpclient5/src/main/java/org/apache/hc/client5/http/protocol/ResponseProcessCookies.java
index a2d8459..2bb802a 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/protocol/ResponseProcessCookies.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/protocol/ResponseProcessCookies.java
@@ -149,7 +149,7 @@ public class ResponseProcessCookies implements HttpResponseInterceptor {
         buf.append(", path:");
         buf.append(cookie.getPath());
         buf.append(", expiry:");
-        buf.append(cookie.getExpiryDate());
+        buf.append(cookie.getExpiryInstant());
         return buf.toString();
     }
 
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/ssl/DefaultClientTlsStrategy.java b/httpclient5/src/main/java/org/apache/hc/client5/http/ssl/DefaultClientTlsStrategy.java
index dfa2664..bad25e4 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/ssl/DefaultClientTlsStrategy.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/ssl/DefaultClientTlsStrategy.java
@@ -110,6 +110,7 @@ public class DefaultClientTlsStrategy extends AbstractClientTlsStrategy {
     }
 
     @Override
+    @SuppressWarnings("deprecated")
     TlsDetails createTlsDetails(final SSLEngine sslEngine) {
         return tlsDetailsFactory != null ? tlsDetailsFactory.create(sslEngine) : null;
     }
diff --git a/httpclient5/src/test/java/org/apache/hc/client5/http/cookie/TestCookiePriorityComparator.java b/httpclient5/src/test/java/org/apache/hc/client5/http/cookie/TestCookiePriorityComparator.java
index 9cb76cc..f980f04 100644
--- a/httpclient5/src/test/java/org/apache/hc/client5/http/cookie/TestCookiePriorityComparator.java
+++ b/httpclient5/src/test/java/org/apache/hc/client5/http/cookie/TestCookiePriorityComparator.java
@@ -27,8 +27,8 @@
 
 package org.apache.hc.client5.http.cookie;
 
+import java.time.Instant;
 import java.util.Comparator;
-import java.util.Date;
 
 import org.apache.hc.client5.http.impl.cookie.BasicClientCookie;
 import org.junit.jupiter.api.Assertions;
@@ -101,10 +101,10 @@ public class TestCookiePriorityComparator {
     public void testUnequalityCreationDate() {
         final BasicClientCookie cookie1 = new BasicClientCookie("name1", "value");
         cookie1.setPath("/blah");
-        cookie1.setCreationDate(new Date(System.currentTimeMillis() - 200000));
+        cookie1.setCreationDate(Instant.now().minusMillis(200000));
         final BasicClientCookie cookie2 = new BasicClientCookie("name1", "value");
         cookie2.setPath("/blah");
-        cookie2.setCreationDate(new Date(System.currentTimeMillis()));
+        cookie2.setCreationDate(Instant.now());
         Assertions.assertTrue(comparator.compare(cookie1, cookie2) < 0);
         Assertions.assertTrue(comparator.compare(cookie2, cookie1) > 0);
     }
diff --git a/httpclient5/src/test/java/org/apache/hc/client5/http/impl/cookie/TestBasicCookieAttribHandlers.java b/httpclient5/src/test/java/org/apache/hc/client5/http/impl/cookie/TestBasicCookieAttribHandlers.java
index 19da947..e5b62cf 100644
--- a/httpclient5/src/test/java/org/apache/hc/client5/http/impl/cookie/TestBasicCookieAttribHandlers.java
+++ b/httpclient5/src/test/java/org/apache/hc/client5/http/impl/cookie/TestBasicCookieAttribHandlers.java
@@ -267,7 +267,7 @@ public class TestBasicCookieAttribHandlers {
         final BasicClientCookie cookie = new BasicClientCookie("name", "value");
         final CookieAttributeHandler h = new BasicMaxAgeHandler();
         h.parse(cookie, "2000");
-        Assertions.assertNotNull(cookie.getExpiryDate());
+        Assertions.assertNotNull(cookie.getExpiryInstant());
     }
 
     @Test
@@ -327,7 +327,7 @@ public class TestBasicCookieAttribHandlers {
         final CookieAttributeHandler h = new BasicExpiresHandler(DateUtils.FORMATTER_RFC1123);
 
         h.parse(cookie, DateUtils.formatStandardDate(Instant.now()));
-        Assertions.assertNotNull(cookie.getExpiryDate());
+        Assertions.assertNotNull(cookie.getExpiryInstant());
     }
 
     @Test
diff --git a/httpclient5/src/test/java/org/apache/hc/client5/http/impl/cookie/TestBasicCookieStore.java b/httpclient5/src/test/java/org/apache/hc/client5/http/impl/cookie/TestBasicCookieStore.java
index fe2d9c4..30675c4 100644
--- a/httpclient5/src/test/java/org/apache/hc/client5/http/impl/cookie/TestBasicCookieStore.java
+++ b/httpclient5/src/test/java/org/apache/hc/client5/http/impl/cookie/TestBasicCookieStore.java
@@ -31,7 +31,8 @@ import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
-import java.util.Calendar;
+import java.time.Instant;
+import java.time.temporal.ChronoUnit;
 import java.util.List;
 
 import org.apache.hc.client5.http.cookie.BasicCookieStore;
@@ -65,9 +66,8 @@ public class TestBasicCookieStore {
         final BasicCookieStore store = new BasicCookieStore();
         final BasicClientCookie cookie = new BasicClientCookie("name1", "value1");
 
-        final Calendar c = Calendar.getInstance();
-        c.add(Calendar.DAY_OF_YEAR, -10);
-        cookie.setExpiryDate(c.getTime());
+        final Instant  minus_10_days = Instant.now().minus(10, ChronoUnit.DAYS);
+        cookie.setExpiryDate(minus_10_days);
         store.addCookie(cookie);
         final List<Cookie> list = store.getCookies();
         Assertions.assertNotNull(list);
diff --git a/httpclient5/src/test/java/org/apache/hc/client5/http/impl/cookie/TestLaxCookieAttribHandlers.java b/httpclient5/src/test/java/org/apache/hc/client5/http/impl/cookie/TestLaxCookieAttribHandlers.java
index 30ca266..2133512 100644
--- a/httpclient5/src/test/java/org/apache/hc/client5/http/impl/cookie/TestLaxCookieAttribHandlers.java
+++ b/httpclient5/src/test/java/org/apache/hc/client5/http/impl/cookie/TestLaxCookieAttribHandlers.java
@@ -43,7 +43,7 @@ public class TestLaxCookieAttribHandlers {
         final BasicClientCookie cookie = new BasicClientCookie("name", "value");
         final CookieAttributeHandler h = new LaxMaxAgeHandler();
         h.parse(cookie, "2000");
-        Assertions.assertNotNull(cookie.getExpiryDate());
+        Assertions.assertNotNull(cookie.getExpiryInstant());
     }
 
     @Test
@@ -51,7 +51,7 @@ public class TestLaxCookieAttribHandlers {
         final BasicClientCookie cookie = new BasicClientCookie("name", "value");
         final CookieAttributeHandler h = new LaxMaxAgeHandler();
         h.parse(cookie, "-2000");
-        Assertions.assertNotNull(cookie.getExpiryDate());
+        Assertions.assertNotNull(cookie.getExpiryInstant());
     }
 
     @Test
@@ -59,7 +59,7 @@ public class TestLaxCookieAttribHandlers {
         final BasicClientCookie cookie = new BasicClientCookie("name", "value");
         final CookieAttributeHandler h = new LaxMaxAgeHandler();
         h.parse(cookie, "0000");
-        Assertions.assertNotNull(cookie.getExpiryDate());
+        Assertions.assertNotNull(cookie.getExpiryInstant());
     }
 
     @Test
@@ -67,7 +67,7 @@ public class TestLaxCookieAttribHandlers {
         final BasicClientCookie cookie = new BasicClientCookie("name", "value");
         final CookieAttributeHandler h = new LaxMaxAgeHandler();
         h.parse(cookie, "  ");
-        Assertions.assertNull(cookie.getExpiryDate());
+        Assertions.assertNull(cookie.getExpiryInstant());
     }
 
     @Test
@@ -75,7 +75,7 @@ public class TestLaxCookieAttribHandlers {
         final BasicClientCookie cookie = new BasicClientCookie("name", "value");
         final CookieAttributeHandler h = new LaxMaxAgeHandler();
         h.parse(cookie, "garbage");
-        Assertions.assertNull(cookie.getExpiryDate());
+        Assertions.assertNull(cookie.getExpiryInstant());
     }
 
     @Test
@@ -98,7 +98,25 @@ public class TestLaxCookieAttribHandlers {
         final CookieAttributeHandler h = new LaxExpiresHandler();
         h.parse(cookie, "1:0:12 8-jan-2012");
 
-        final LocalDateTime expiryDate = DateUtils.toUTC(cookie.getExpiryDate());
+        final LocalDateTime expiryDate = DateUtils.toUTC(cookie.getExpiryInstant());
+        Assertions.assertNotNull(expiryDate);
+
+        Assertions.assertEquals(2012, expiryDate.get(ChronoField.YEAR));
+        Assertions.assertEquals(1, expiryDate.get(ChronoField.MONTH_OF_YEAR));
+        Assertions.assertEquals(8, expiryDate.get(ChronoField.DAY_OF_MONTH));
+        Assertions.assertEquals(1, expiryDate.get(ChronoField.HOUR_OF_DAY));
+        Assertions.assertEquals(0, expiryDate.get(ChronoField.MINUTE_OF_HOUR));
+        Assertions.assertEquals(12, expiryDate.get(ChronoField.SECOND_OF_MINUTE));
+        Assertions.assertEquals(0, expiryDate.get(ChronoField.MILLI_OF_SECOND));
+    }
+
+    @Test
+    public void testParseExpiryInstant() throws Exception {
+        final BasicClientCookie cookie = new BasicClientCookie("name", "value");
+        final CookieAttributeHandler h = new LaxExpiresHandler();
+        h.parse(cookie, "1:0:12 8-jan-2012");
+
+        final LocalDateTime expiryDate = DateUtils.toUTC(cookie.getExpiryInstant());
         Assertions.assertNotNull(expiryDate);
 
         Assertions.assertEquals(2012, expiryDate.get(ChronoField.YEAR));
@@ -115,7 +133,7 @@ public class TestLaxCookieAttribHandlers {
         final BasicClientCookie cookie = new BasicClientCookie("name", "value");
         final CookieAttributeHandler h = new LaxExpiresHandler();
         h.parse(cookie, null);
-        Assertions.assertNull(cookie.getExpiryDate());
+        Assertions.assertNull(cookie.getExpiryInstant());
     }
 
     @Test
@@ -156,7 +174,25 @@ public class TestLaxCookieAttribHandlers {
         final CookieAttributeHandler h = new LaxExpiresHandler();
         h.parse(cookie, "1:59:00blah; 8-feb-2000");
 
-        final LocalDateTime expiryDate = DateUtils.toUTC(cookie.getExpiryDate());
+        final LocalDateTime expiryDate = DateUtils.toUTC(cookie.getExpiryInstant());
+        Assertions.assertNotNull(expiryDate);
+
+        Assertions.assertEquals(2000, expiryDate.get(ChronoField.YEAR_OF_ERA));
+        Assertions.assertEquals(2, expiryDate.get(ChronoField.MONTH_OF_YEAR));
+        Assertions.assertEquals(8, expiryDate.get(ChronoField.DAY_OF_MONTH));
+        Assertions.assertEquals(1, expiryDate.get(ChronoField.HOUR_OF_DAY));
+        Assertions.assertEquals(59, expiryDate.get(ChronoField.MINUTE_OF_HOUR));
+        Assertions.assertEquals(0, expiryDate.get(ChronoField.SECOND_OF_MINUTE));
+        Assertions.assertEquals(0, expiryDate.get(ChronoField.MILLI_OF_SECOND));
+    }
+
+    @Test
+    public void testParseExpiryFunnyTimeInstant() throws Exception {
+        final BasicClientCookie cookie = new BasicClientCookie("name", "value");
+        final CookieAttributeHandler h = new LaxExpiresHandler();
+        h.parse(cookie, "1:59:00blah; 8-feb-2000");
+
+        final LocalDateTime expiryDate = DateUtils.toUTC(cookie.getExpiryInstant());
         Assertions.assertNotNull(expiryDate);
 
         Assertions.assertEquals(2000, expiryDate.get(ChronoField.YEAR_OF_ERA));
@@ -198,7 +234,25 @@ public class TestLaxCookieAttribHandlers {
         final CookieAttributeHandler h = new LaxExpiresHandler();
         h.parse(cookie, "12:00:00 8blah;mar;1880");
 
-        final LocalDateTime expiryDate = DateUtils.toUTC(cookie.getExpiryDate());
+        final LocalDateTime expiryDate = DateUtils.toUTC(cookie.getExpiryInstant());
+        Assertions.assertNotNull(expiryDate);
+
+        Assertions.assertEquals(1880, expiryDate.get(ChronoField.YEAR));
+        Assertions.assertEquals(3, expiryDate.get(ChronoField.MONTH_OF_YEAR));
+        Assertions.assertEquals(8, expiryDate.get(ChronoField.DAY_OF_MONTH));
+        Assertions.assertEquals(12, expiryDate.get(ChronoField.HOUR_OF_DAY));
+        Assertions.assertEquals(0, expiryDate.get(ChronoField.MINUTE_OF_HOUR));
+        Assertions.assertEquals(0, expiryDate.get(ChronoField.SECOND_OF_MINUTE));
+        Assertions.assertEquals(0, expiryDate.get(ChronoField.MILLI_OF_SECOND));
+    }
+
+    @Test
+    public void testParseExpiryFunnyDayOfMonthInstant() throws Exception {
+        final BasicClientCookie cookie = new BasicClientCookie("name", "value");
+        final CookieAttributeHandler h = new LaxExpiresHandler();
+        h.parse(cookie, "12:00:00 8blah;mar;1880");
+
+        final LocalDateTime expiryDate = DateUtils.toUTC(cookie.getExpiryInstant());
         Assertions.assertNotNull(expiryDate);
 
         Assertions.assertEquals(1880, expiryDate.get(ChronoField.YEAR));
@@ -224,7 +278,25 @@ public class TestLaxCookieAttribHandlers {
         final CookieAttributeHandler h = new LaxExpiresHandler();
         h.parse(cookie, "23:59:59; 1-ApriLLLLL-2008");
 
-        final LocalDateTime expiryDate = DateUtils.toUTC(cookie.getExpiryDate());
+        final LocalDateTime expiryDate = DateUtils.toUTC(cookie.getExpiryInstant());
+        Assertions.assertNotNull(expiryDate);
+
+        Assertions.assertEquals(2008, expiryDate.get(ChronoField.YEAR));
+        Assertions.assertEquals(4, expiryDate.get(ChronoField.MONTH_OF_YEAR));
+        Assertions.assertEquals(1, expiryDate.get(ChronoField.DAY_OF_MONTH));
+        Assertions.assertEquals(23, expiryDate.get(ChronoField.HOUR_OF_DAY));
+        Assertions.assertEquals(59, expiryDate.get(ChronoField.MINUTE_OF_HOUR));
+        Assertions.assertEquals(59, expiryDate.get(ChronoField.SECOND_OF_MINUTE));
+        Assertions.assertEquals(0, expiryDate.get(ChronoField.MILLI_OF_SECOND));
+    }
+
+    @Test
+    public void testParseExpiryFunnyMonthInstant() throws Exception {
+        final BasicClientCookie cookie = new BasicClientCookie("name", "value");
+        final CookieAttributeHandler h = new LaxExpiresHandler();
+        h.parse(cookie, "23:59:59; 1-ApriLLLLL-2008");
+
+        final LocalDateTime expiryDate = DateUtils.toUTC(cookie.getExpiryInstant());
         Assertions.assertNotNull(expiryDate);
 
         Assertions.assertEquals(2008, expiryDate.get(ChronoField.YEAR));
@@ -266,7 +338,25 @@ public class TestLaxCookieAttribHandlers {
         final CookieAttributeHandler h = new LaxExpiresHandler();
         h.parse(cookie, "23:59:59; 1-Apr-2008blah");
 
-        final LocalDateTime expiryDate = DateUtils.toUTC(cookie.getExpiryDate());
+        final LocalDateTime expiryDate = DateUtils.toUTC(cookie.getExpiryInstant());
+        Assertions.assertNotNull(expiryDate);
+
+        Assertions.assertEquals(2008, expiryDate.get(ChronoField.YEAR));
+        Assertions.assertEquals(4, expiryDate.get(ChronoField.MONTH_OF_YEAR));
+        Assertions.assertEquals(1, expiryDate.get(ChronoField.DAY_OF_MONTH));
+        Assertions.assertEquals(23, expiryDate.get(ChronoField.HOUR_OF_DAY));
+        Assertions.assertEquals(59, expiryDate.get(ChronoField.MINUTE_OF_HOUR));
+        Assertions.assertEquals(59, expiryDate.get(ChronoField.SECOND_OF_MINUTE));
+        Assertions.assertEquals(0, expiryDate.get(ChronoField.MILLI_OF_SECOND));
+    }
+
+    @Test
+    public void testParseExpiryFunnyYearInstant() throws Exception {
+        final BasicClientCookie cookie = new BasicClientCookie("name", "value");
+        final CookieAttributeHandler h = new LaxExpiresHandler();
+        h.parse(cookie, "23:59:59; 1-Apr-2008blah");
+
+        final LocalDateTime expiryDate = DateUtils.toUTC(cookie.getExpiryInstant());
         Assertions.assertNotNull(expiryDate);
 
         Assertions.assertEquals(2008, expiryDate.get(ChronoField.YEAR));
@@ -284,7 +374,7 @@ public class TestLaxCookieAttribHandlers {
         final CookieAttributeHandler h = new LaxExpiresHandler();
         h.parse(cookie, "23:59:59; 1-Apr-70");
 
-        final LocalDateTime expiryDate = DateUtils.toUTC(cookie.getExpiryDate());
+        final LocalDateTime expiryDate = DateUtils.toUTC(cookie.getExpiryInstant());
         Assertions.assertNotNull(expiryDate);
 
         Assertions.assertEquals(1970, expiryDate.get(ChronoField.YEAR));
@@ -296,7 +386,7 @@ public class TestLaxCookieAttribHandlers {
         final CookieAttributeHandler h = new LaxExpiresHandler();
         h.parse(cookie, "23:59:59; 1-Apr-99");
 
-        final LocalDateTime expiryDate = DateUtils.toUTC(cookie.getExpiryDate());
+        final LocalDateTime expiryDate = DateUtils.toUTC(cookie.getExpiryInstant());
         Assertions.assertNotNull(expiryDate);
 
         Assertions.assertEquals(1999, expiryDate.get(ChronoField.YEAR));
@@ -308,7 +398,7 @@ public class TestLaxCookieAttribHandlers {
         final CookieAttributeHandler h = new LaxExpiresHandler();
         h.parse(cookie, "23:59:59; 1-Apr-00");
 
-        final LocalDateTime expiryDate = DateUtils.toUTC(cookie.getExpiryDate());
+        final LocalDateTime expiryDate = DateUtils.toUTC(cookie.getExpiryInstant());
         Assertions.assertNotNull(expiryDate);
 
         Assertions.assertEquals(2000, expiryDate.get(ChronoField.YEAR));
diff --git a/httpclient5/src/test/java/org/apache/hc/client5/http/protocol/TestRequestAddCookies.java b/httpclient5/src/test/java/org/apache/hc/client5/http/protocol/TestRequestAddCookies.java
index 99929a2..bc1d52b 100644
--- a/httpclient5/src/test/java/org/apache/hc/client5/http/protocol/TestRequestAddCookies.java
+++ b/httpclient5/src/test/java/org/apache/hc/client5/http/protocol/TestRequestAddCookies.java
@@ -26,7 +26,7 @@
  */
 package org.apache.hc.client5.http.protocol;
 
-import java.util.Date;
+import java.time.Instant;
 
 import org.apache.hc.client5.http.HttpRoute;
 import org.apache.hc.client5.http.RouteInfo.LayerType;
@@ -321,7 +321,7 @@ public class TestRequestAddCookies {
         final BasicClientCookie cookie3 = new BasicClientCookie("name3", "value3");
         cookie3.setDomain("localhost.local");
         cookie3.setPath("/");
-        cookie3.setExpiryDate(new Date(System.currentTimeMillis() + 100));
+        cookie3.setExpiryDate(Instant.now().plusMillis(100));
         this.cookieStore.addCookie(cookie3);
 
         Assertions.assertEquals(3, this.cookieStore.getCookies().size());
@@ -346,7 +346,7 @@ public class TestRequestAddCookies {
         Assertions.assertEquals(1, headers.length);
         Assertions.assertEquals("name1=value1; name2=value2", headers[0].getValue());
 
-        Mockito.verify(this.cookieStore, Mockito.times(1)).clearExpired(ArgumentMatchers.any());
+        Mockito.verify(this.cookieStore, Mockito.times(1)).clearExpired(ArgumentMatchers.any(Instant.class));
     }
 
     @Test