diff --git a/src/backend/access/transam/xlogprefetcher.c b/src/backend/access/transam/xlogprefetcher.c
index c235eca..c35cc06 100644
--- a/src/backend/access/transam/xlogprefetcher.c
+++ b/src/backend/access/transam/xlogprefetcher.c
@@ -186,6 +186,9 @@ typedef struct XLogPrefetchStats
 	int			io_depth;		/* Number of I/Os in progress. */
 } XLogPrefetchStats;
 
+static inline void XLogPrefetcherAddRecent(XLogPrefetcher *prefetcher,
+										   RelFileLocator rlocator,
+										   BlockNumber blockno);
 static inline void XLogPrefetcherAddFilter(XLogPrefetcher *prefetcher,
 										   RelFileLocator rlocator,
 										   BlockNumber blockno,
@@ -671,17 +674,24 @@ XLogPrefetcherNextBlock(uintptr_t pgsr_private, XLogRecPtr *lsn)
 
 			/*
 			 * If there is a full page image attached, we won't be reading the
-			 * page, so don't bother trying to prefetch.
+			 * page, so don't bother trying to prefetch.  Record this block
+			 * in the recent window so that later references to the same
+			 * block are also skipped.
 			 */
 			if (block->has_image)
 			{
+				XLogPrefetcherAddRecent(prefetcher, block->rlocator, block->blkno);
 				XLogPrefetchIncrement(&SharedStats->skip_fpw);
 				return LRQ_NEXT_NO_IO;
 			}
 
-			/* There is no point in reading a page that will be zeroed. */
+			/*
+			 * There is no point in reading a page that will be zeroed.
+			 * Record in the recent window like FPW above.
+			 */
 			if (block->flags & BKPBLOCK_WILL_INIT)
 			{
+				XLogPrefetcherAddRecent(prefetcher, block->rlocator, block->blkno);
 				XLogPrefetchIncrement(&SharedStats->skip_init);
 				return LRQ_NEXT_NO_IO;
 			}
@@ -708,10 +718,7 @@ XLogPrefetcherNextBlock(uintptr_t pgsr_private, XLogRecPtr *lsn)
 					return LRQ_NEXT_NO_IO;
 				}
 			}
-			prefetcher->recent_rlocator[prefetcher->recent_idx] = block->rlocator;
-			prefetcher->recent_block[prefetcher->recent_idx] = block->blkno;
-			prefetcher->recent_idx =
-				(prefetcher->recent_idx + 1) % XLOGPREFETCHER_SEQ_WINDOW_SIZE;
+			XLogPrefetcherAddRecent(prefetcher, block->rlocator, block->blkno);
 
 			/*
 			 * We could try to have a fast path for repeated references to the
@@ -850,6 +857,20 @@ pg_stat_get_recovery_prefetch(PG_FUNCTION_ARGS)
 	return (Datum) 0;
 }
 
+/*
+ * Record a block in the recently seen blocks, so that the duplicate-check loop 
+ * can suppress a later prefetch of the same block.
+ */
+static inline void
+XLogPrefetcherAddRecent(XLogPrefetcher *prefetcher, RelFileLocator rlocator,
+						BlockNumber blockno)
+{
+	prefetcher->recent_rlocator[prefetcher->recent_idx] = rlocator;
+	prefetcher->recent_block[prefetcher->recent_idx] = blockno;
+	prefetcher->recent_idx =
+		(prefetcher->recent_idx + 1) % XLOGPREFETCHER_SEQ_WINDOW_SIZE;
+}
+
 /*
  * Don't prefetch any blocks >= 'blockno' from a given 'rlocator', until 'lsn'
  * has been replayed.
@@ -1034,6 +1055,7 @@ XLogPrefetcherReadRecord(XLogPrefetcher *prefetcher, char **errmsg)
 	 * All IO initiated by earlier WAL is now completed.  This might trigger
 	 * further prefetching.
 	 */
+
 	lrq_complete_lsn(prefetcher->streaming_read, replayed_up_to);
 
 	/*
