diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c
index 5c9314695fe0878d0568549beb6ec891d837a245..bd64c2873f771418fc31ceb600c5d2e15ac09b26 100644
--- a/src/backend/replication/walsender.c
+++ b/src/backend/replication/walsender.c
@@ -22,7 +22,8 @@
  * If the server is shut down, postmaster sends us SIGUSR2 after all
  * regular backends have exited and the shutdown checkpoint has been written.
  * This instruct walsender to send any outstanding WAL, including the
- * shutdown checkpoint record, and then exit.
+ * shutdown checkpoint record, wait for it to be replicated to the standby,
+ * and then exit.
  *
  *
  * Portions Copyright (c) 2010-2012, PostgreSQL Global Development Group
@@ -800,7 +801,8 @@ WalSndLoop(void)
 
 			/*
 			 * When SIGUSR2 arrives, we send any outstanding logs up to the
-			 * shutdown checkpoint record (i.e., the latest record) and exit.
+			 * shutdown checkpoint record (i.e., the latest record), wait
+			 * for them to be replicated to the standby, and exit.
 			 * This may be a normal termination at shutdown, or a promotion,
 			 * the walsender is not sure which.
 			 */
@@ -808,7 +810,8 @@ WalSndLoop(void)
 			{
 				/* ... let's just be real sure we're caught up ... */
 				XLogSend(output_message, &caughtup);
-				if (caughtup && !pq_is_send_pending())
+				if (caughtup && XLByteEQ(sentPtr, MyWalSnd->flush) &&
+					!pq_is_send_pending())
 				{
 					walsender_shutdown_requested = true;
 					continue;	/* don't want to wait more */