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 13:27:21 UTC

[httpcomponents-client] branch master updated (6a360aa -> d323e0d)

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

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


 discard 6a360aa  HTTPCLIENT-2189 - Use Time APIs for date internal class and Cookie.
     new d323e0d  HTTPCLIENT-2189 - Cookie and Cache APIs to use Java time primitives

This update added new revisions after undoing existing revisions.
That is to say, some revisions that were in the old version of the
branch are not in the new version.  This situation occurs
when a user --force pushes a change and generates a repository
containing something like this:

 * -- * -- B -- O -- O -- O   (6a360aa)
            \
             N -- N -- N   refs/heads/master (d323e0d)

You should already have received notification emails for all of the O
revisions, and so the following emails describe only the N revisions
from the common base, B.

Any revisions marked "omit" are not gone; other references still
refer to them.  Any revisions marked "discard" are gone forever.

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../apache/hc/client5/http/impl/cookie/BasicClientCookie.java | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

[httpcomponents-client] 01/01: HTTPCLIENT-2189 - Cookie and Cache APIs to use Java time primitives

Posted by ol...@apache.org.
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

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

    HTTPCLIENT-2189 - Cookie and Cache APIs to use Java time primitives
---
 .../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        |  76 ++++++++-
 .../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, 831 insertions(+), 435 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..18116da 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;
 
 /**
@@ -99,9 +101,19 @@ public final class BasicClientCookie implements SetCookie, Cloneable, Serializab
      *
      * @see #setExpiryDate(java.util.Date)
      *
+     * @deprecated Use {@link #getExpiryInstant()}
      */
+    @Deprecated
     @Override
     public Date getExpiryDate() {
+        return DateUtils.toDate(cookieExpiryDate);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public Instant getExpiryInstant() {
         return cookieExpiryDate;
     }
 
@@ -113,12 +125,28 @@ public final class BasicClientCookie implements SetCookie, Cloneable, Serializab
      *
      * @param expiryDate the {@link Date} after which this cookie is no longer valid.
      *
-     * @see #getExpiryDate
+     * @deprecated Use {{@link #setExpiryDate(Instant)}}
      *
      */
+    @Deprecated
     @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;
     }
 
 
@@ -233,19 +261,46 @@ public final class BasicClientCookie implements SetCookie, Cloneable, Serializab
      * @param date Current time
      *
      * @return {@code true} if the cookie has expired.
+     *
+     * @deprecated Use {@link #isExpired(Instant)}
      */
+    @Deprecated
     @Override
     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());
     }
 
     /**
      * @since 4.4
+     *
+     * @deprecated Use {@link #getCreationInstant()}.
      */
+    @Deprecated
     @Override
     public Date getCreationDate() {
+        return DateUtils.toDate(creationDate);
+    }
+
+    /**
+     * @since 5.2
+     */
+    @Override
+    public Instant getCreationInstant() {
         return creationDate;
     }
 
@@ -261,8 +316,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 +393,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 +402,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