diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c
new file mode 100644
index bcf9871..c8edd67
*** a/src/backend/access/heap/heapam.c
--- b/src/backend/access/heap/heapam.c
*************** heap_insert(Relation relation, HeapTuple
*** 2189,2195 ****
  	RelationPutHeapTuple(relation, buffer, heaptup,
  						 (options & HEAP_INSERT_SPECULATIVE) != 0);
  
! 	if (PageIsAllVisible(BufferGetPage(buffer)))
  	{
  		all_visible_cleared = true;
  		PageClearAllVisible(BufferGetPage(buffer));
--- 2189,2195 ----
  	RelationPutHeapTuple(relation, buffer, heaptup,
  						 (options & HEAP_INSERT_SPECULATIVE) != 0);
  
! 	if (PageIsAllVisible(BufferGetPage(buffer)) && !(options & HEAP_INSERT_FROZEN))
  	{
  		all_visible_cleared = true;
  		PageClearAllVisible(BufferGetPage(buffer));
*************** heap_multi_insert(Relation relation, Hea
*** 2490,2496 ****
  				log_heap_new_cid(relation, heaptup);
  		}
  
! 		if (PageIsAllVisible(page))
  		{
  			all_visible_cleared = true;
  			PageClearAllVisible(page);
--- 2490,2496 ----
  				log_heap_new_cid(relation, heaptup);
  		}
  
! 		if (PageIsAllVisible(BufferGetPage(buffer)) && !(options & HEAP_INSERT_FROZEN))
  		{
  			all_visible_cleared = true;
  			PageClearAllVisible(page);
diff --git a/src/backend/access/heap/hio.c b/src/backend/access/heap/hio.c
new file mode 100644
index 6db73bf..8b3c43e
*** a/src/backend/access/heap/hio.c
--- b/src/backend/access/heap/hio.c
*************** RelationGetBufferForTuple(Relation relat
*** 486,491 ****
--- 486,498 ----
  
  	PageInit(page, BufferGetPageSize(buffer), 0);
  
+ 	/*
+ 	 * If the tuple intended for the new page will be frozen upon insertion,
+ 	 * mark the page is all visible ab initio.
+ 	 */
+ 	if (options & HEAP_INSERT_FROZEN)
+ 		PageSetAllVisible(page);
+ 
  	if (len > PageGetHeapFreeSpace(page))
  	{
  		/* We should not get here given the test at the top */
