diff --git a/src/backend/access/gist/gist.c b/src/backend/access/gist/gist.c
index 4edc5a75f2836c14f79d78155162646bfb5d5cd3..53bccf6d185b37c44a2fdd00d0b946e1817d1e95 100644
--- a/src/backend/access/gist/gist.c
+++ b/src/backend/access/gist/gist.c
@@ -466,6 +466,11 @@ gistplacetopage(Relation rel, Size freespace, GISTSTATE *giststate,
 		 */
 		START_CRIT_SECTION();
 
+		/*
+		 * While we delete only one tuple at once we could mix calls
+		 * PageIndexTupleDelete() here and PageIndexMultiDelete() in
+		 * gistRedoPageUpdateRecord()
+		 */
 		if (OffsetNumberIsValid(oldoffnum))
 			PageIndexTupleDelete(page, oldoffnum);
 		gistfillbuffer(page, itup, ntup, InvalidOffsetNumber);
diff --git a/src/backend/access/gist/gistvacuum.c b/src/backend/access/gist/gistvacuum.c
index 2337dbd7f9d71e6fd51bdf94643dae67c2e1ea8d..a0b0eebed3dbf704cc0dcfe23c42542a96ada245 100644
--- a/src/backend/access/gist/gistvacuum.c
+++ b/src/backend/access/gist/gistvacuum.c
@@ -208,23 +208,20 @@ gistbulkdelete(PG_FUNCTION_ARGS)
 				idxtuple = (IndexTuple) PageGetItem(page, iid);
 
 				if (callback(&(idxtuple->t_tid), callback_state))
-				{
-					todelete[ntodelete] = i - ntodelete;
-					ntodelete++;
-					stats->tuples_removed += 1;
-				}
+					todelete[ntodelete++] = i;
 				else
 					stats->num_index_tuples += 1;
 			}
 
+			stats->tuples_removed += ntodelete;
+
 			if (ntodelete)
 			{
 				START_CRIT_SECTION();
 
 				MarkBufferDirty(buffer);
 
-				for (i = 0; i < ntodelete; i++)
-					PageIndexTupleDelete(page, todelete[i]);
+				PageIndexMultiDelete(page, todelete, ntodelete);
 				GistMarkTuplesDeleted(page);
 
 				if (RelationNeedsWAL(rel))
diff --git a/src/backend/access/gist/gistxlog.c b/src/backend/access/gist/gistxlog.c
index fbdbb3c51f2e7fc7e40c918bffe063537836233e..c63cc8190c4d3722eb9451076d546b1886512c21 100644
--- a/src/backend/access/gist/gistxlog.c
+++ b/src/backend/access/gist/gistxlog.c
@@ -83,13 +83,11 @@ gistRedoPageUpdateRecord(XLogReaderState *record)
 		/* Delete old tuples */
 		if (xldata->ntodelete > 0)
 		{
-			int			i;
 			OffsetNumber *todelete = (OffsetNumber *) data;
 
 			data += sizeof(OffsetNumber) * xldata->ntodelete;
 
-			for (i = 0; i < xldata->ntodelete; i++)
-				PageIndexTupleDelete(page, todelete[i]);
+			PageIndexMultiDelete(page, todelete, xldata->ntodelete);
 			if (GistPageIsLeaf(page))
 				GistMarkTuplesDeleted(page);
 		}
diff --git a/src/include/access/xlog_internal.h b/src/include/access/xlog_internal.h
index 5ebaa5f69c6aa42fdd78e923f21be8eaef69d5d1..590bf1729ae358fe1b42c416112e7778d490124c 100644
--- a/src/include/access/xlog_internal.h
+++ b/src/include/access/xlog_internal.h
@@ -31,7 +31,7 @@
 /*
  * Each page of XLOG file has a header like this:
  */
-#define XLOG_PAGE_MAGIC 0xD085	/* can be used as WAL version indicator */
+#define XLOG_PAGE_MAGIC 0xD086	/* can be used as WAL version indicator */
 
 typedef struct XLogPageHeaderData
 {