diff --git a/src/SignalR/clients/java/signalr/src/test/java/com/microsoft/signalr/HubConnectionTest.java b/src/SignalR/clients/java/signalr/src/test/java/com/microsoft/signalr/HubConnectionTest.java
index fc7f86304cc531988724eec842beb11379889e5b..ab43980dd9feffc0fcb5fdb61874a1dcc36e2861 100644
--- a/src/SignalR/clients/java/signalr/src/test/java/com/microsoft/signalr/HubConnectionTest.java
+++ b/src/SignalR/clients/java/signalr/src/test/java/com/microsoft/signalr/HubConnectionTest.java
@@ -2118,6 +2118,37 @@ class HubConnectionTest {
         assertEquals("Bearer secretToken", token.get());
     }
 
+    @Test
+    public void AccessTokenProviderCanProvideDifferentValues() {
+        AtomicReference<String> token = new AtomicReference<>();
+        TestHttpClient client = new TestHttpClient()
+                .on("POST", "http://example.com/negotiate?negotiateVersion=1",
+                        (req) -> {
+                            token.set(req.getHeaders().get("Authorization"));
+                            return Single.just(new HttpResponse(200, "", "{\"connectionId\":\"bVOiRPG8-6YiJ6d7ZcTOVQ\",\""
+                                + "availableTransports\":[{\"transport\":\"WebSockets\",\"transferFormats\":[\"Text\",\"Binary\"]}]}"));
+                        });
+
+        AtomicInteger i = new AtomicInteger(0);
+        MockTransport transport = new MockTransport(true);
+        HubConnection hubConnection = HubConnectionBuilder
+                .create("http://example.com")
+                .withTransportImplementation(transport)
+                .withHttpClient(client)
+                .withAccessTokenProvider(Single.defer(() -> Single.just("secret" + i.getAndIncrement())))
+                .build();
+
+        hubConnection.start().timeout(1, TimeUnit.SECONDS).blockingAwait();
+        assertEquals(HubConnectionState.CONNECTED, hubConnection.getConnectionState());
+        hubConnection.stop().timeout(1, TimeUnit.SECONDS).blockingAwait();
+        assertEquals("Bearer secret0", token.get());
+
+        hubConnection.start().timeout(1, TimeUnit.SECONDS).blockingAwait();
+        assertEquals(HubConnectionState.CONNECTED, hubConnection.getConnectionState());
+        hubConnection.stop().timeout(1, TimeUnit.SECONDS).blockingAwait();
+        assertEquals("Bearer secret1", token.get());
+    }
+
     @Test
     public void accessTokenProviderIsOverriddenFromRedirectNegotiate() {
         AtomicReference<String> token = new AtomicReference<>();
diff --git a/src/SignalR/clients/java/signalr/src/test/java/com/microsoft/signalr/LongPollingTransportTest.java b/src/SignalR/clients/java/signalr/src/test/java/com/microsoft/signalr/LongPollingTransportTest.java
index bd3f8343252f131ff0750fb4a8940321c79bc88d..5a9408387e81cd158faa9f6f6eac4903bfa3cff3 100644
--- a/src/SignalR/clients/java/signalr/src/test/java/com/microsoft/signalr/LongPollingTransportTest.java
+++ b/src/SignalR/clients/java/signalr/src/test/java/com/microsoft/signalr/LongPollingTransportTest.java
@@ -263,6 +263,42 @@ public class LongPollingTransportTest {
         close.onComplete();
     }
 
+    @Test
+    public void LongPollingTransportRunsAccessTokenProviderEveryRequest() {
+        AtomicInteger requestCount = new AtomicInteger();
+        AtomicReference<String> headerValue = new AtomicReference<>();
+        CompletableSubject secondGet = CompletableSubject.create();
+        CompletableSubject close = CompletableSubject.create();
+        TestHttpClient client = new TestHttpClient()
+                .on("GET", (req) -> {
+                    if (requestCount.get() == 0) {
+                        requestCount.incrementAndGet();
+                        return Single.just(new HttpResponse(200, "", ""));
+                    }
+                    assertEquals("Bearer TOKEN1", req.getHeaders().get("Authorization"));
+                    secondGet.onComplete();
+                    assertTrue(close.blockingAwait(1, TimeUnit.SECONDS));
+                    return Single.just(new HttpResponse(204, "", ""));
+                })
+                .on("POST", (req) -> {
+                    assertFalse(req.getHeaders().isEmpty());
+                    headerValue.set(req.getHeaders().get("Authorization"));
+                    return Single.just(new HttpResponse(200, "", ""));
+                });
+
+        AtomicInteger i = new AtomicInteger(0);
+        Map<String, String> headers = new HashMap<>();
+        Single<String> tokenProvider = Single.defer(() -> Single.just("TOKEN" + i.getAndIncrement()));
+        LongPollingTransport transport = new LongPollingTransport(headers, client, tokenProvider);
+        transport.setOnClose((error) -> {});
+
+        transport.start("http://example.com").timeout(1, TimeUnit.SECONDS).blockingAwait();
+        secondGet.blockingAwait(1, TimeUnit.SECONDS);
+        assertTrue(transport.send("TEST").blockingAwait(1, TimeUnit.SECONDS));
+        assertEquals("Bearer TOKEN2", headerValue.get());
+        close.onComplete();
+    }
+
     @Test
     public void After204StopDoesNotTriggerOnClose() {
         AtomicBoolean firstPoll = new AtomicBoolean(true);