diff --git a/src/backend/replication/walreceiver.c b/src/backend/replication/walreceiver.c
index 8bd2ba37dd..fed2cc6e6f 100644
--- a/src/backend/replication/walreceiver.c
+++ b/src/backend/replication/walreceiver.c
@@ -1080,6 +1080,9 @@ XLogWalRcvClose(XLogRecPtr recptr, TimeLineID tli)
 	recvFile = -1;
 }
 
+static XLogRecPtr writePtr = 0;
+static XLogRecPtr flushPtr = 0;
+
 /*
  * Send reply message to primary, indicating our current WAL locations, oldest
  * xmin and the current time.
@@ -1096,8 +1099,6 @@ XLogWalRcvClose(XLogRecPtr recptr, TimeLineID tli)
 static void
 XLogWalRcvSendReply(bool force, bool requestReply)
 {
-	static XLogRecPtr writePtr = 0;
-	static XLogRecPtr flushPtr = 0;
 	XLogRecPtr	applyPtr;
 	TimestampTz now;
 
@@ -1334,6 +1335,9 @@ WalRcvComputeNextWakeup(WalRcvWakeupReason reason, TimestampTz now)
 		case WALRCV_WAKEUP_REPLY:
 			if (wal_receiver_status_interval <= 0)
 				wakeup[reason] = PG_INT64_MAX;
+			else if (writePtr != LogstreamResult.Write ||
+					 flushPtr != LogstreamResult.Flush)
+				wakeup[reason] = now + 100000;	/* frequent replies, not yet caught up */
 			else
 				wakeup[reason] = now + wal_receiver_status_interval * INT64CONST(1000000);
 			break;
