diff --git a/service-t/src/com/android/server/connectivity/mdns/QueryTaskConfig.java b/service-t/src/com/android/server/connectivity/mdns/QueryTaskConfig.java
index 10a71a2..63524a6 100644
--- a/service-t/src/com/android/server/connectivity/mdns/QueryTaskConfig.java
+++ b/service-t/src/com/android/server/connectivity/mdns/QueryTaskConfig.java
@@ -159,8 +159,7 @@
         }
         final int maxTimeBetweenBursts = queryMode == AGGRESSIVE_QUERY_MODE
                 ? MAX_TIME_BETWEEN_AGGRESSIVE_BURSTS_MS : MAX_TIME_BETWEEN_ACTIVE_PASSIVE_BURSTS_MS;
-        return timeBetweenBurstsInMs < maxTimeBetweenBursts
-                ? Math.min(timeBetweenBurstsInMs * 2, maxTimeBetweenBursts) : timeBetweenBurstsInMs;
+        return Math.min(timeBetweenBurstsInMs * 2, maxTimeBetweenBursts);
     }
 
     /**
@@ -172,21 +171,19 @@
         if (newTransactionId > UNSIGNED_SHORT_MAX_VALUE) {
             newTransactionId = 1;
         }
-        boolean newIsFirstBurst = isFirstBurst;
+
         int newQueriesPerBurst = queriesPerBurst;
         int newBurstCounter = burstCounter + 1;
         final boolean isFirstQueryInBurst = newBurstCounter == 1;
         final boolean isLastQueryInBurst = newBurstCounter == queriesPerBurst;
+        boolean newIsFirstBurst = isFirstBurst && !isLastQueryInBurst;
         if (isLastQueryInBurst) {
             newBurstCounter = 0;
-            if (isFirstBurst) {
-                newIsFirstBurst = false;
-                // In passive scan mode, sends a single burst of QUERIES_PER_BURST queries, and
-                // then in each TIME_BETWEEN_BURSTS interval, sends QUERIES_PER_BURST_PASSIVE_MODE
-                // queries.
-                if (queryMode == PASSIVE_QUERY_MODE) {
-                    newQueriesPerBurst = QUERIES_PER_BURST_PASSIVE_MODE;
-                }
+            // In passive scan mode, sends a single burst of QUERIES_PER_BURST queries, and
+            // then in each TIME_BETWEEN_BURSTS interval, sends QUERIES_PER_BURST_PASSIVE_MODE
+            // queries.
+            if (isFirstBurst && queryMode == PASSIVE_QUERY_MODE) {
+                newQueriesPerBurst = QUERIES_PER_BURST_PASSIVE_MODE;
             }
         }
 
diff --git a/tests/unit/java/com/android/server/connectivity/mdns/MdnsServiceTypeClientTests.java b/tests/unit/java/com/android/server/connectivity/mdns/MdnsServiceTypeClientTests.java
index df23da4..dab3b42 100644
--- a/tests/unit/java/com/android/server/connectivity/mdns/MdnsServiceTypeClientTests.java
+++ b/tests/unit/java/com/android/server/connectivity/mdns/MdnsServiceTypeClientTests.java
@@ -1777,13 +1777,6 @@
                 socketKey);
     }
 
-    private int getBetweenBurstTime(int burstCounter, int currentBetweenTime, int maxBetweenTime,
-            int initialBetweenTime) {
-        return currentBetweenTime < maxBetweenTime
-                ? Math.min(initialBetweenTime * (int) Math.pow(2, burstCounter), maxBetweenTime)
-                : currentBetweenTime;
-    }
-
     @Test
     public void sendQueries_aggressiveScanMode() {
         final MdnsSearchOptions searchOptions = MdnsSearchOptions.newBuilder()
@@ -1799,9 +1792,9 @@
             verifyAndSendQuery(i + 1, /* timeInMs= */ 0, /* expectsUnicastResponse= */ false);
             verifyAndSendQuery(i + 2, TIME_BETWEEN_RETRANSMISSION_QUERIES_IN_BURST_MS,
                     /* expectsUnicastResponse= */ false);
-            betweenBurstTime = getBetweenBurstTime(burstCounter, betweenBurstTime,
-                    MAX_TIME_BETWEEN_AGGRESSIVE_BURSTS_MS,
-                    INITIAL_AGGRESSIVE_TIME_BETWEEN_BURSTS_MS);
+            betweenBurstTime = Math.min(
+                    INITIAL_AGGRESSIVE_TIME_BETWEEN_BURSTS_MS * (int) Math.pow(2, burstCounter),
+                    MAX_TIME_BETWEEN_AGGRESSIVE_BURSTS_MS);
             burstCounter++;
         }
         // Verify that Task is not removed before stopSendAndReceive was called.
@@ -1860,9 +1853,9 @@
             verifyAndSendQuery(i + 1, /* timeInMs= */ 0, /* expectsUnicastResponse= */ false);
             verifyAndSendQuery(i + 2, TIME_BETWEEN_RETRANSMISSION_QUERIES_IN_BURST_MS,
                     /* expectsUnicastResponse= */ false);
-            betweenBurstTime = getBetweenBurstTime(burstCounter, betweenBurstTime,
-                    MAX_TIME_BETWEEN_AGGRESSIVE_BURSTS_MS,
-                    INITIAL_AGGRESSIVE_TIME_BETWEEN_BURSTS_MS);
+            betweenBurstTime = Math.min(
+                    INITIAL_AGGRESSIVE_TIME_BETWEEN_BURSTS_MS * (int) Math.pow(2, burstCounter),
+                    MAX_TIME_BETWEEN_AGGRESSIVE_BURSTS_MS);
             burstCounter++;
         }
         // In backoff mode, the current scheduled task will be canceled and reschedule if the
