diff --git a/contrib/pageinspect/btreefuncs.c b/contrib/pageinspect/btreefuncs.c
index 4983bbb..257b609 100644
--- a/contrib/pageinspect/btreefuncs.c
+++ b/contrib/pageinspect/btreefuncs.c
@@ -130,7 +130,7 @@ GetBTPageStatistics(BlockNumber blkno, Buffer buffer, BTPageStat *stat)
 
 		ItemId		id = PageGetItemId(page, off);
 
-		itup = (IndexTuple) PageGetItem(page, id);
+		itup = PageGetItemIndex(page, id);
 
 		item_size += IndexTupleSize(itup);
 
@@ -355,7 +355,7 @@ bt_page_items(PG_FUNCTION_ARGS)
 		if (!ItemIdIsValid(id))
 			elog(ERROR, "invalid ItemId");
 
-		itup = (IndexTuple) PageGetItem(uargs->page, id);
+		itup = PageGetItemIndex(uargs->page, id);
 
 		j = 0;
 		values[j++] = psprintf("%d", uargs->offset);
diff --git a/contrib/pageinspect/heapfuncs.c b/contrib/pageinspect/heapfuncs.c
index 904eaef..98d4894 100644
--- a/contrib/pageinspect/heapfuncs.c
+++ b/contrib/pageinspect/heapfuncs.c
@@ -198,7 +198,7 @@ heap_page_items(PG_FUNCTION_ARGS)
 
 			/* Extract information from the tuple header */
 
-			tuphdr = (HeapTupleHeader) PageGetItem(page, id);
+			tuphdr = PageGetItemHeap(page, id);
 
 			values[4] = UInt32GetDatum(HeapTupleHeaderGetRawXmin(tuphdr));
 			values[5] = UInt32GetDatum(HeapTupleHeaderGetRawXmax(tuphdr));
diff --git a/contrib/pg_visibility/pg_visibility.c b/contrib/pg_visibility/pg_visibility.c
index 7034066..ab068e6 100644
--- a/contrib/pg_visibility/pg_visibility.c
+++ b/contrib/pg_visibility/pg_visibility.c
@@ -619,7 +619,7 @@ collect_corrupt_items(Oid relid, bool all_visible, bool all_frozen)
 			}
 
 			/* Initialize a HeapTupleData structure for checks below. */
-			tuple.t_data = (HeapTupleHeader) PageGetItem(page, itemid);
+			tuple.t_data = PageGetItemHeap(page, itemid);
 			tuple.t_len = ItemIdGetLength(itemid);
 			tuple.t_tableOid = relid;
 
diff --git a/contrib/pgstattuple/pgstatapprox.c b/contrib/pgstattuple/pgstatapprox.c
index a49ff54..8dc01e9 100644
--- a/contrib/pgstattuple/pgstatapprox.c
+++ b/contrib/pgstattuple/pgstatapprox.c
@@ -145,7 +145,7 @@ statapprox_heap(Relation rel, output_type *stat)
 
 			ItemPointerSet(&(tuple.t_self), blkno, offnum);
 
-			tuple.t_data = (HeapTupleHeader) PageGetItem(page, itemid);
+			tuple.t_data = PageGetItemHeap(page, itemid);
 			tuple.t_len = ItemIdGetLength(itemid);
 			tuple.t_tableOid = RelationGetRelid(rel);
 
diff --git a/src/backend/access/gin/ginentrypage.c b/src/backend/access/gin/ginentrypage.c
index 8c0bfe9..0ec9c2d 100644
--- a/src/backend/access/gin/ginentrypage.c
+++ b/src/backend/access/gin/ginentrypage.c
@@ -236,7 +236,7 @@ getRightMostTuple(Page page)
 {
 	OffsetNumber maxoff = PageGetMaxOffsetNumber(page);
 
-	return (IndexTuple) PageGetItem(page, PageGetItemId(page, maxoff));
+	return PageGetItemIndex(page, PageGetItemId(page, maxoff));
 }
 
 static bool
@@ -307,7 +307,7 @@ entryLocateEntry(GinBtree btree, GinBtreeStack *stack)
 			Datum		key;
 			GinNullCategory category;
 
-			itup = (IndexTuple) PageGetItem(page, PageGetItemId(page, mid));
+			itup = PageGetItemIndex(page, PageGetItemId(page, mid));
 			attnum = gintuple_get_attrnum(btree->ginstate, itup);
 			key = gintuple_get_key(btree->ginstate, itup, &category);
 			result = ginCompareAttEntries(btree->ginstate,
@@ -332,7 +332,7 @@ entryLocateEntry(GinBtree btree, GinBtreeStack *stack)
 	Assert(high >= FirstOffsetNumber && high <= maxoff);
 
 	stack->off = high;
-	itup = (IndexTuple) PageGetItem(page, PageGetItemId(page, high));
+	itup = PageGetItemIndex(page, PageGetItemId(page, high));
 	Assert(GinGetDownlink(itup) != GIN_ROOT_BLKNO);
 	return GinGetDownlink(itup);
 }
@@ -378,7 +378,7 @@ entryLocateLeafEntry(GinBtree btree, GinBtreeStack *stack)
 		GinNullCategory category;
 		int			result;
 
-		itup = (IndexTuple) PageGetItem(page, PageGetItemId(page, mid));
+		itup = PageGetItemIndex(page, PageGetItemId(page, mid));
 		attnum = gintuple_get_attrnum(btree->ginstate, itup);
 		key = gintuple_get_key(btree->ginstate, itup, &category);
 		result = ginCompareAttEntries(btree->ginstate,
@@ -414,7 +414,7 @@ entryFindChildPtr(GinBtree btree, Page page, BlockNumber blkno, OffsetNumber sto
 	/* if page isn't changed, we returns storedOff */
 	if (storedOff >= FirstOffsetNumber && storedOff <= maxoff)
 	{
-		itup = (IndexTuple) PageGetItem(page, PageGetItemId(page, storedOff));
+		itup = PageGetItemIndex(page, PageGetItemId(page, storedOff));
 		if (GinGetDownlink(itup) == blkno)
 			return storedOff;
 
@@ -424,7 +424,7 @@ entryFindChildPtr(GinBtree btree, Page page, BlockNumber blkno, OffsetNumber sto
 		 */
 		for (i = storedOff + 1; i <= maxoff; i++)
 		{
-			itup = (IndexTuple) PageGetItem(page, PageGetItemId(page, i));
+			itup = PageGetItemIndex(page, PageGetItemId(page, i));
 			if (GinGetDownlink(itup) == blkno)
 				return i;
 		}
@@ -434,7 +434,7 @@ entryFindChildPtr(GinBtree btree, Page page, BlockNumber blkno, OffsetNumber sto
 	/* last chance */
 	for (i = FirstOffsetNumber; i <= maxoff; i++)
 	{
-		itup = (IndexTuple) PageGetItem(page, PageGetItemId(page, i));
+		itup = PageGetItemIndex(page, PageGetItemId(page, i));
 		if (GinGetDownlink(itup) == blkno)
 			return i;
 	}
@@ -451,7 +451,7 @@ entryGetLeftMostPage(GinBtree btree, Page page)
 	Assert(!GinPageIsData(page));
 	Assert(PageGetMaxOffsetNumber(page) >= FirstOffsetNumber);
 
-	itup = (IndexTuple) PageGetItem(page, PageGetItemId(page, FirstOffsetNumber));
+	itup = PageGetItemIndex(page, PageGetItemId(page, FirstOffsetNumber));
 	return GinGetDownlink(itup);
 }
 
@@ -468,7 +468,7 @@ entryIsEnoughSpace(GinBtree btree, Buffer buf, OffsetNumber off,
 
 	if (insertData->isDelete)
 	{
-		IndexTuple	itup = (IndexTuple) PageGetItem(page, PageGetItemId(page, off));
+		IndexTuple	itup = PageGetItemIndex(page, PageGetItemId(page, off));
 
 		releasedsz = MAXALIGN(IndexTupleSize(itup)) + sizeof(ItemIdData);
 	}
@@ -501,7 +501,7 @@ entryPreparePage(GinBtree btree, Page page, OffsetNumber off,
 
 	if (!GinPageIsLeaf(page) && updateblkno != InvalidBlockNumber)
 	{
-		IndexTuple	itup = (IndexTuple) PageGetItem(page, PageGetItemId(page, off));
+		IndexTuple	itup = PageGetItemIndex(page, PageGetItemId(page, off));
 
 		GinSetDownlink(itup, updateblkno);
 	}
@@ -635,7 +635,7 @@ entrySplitPage(GinBtree btree, Buffer origbuf,
 			totalsize += size + sizeof(ItemIdData);
 		}
 
-		itup = (IndexTuple) PageGetItem(lpage, PageGetItemId(lpage, i));
+		itup = PageGetItemIndex(lpage, PageGetItemId(lpage, i));
 		size = MAXALIGN(IndexTupleSize(itup));
 		memcpy(ptr, itup, size);
 		ptr += size;
diff --git a/src/backend/access/gin/ginfast.c b/src/backend/access/gin/ginfast.c
index 59a63f2..42a9c1a 100644
--- a/src/backend/access/gin/ginfast.c
+++ b/src/backend/access/gin/ginfast.c
@@ -671,7 +671,7 @@ processPendingPage(BuildAccumulator *accum, KeyArray *ka,
 
 	for (i = startoff; i <= maxoff; i = OffsetNumberNext(i))
 	{
-		IndexTuple	itup = (IndexTuple) PageGetItem(page, PageGetItemId(page, i));
+		IndexTuple	itup = PageGetItemIndex(page, PageGetItemId(page, i));
 		OffsetNumber curattnum;
 		Datum		curkey;
 		GinNullCategory curcategory;
diff --git a/src/backend/access/gin/ginget.c b/src/backend/access/gin/ginget.c
index 9ed9fd2..296316e 100644
--- a/src/backend/access/gin/ginget.c
+++ b/src/backend/access/gin/ginget.c
@@ -146,7 +146,7 @@ collectMatchBitmap(GinBtreeData *btree, GinBtreeStack *stack,
 
 		page = BufferGetPage(stack->buffer);
 		TestForOldSnapshot(snapshot, btree->index, page);
-		itup = (IndexTuple) PageGetItem(page, PageGetItemId(page, stack->off));
+		itup = PageGetItemIndex(page, PageGetItemId(page, stack->off));
 
 		/*
 		 * If tuple stores another attribute then stop scan
@@ -254,7 +254,7 @@ collectMatchBitmap(GinBtreeData *btree, GinBtreeStack *stack,
 					elog(ERROR, "lost saved point in index");	/* must not happen !!! */
 
 				page = BufferGetPage(stack->buffer);
-				itup = (IndexTuple) PageGetItem(page, PageGetItemId(page, stack->off));
+				itup = PageGetItemIndex(page, PageGetItemId(page, stack->off));
 
 				if (gintuple_get_attrnum(btree->ginstate, itup) != attnum)
 					elog(ERROR, "lost saved point in index");	/* must not happen !!! */
@@ -368,7 +368,7 @@ restartScanEntry:
 	}
 	else if (btreeEntry.findItem(&btreeEntry, stackEntry))
 	{
-		IndexTuple	itup = (IndexTuple) PageGetItem(page, PageGetItemId(page, stackEntry->off));
+		IndexTuple	itup = PageGetItemIndex(page, PageGetItemId(page, stackEntry->off));
 
 		if (GinIsPostingTree(itup))
 		{
@@ -1372,7 +1372,7 @@ scanGetCandidate(IndexScanDesc scan, pendingPosition *pos)
 		}
 		else
 		{
-			itup = (IndexTuple) PageGetItem(page, PageGetItemId(page, pos->firstOffset));
+			itup = PageGetItemIndex(page, PageGetItemId(page, pos->firstOffset));
 			pos->item = itup->t_tid;
 			if (GinPageHasFullRow(page))
 			{
@@ -1381,7 +1381,7 @@ scanGetCandidate(IndexScanDesc scan, pendingPosition *pos)
 				 */
 				for (pos->lastOffset = pos->firstOffset + 1; pos->lastOffset <= maxoff; pos->lastOffset++)
 				{
-					itup = (IndexTuple) PageGetItem(page, PageGetItemId(page, pos->lastOffset));
+					itup = PageGetItemIndex(page, PageGetItemId(page, pos->lastOffset));
 					if (!ItemPointerEquals(&pos->item, &itup->t_tid))
 						break;
 				}
@@ -1432,7 +1432,7 @@ matchPartialInPendingList(GinState *ginstate, Page page,
 
 	while (off < maxoff)
 	{
-		itup = (IndexTuple) PageGetItem(page, PageGetItemId(page, off));
+		itup = PageGetItemIndex(page, PageGetItemId(page, off));
 
 		if (gintuple_get_attrnum(ginstate, itup) != entry->attnum)
 			return false;
@@ -1549,7 +1549,7 @@ collectMatchesForHeapRow(IndexScanDesc scan, pendingPosition *pos)
 
 					StopMiddle = StopLow + ((StopHigh - StopLow) >> 1);
 
-					itup = (IndexTuple) PageGetItem(page, PageGetItemId(page, StopMiddle));
+					itup = PageGetItemIndex(page, PageGetItemId(page, StopMiddle));
 
 					attrnum = gintuple_get_attrnum(&so->ginstate, itup);
 
diff --git a/src/backend/access/gin/gininsert.c b/src/backend/access/gin/gininsert.c
index 9f784bf..4fbe6fa 100644
--- a/src/backend/access/gin/gininsert.c
+++ b/src/backend/access/gin/gininsert.c
@@ -198,7 +198,7 @@ ginEntryInsert(GinState *ginstate,
 	if (btree.findItem(&btree, stack))
 	{
 		/* found pre-existing entry */
-		itup = (IndexTuple) PageGetItem(page, PageGetItemId(page, stack->off));
+		itup = PageGetItemIndex(page, PageGetItemId(page, stack->off));
 
 		if (GinIsPostingTree(itup))
 		{
diff --git a/src/backend/access/gin/ginvacuum.c b/src/backend/access/gin/ginvacuum.c
index c258478..6badf19 100644
--- a/src/backend/access/gin/ginvacuum.c
+++ b/src/backend/access/gin/ginvacuum.c
@@ -418,7 +418,7 @@ ginVacuumEntryPage(GinVacuumState *gvs, Buffer buffer, BlockNumber *roots, uint3
 
 	for (i = FirstOffsetNumber; i <= maxoff; i++)
 	{
-		IndexTuple	itup = (IndexTuple) PageGetItem(tmppage, PageGetItemId(tmppage, i));
+		IndexTuple	itup = PageGetItemIndex(tmppage, PageGetItemId(tmppage, i));
 
 		if (GinIsPostingTree(itup))
 		{
@@ -488,7 +488,7 @@ ginVacuumEntryPage(GinVacuumState *gvs, Buffer buffer, BlockNumber *roots, uint3
 					tmppage = PageGetTempPageCopy(origpage);
 
 					/* set itup pointer to new page */
-					itup = (IndexTuple) PageGetItem(tmppage, PageGetItemId(tmppage, i));
+					itup = PageGetItemIndex(tmppage, PageGetItemId(tmppage, i));
 				}
 
 				attnum = gintuple_get_attrnum(&gvs->ginstate, itup);
@@ -580,7 +580,7 @@ ginbulkdelete(IndexVacuumInfo *info, IndexBulkDeleteResult *stats,
 
 		Assert(PageGetMaxOffsetNumber(page) >= FirstOffsetNumber);
 
-		itup = (IndexTuple) PageGetItem(page, PageGetItemId(page, FirstOffsetNumber));
+		itup = PageGetItemIndex(page, PageGetItemId(page, FirstOffsetNumber));
 		blkno = GinGetDownlink(itup);
 		Assert(blkno != InvalidBlockNumber);
 
diff --git a/src/backend/access/gin/ginxlog.c b/src/backend/access/gin/ginxlog.c
index b4d310f..e4a3d03 100644
--- a/src/backend/access/gin/ginxlog.c
+++ b/src/backend/access/gin/ginxlog.c
@@ -108,7 +108,7 @@ ginRedoInsertEntry(Buffer buffer, bool isLeaf, BlockNumber rightblkno, void *rda
 		/* update link to right page after split */
 		Assert(!GinPageIsLeaf(page));
 		Assert(offset >= FirstOffsetNumber && offset <= PageGetMaxOffsetNumber(page));
-		itup = (IndexTuple) PageGetItem(page, PageGetItemId(page, offset));
+		itup = PageGetItemIndex(page, PageGetItemId(page, offset));
 		GinSetDownlink(itup, rightblkno);
 	}
 
diff --git a/src/backend/access/gist/gist.c b/src/backend/access/gist/gist.c
index e8034b9..e2fe4e7 100644
--- a/src/backend/access/gist/gist.c
+++ b/src/backend/access/gist/gist.c
@@ -670,7 +670,7 @@ gistdoinsert(Relation r, IndexTuple itup, Size freespace, GISTSTATE *giststate)
 
 			downlinkoffnum = gistchoose(state.r, stack->page, itup, giststate);
 			iid = PageGetItemId(stack->page, downlinkoffnum);
-			idxtuple = (IndexTuple) PageGetItem(stack->page, iid);
+			idxtuple = PageGetItemIndex(stack->page, iid);
 			childblkno = ItemPointerGetBlockNumber(&(idxtuple->t_tid));
 
 			/*
@@ -901,7 +901,7 @@ gistFindPath(Relation r, BlockNumber child, OffsetNumber *downlinkoffnum)
 		for (i = FirstOffsetNumber; i <= maxoff; i = OffsetNumberNext(i))
 		{
 			iid = PageGetItemId(page, i);
-			idxtuple = (IndexTuple) PageGetItem(page, iid);
+			idxtuple = PageGetItemIndex(page, iid);
 			blkno = ItemPointerGetBlockNumber(&(idxtuple->t_tid));
 			if (blkno == child)
 			{
@@ -960,7 +960,7 @@ gistFindCorrectParent(Relation r, GISTInsertStack *child)
 			for (i = FirstOffsetNumber; i <= maxoff; i = OffsetNumberNext(i))
 			{
 				iid = PageGetItemId(parent->page, i);
-				idxtuple = (IndexTuple) PageGetItem(parent->page, iid);
+				idxtuple = PageGetItemIndex(parent->page, iid);
 				if (ItemPointerGetBlockNumber(&(idxtuple->t_tid)) == child->blkno)
 				{
 					/* yes!!, found */
@@ -1036,8 +1036,7 @@ gistformdownlink(Relation rel, Buffer buf, GISTSTATE *giststate,
 	maxoff = PageGetMaxOffsetNumber(page);
 	for (offset = FirstOffsetNumber; offset <= maxoff; offset = OffsetNumberNext(offset))
 	{
-		IndexTuple	ituple = (IndexTuple)
-		PageGetItem(page, PageGetItemId(page, offset));
+		IndexTuple	ituple = PageGetItemIndex(page, PageGetItemId(page, offset));
 
 		if (downlink == NULL)
 			downlink = CopyIndexTuple(ituple);
@@ -1069,7 +1068,7 @@ gistformdownlink(Relation rel, Buffer buf, GISTSTATE *giststate,
 		LockBuffer(stack->parent->buffer, GIST_EXCLUSIVE);
 		gistFindCorrectParent(rel, stack);
 		iid = PageGetItemId(stack->parent->page, stack->downlinkoffnum);
-		downlink = (IndexTuple) PageGetItem(stack->parent->page, iid);
+		downlink = PageGetItemIndex(stack->parent->page, iid);
 		downlink = CopyIndexTuple(downlink);
 		LockBuffer(stack->parent->buffer, GIST_UNLOCK);
 	}
diff --git a/src/backend/access/gist/gistbuild.c b/src/backend/access/gist/gistbuild.c
index 4e43a69..e361cd2 100644
--- a/src/backend/access/gist/gistbuild.c
+++ b/src/backend/access/gist/gistbuild.c
@@ -592,7 +592,7 @@ gistProcessItup(GISTBuildState *buildstate, IndexTuple itup,
 		page = (Page) BufferGetPage(buffer);
 		childoffnum = gistchoose(indexrel, page, itup, giststate);
 		iid = PageGetItemId(page, childoffnum);
-		idxtuple = (IndexTuple) PageGetItem(page, iid);
+		idxtuple = PageGetItemIndex(page, iid);
 		childblkno = ItemPointerGetBlockNumber(&(idxtuple->t_tid));
 
 		if (level > 1)
@@ -719,7 +719,7 @@ gistbufferinginserttuples(GISTBuildState *buildstate, Buffer buffer, int level,
 			for (off = FirstOffsetNumber; off <= maxoff; off++)
 			{
 				ItemId		iid = PageGetItemId(page, off);
-				IndexTuple	idxtuple = (IndexTuple) PageGetItem(page, iid);
+				IndexTuple	idxtuple = PageGetItemIndex(page, iid);
 				BlockNumber childblkno = ItemPointerGetBlockNumber(&(idxtuple->t_tid));
 				Buffer		childbuf = ReadBuffer(buildstate->indexrel, childblkno);
 
@@ -876,7 +876,7 @@ gistBufferingFindCorrectParent(GISTBuildState *buildstate,
 		*downlinkoffnum != InvalidOffsetNumber && *downlinkoffnum <= maxoff)
 	{
 		ItemId		iid = PageGetItemId(page, *downlinkoffnum);
-		IndexTuple	idxtuple = (IndexTuple) PageGetItem(page, iid);
+		IndexTuple	idxtuple = PageGetItemIndex(page, iid);
 
 		if (ItemPointerGetBlockNumber(&(idxtuple->t_tid)) == childblkno)
 		{
@@ -895,7 +895,7 @@ gistBufferingFindCorrectParent(GISTBuildState *buildstate,
 	for (off = FirstOffsetNumber; off <= maxoff; off = OffsetNumberNext(off))
 	{
 		ItemId		iid = PageGetItemId(page, off);
-		IndexTuple	idxtuple = (IndexTuple) PageGetItem(page, iid);
+		IndexTuple	idxtuple = PageGetItemIndex(page, iid);
 
 		if (ItemPointerGetBlockNumber(&(idxtuple->t_tid)) == childblkno)
 		{
@@ -1081,7 +1081,7 @@ gistGetMaxLevel(Relation index)
 		 * matter which downlink we choose, the tree has the same depth
 		 * everywhere, so we just pick the first one.
 		 */
-		itup = (IndexTuple) PageGetItem(page,
+		itup = PageGetItemIndex(page,
 									 PageGetItemId(page, FirstOffsetNumber));
 		blkno = ItemPointerGetBlockNumber(&(itup->t_tid));
 		UnlockReleaseBuffer(buffer);
@@ -1175,7 +1175,7 @@ gistMemorizeAllDownlinks(GISTBuildState *buildstate, Buffer parentbuf)
 	for (off = FirstOffsetNumber; off <= maxoff; off++)
 	{
 		ItemId		iid = PageGetItemId(page, off);
-		IndexTuple	idxtuple = (IndexTuple) PageGetItem(page, iid);
+		IndexTuple	idxtuple = PageGetItemIndex(page, iid);
 		BlockNumber childblkno = ItemPointerGetBlockNumber(&(idxtuple->t_tid));
 
 		gistMemorizeParent(buildstate, childblkno, parentblkno);
diff --git a/src/backend/access/gist/gistget.c b/src/backend/access/gist/gistget.c
index 5ba7d0a..d8e5992 100644
--- a/src/backend/access/gist/gistget.c
+++ b/src/backend/access/gist/gistget.c
@@ -404,7 +404,7 @@ gistScanPage(IndexScanDesc scan, GISTSearchItem *pageItem, double *myDistances,
 		if (scan->ignore_killed_tuples && ItemIdIsDead(iid))
 			continue;
 
-		it = (IndexTuple) PageGetItem(page, iid);
+		it = PageGetItemIndex(page, iid);
 
 		/*
 		 * Must call gistindex_keytest in tempCxt, and clean up any leftover
diff --git a/src/backend/access/gist/gistutil.c b/src/backend/access/gist/gistutil.c
index fac166d..dc7cee8 100644
--- a/src/backend/access/gist/gistutil.c
+++ b/src/backend/access/gist/gistutil.c
@@ -62,7 +62,7 @@ gistnospace(Page page, IndexTuple *itvec, int len, OffsetNumber todelete, Size f
 
 	if (todelete != InvalidOffsetNumber)
 	{
-		IndexTuple	itup = (IndexTuple) PageGetItem(page, PageGetItemId(page, todelete));
+		IndexTuple	itup = PageGetItemIndex(page, PageGetItemId(page, todelete));
 
 		deleted = IndexTupleSize(itup) + sizeof(ItemIdData);
 	}
@@ -97,7 +97,7 @@ gistextractpage(Page page, int *len /* out */ )
 	*len = maxoff;
 	itvec = palloc(sizeof(IndexTuple) * maxoff);
 	for (i = FirstOffsetNumber; i <= maxoff; i = OffsetNumberNext(i))
-		itvec[i - FirstOffsetNumber] = (IndexTuple) PageGetItem(page, PageGetItemId(page, i));
+		itvec[i - FirstOffsetNumber] = PageGetItemIndex(page, PageGetItemId(page, i));
 
 	return itvec;
 }
@@ -431,7 +431,7 @@ gistchoose(Relation r, Page p, IndexTuple it,	/* it has compressed entry */
 
 	for (i = FirstOffsetNumber; i <= maxoff; i = OffsetNumberNext(i))
 	{
-		IndexTuple	itup = (IndexTuple) PageGetItem(p, PageGetItemId(p, i));
+		IndexTuple	itup = PageGetItemIndex(p, PageGetItemId(p, i));
 		bool		zero_penalty;
 		int			j;
 
diff --git a/src/backend/access/gist/gistvacuum.c b/src/backend/access/gist/gistvacuum.c
index 53e5cea..3abb570 100644
--- a/src/backend/access/gist/gistvacuum.c
+++ b/src/backend/access/gist/gistvacuum.c
@@ -200,7 +200,7 @@ gistbulkdelete(IndexVacuumInfo *info, IndexBulkDeleteResult *stats,
 			for (i = FirstOffsetNumber; i <= maxoff; i = OffsetNumberNext(i))
 			{
 				iid = PageGetItemId(page, i);
-				idxtuple = (IndexTuple) PageGetItem(page, iid);
+				idxtuple = PageGetItemIndex(page, iid);
 
 				if (callback(&(idxtuple->t_tid), callback_state))
 					todelete[ntodelete++] = i;
@@ -245,7 +245,7 @@ gistbulkdelete(IndexVacuumInfo *info, IndexBulkDeleteResult *stats,
 			for (i = FirstOffsetNumber; i <= maxoff; i = OffsetNumberNext(i))
 			{
 				iid = PageGetItemId(page, i);
-				idxtuple = (IndexTuple) PageGetItem(page, iid);
+				idxtuple = PageGetItemIndex(page, iid);
 
 				ptr = (GistBDItem *) palloc(sizeof(GistBDItem));
 				ptr->blkno = ItemPointerGetBlockNumber(&(idxtuple->t_tid));
diff --git a/src/backend/access/hash/hash.c b/src/backend/access/hash/hash.c
index 30c82e1..6e1583c 100644
--- a/src/backend/access/hash/hash.c
+++ b/src/backend/access/hash/hash.c
@@ -302,7 +302,7 @@ hashgettuple(IndexScanDesc scan, ScanDirection dir)
 		{
 			IndexTuple	itup;
 
-			itup = (IndexTuple) PageGetItem(page, PageGetItemId(page, offnum));
+			itup = PageGetItemIndex(page, PageGetItemId(page, offnum));
 			if (ItemPointerEquals(&(so->hashso_heappos), &(itup->t_tid)))
 				break;
 		}
@@ -588,7 +588,7 @@ loop_top:
 				IndexTuple	itup;
 				ItemPointer htup;
 
-				itup = (IndexTuple) PageGetItem(page,
+				itup = PageGetItemIndex(page,
 												PageGetItemId(page, offno));
 				htup = &(itup->t_tid);
 				if (callback(htup, callback_state))
diff --git a/src/backend/access/hash/hashovfl.c b/src/backend/access/hash/hashovfl.c
index db3e268..1f30b53 100644
--- a/src/backend/access/hash/hashovfl.c
+++ b/src/backend/access/hash/hashovfl.c
@@ -656,7 +656,7 @@ _hash_squeezebucket(Relation rel,
 			IndexTuple	itup;
 			Size		itemsz;
 
-			itup = (IndexTuple) PageGetItem(rpage,
+			itup = PageGetItemIndex(rpage,
 											PageGetItemId(rpage, roffnum));
 			itemsz = IndexTupleDSize(*itup);
 			itemsz = MAXALIGN(itemsz);
diff --git a/src/backend/access/hash/hashpage.c b/src/backend/access/hash/hashpage.c
index 178463f..5c20fcc 100644
--- a/src/backend/access/hash/hashpage.c
+++ b/src/backend/access/hash/hashpage.c
@@ -815,7 +815,7 @@ _hash_splitbucket(Relation rel,
 			 * Fetch the item's hash key (conveniently stored in the item) and
 			 * determine which bucket it now belongs in.
 			 */
-			itup = (IndexTuple) PageGetItem(opage,
+			itup = PageGetItemIndex(opage,
 											PageGetItemId(opage, ooffnum));
 			bucket = _hash_hashkey2bucket(_hash_get_indextuple_hashkey(itup),
 										  maxbucket, highmask, lowmask);
diff --git a/src/backend/access/hash/hashsearch.c b/src/backend/access/hash/hashsearch.c
index 4825558..8d42868 100644
--- a/src/backend/access/hash/hashsearch.c
+++ b/src/backend/access/hash/hashsearch.c
@@ -56,7 +56,7 @@ _hash_next(IndexScanDesc scan, ScanDirection dir)
 	offnum = ItemPointerGetOffsetNumber(current);
 	_hash_checkpage(rel, buf, LH_BUCKET_PAGE | LH_OVERFLOW_PAGE);
 	page = BufferGetPage(buf);
-	itup = (IndexTuple) PageGetItem(page, PageGetItemId(page, offnum));
+	itup = PageGetItemIndex(page, PageGetItemId(page, offnum));
 	so->hashso_heappos = itup->t_tid;
 
 	return true;
@@ -260,7 +260,7 @@ _hash_first(IndexScanDesc scan, ScanDirection dir)
 	offnum = ItemPointerGetOffsetNumber(current);
 	_hash_checkpage(rel, buf, LH_BUCKET_PAGE | LH_OVERFLOW_PAGE);
 	page = BufferGetPage(buf);
-	itup = (IndexTuple) PageGetItem(page, PageGetItemId(page, offnum));
+	itup = PageGetItemIndex(page, PageGetItemId(page, offnum));
 	so->hashso_heappos = itup->t_tid;
 
 	return true;
@@ -337,7 +337,7 @@ _hash_step(IndexScanDesc scan, Buffer *bufP, ScanDirection dir)
 					if (offnum <= maxoff)
 					{
 						Assert(offnum >= FirstOffsetNumber);
-						itup = (IndexTuple) PageGetItem(page, PageGetItemId(page, offnum));
+						itup = PageGetItemIndex(page, PageGetItemId(page, offnum));
 						if (so->hashso_sk_hash == _hash_get_indextuple_hashkey(itup))
 							break;		/* yes, so exit for-loop */
 					}
@@ -378,7 +378,7 @@ _hash_step(IndexScanDesc scan, Buffer *bufP, ScanDirection dir)
 					if (offnum >= FirstOffsetNumber)
 					{
 						Assert(offnum <= maxoff);
-						itup = (IndexTuple) PageGetItem(page, PageGetItemId(page, offnum));
+						itup = PageGetItemIndex(page, PageGetItemId(page, offnum));
 						if (so->hashso_sk_hash == _hash_get_indextuple_hashkey(itup))
 							break;		/* yes, so exit for-loop */
 					}
diff --git a/src/backend/access/hash/hashutil.c b/src/backend/access/hash/hashutil.c
index 822862d..d1811f7 100644
--- a/src/backend/access/hash/hashutil.c
+++ b/src/backend/access/hash/hashutil.c
@@ -304,7 +304,7 @@ _hash_binsearch(Page page, uint32 hash_value)
 		off = (upper + lower) / 2;
 		Assert(OffsetNumberIsValid(off));
 
-		itup = (IndexTuple) PageGetItem(page, PageGetItemId(page, off));
+		itup = PageGetItemIndex(page, PageGetItemId(page, off));
 		hashkey = _hash_get_indextuple_hashkey(itup);
 		if (hashkey < hash_value)
 			lower = off + 1;
@@ -342,7 +342,7 @@ _hash_binsearch_last(Page page, uint32 hash_value)
 		off = (upper + lower + 1) / 2;
 		Assert(OffsetNumberIsValid(off));
 
-		itup = (IndexTuple) PageGetItem(page, PageGetItemId(page, off));
+		itup = PageGetItemIndex(page, PageGetItemId(page, off));
 		hashkey = _hash_get_indextuple_hashkey(itup);
 		if (hashkey > hash_value)
 			upper = off - 1;
diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c
index 38bba16..90a6937 100644
--- a/src/backend/access/heap/heapam.c
+++ b/src/backend/access/heap/heapam.c
@@ -431,7 +431,7 @@ heapgetpage(HeapScanDesc scan, BlockNumber page)
 			bool		valid;
 
 			loctup.t_tableOid = RelationGetRelid(scan->rs_rd);
-			loctup.t_data = (HeapTupleHeader) PageGetItem((Page) dp, lpp);
+			loctup.t_data = PageGetItemHeapHeaderOnly((Page) dp, lpp);
 			loctup.t_len = ItemIdGetLength(lpp);
 			ItemPointerSet(&(loctup.t_self), page, lineoff);
 
@@ -625,7 +625,7 @@ heapgettup(HeapScanDesc scan,
 		lpp = PageGetItemId(dp, lineoff);
 		Assert(ItemIdIsNormal(lpp));
 
-		tuple->t_data = (HeapTupleHeader) PageGetItem((Page) dp, lpp);
+		tuple->t_data = PageGetItemHeap((Page) dp, lpp);
 		tuple->t_len = ItemIdGetLength(lpp);
 
 		return;
@@ -644,7 +644,7 @@ heapgettup(HeapScanDesc scan,
 			{
 				bool		valid;
 
-				tuple->t_data = (HeapTupleHeader) PageGetItem((Page) dp, lpp);
+				tuple->t_data = PageGetItemHeap((Page) dp, lpp);
 				tuple->t_len = ItemIdGetLength(lpp);
 				ItemPointerSet(&(tuple->t_self), page, lineoff);
 
@@ -921,7 +921,7 @@ heapgettup_pagemode(HeapScanDesc scan,
 		lpp = PageGetItemId(dp, lineoff);
 		Assert(ItemIdIsNormal(lpp));
 
-		tuple->t_data = (HeapTupleHeader) PageGetItem((Page) dp, lpp);
+		tuple->t_data = PageGetItemHeap((Page) dp, lpp);
 		tuple->t_len = ItemIdGetLength(lpp);
 
 		/* check that rs_cindex is in sync */
@@ -943,7 +943,7 @@ heapgettup_pagemode(HeapScanDesc scan,
 			lpp = PageGetItemId(dp, lineoff);
 			Assert(ItemIdIsNormal(lpp));
 
-			tuple->t_data = (HeapTupleHeader) PageGetItem((Page) dp, lpp);
+			tuple->t_data = PageGetItemHeap((Page) dp, lpp);
 			tuple->t_len = ItemIdGetLength(lpp);
 			ItemPointerSet(&(tuple->t_self), page, lineoff);
 
@@ -1915,7 +1915,7 @@ heap_fetch(Relation relation,
 	/*
 	 * fill in *tuple fields
 	 */
-	tuple->t_data = (HeapTupleHeader) PageGetItem(page, lp);
+	tuple->t_data = PageGetItemHeap(page, lp);
 	tuple->t_len = ItemIdGetLength(lp);
 	tuple->t_tableOid = RelationGetRelid(relation);
 
@@ -2030,7 +2030,7 @@ heap_hot_search_buffer(ItemPointer tid, Relation relation, Buffer buffer,
 			break;
 		}
 
-		heapTuple->t_data = (HeapTupleHeader) PageGetItem(dp, lp);
+		heapTuple->t_data = PageGetItemHeap(dp, lp);
 		heapTuple->t_len = ItemIdGetLength(lp);
 		heapTuple->t_tableOid = RelationGetRelid(relation);
 		ItemPointerSetOffsetNumber(&heapTuple->t_self, offnum);
@@ -2221,7 +2221,7 @@ heap_get_latest_tid(Relation relation,
 
 		/* OK to access the tuple */
 		tp.t_self = ctid;
-		tp.t_data = (HeapTupleHeader) PageGetItem(page, lp);
+		tp.t_data = PageGetItemHeapHeaderOnly(page, lp);
 		tp.t_len = ItemIdGetLength(lp);
 		tp.t_tableOid = RelationGetRelid(relation);
 
@@ -3048,7 +3048,7 @@ heap_delete(Relation relation, ItemPointer tid,
 	Assert(ItemIdIsNormal(lp));
 
 	tp.t_tableOid = RelationGetRelid(relation);
-	tp.t_data = (HeapTupleHeader) PageGetItem(page, lp);
+	tp.t_data = PageGetItemHeap(page, lp);
 	tp.t_len = ItemIdGetLength(lp);
 	tp.t_self = *tid;
 
@@ -3528,7 +3528,7 @@ heap_update(Relation relation, ItemPointer otid, HeapTuple newtup,
 	 * properly.
 	 */
 	oldtup.t_tableOid = RelationGetRelid(relation);
-	oldtup.t_data = (HeapTupleHeader) PageGetItem(page, lp);
+	oldtup.t_data = PageGetItemHeap(page, lp);
 	oldtup.t_len = ItemIdGetLength(lp);
 	oldtup.t_self = *otid;
 
@@ -4598,7 +4598,7 @@ heap_lock_tuple(Relation relation, HeapTuple tuple,
 	lp = PageGetItemId(page, ItemPointerGetOffsetNumber(tid));
 	Assert(ItemIdIsNormal(lp));
 
-	tuple->t_data = (HeapTupleHeader) PageGetItem(page, lp);
+	tuple->t_data = PageGetItemHeap(page, lp);
 	tuple->t_len = ItemIdGetLength(lp);
 	tuple->t_tableOid = RelationGetRelid(relation);
 
@@ -5960,7 +5960,7 @@ heap_finish_speculative(Relation relation, HeapTuple tuple)
 	if (PageGetMaxOffsetNumber(page) < offnum || !ItemIdIsNormal(lp))
 		elog(ERROR, "invalid lp");
 
-	htup = (HeapTupleHeader) PageGetItem(page, lp);
+	htup = PageGetItemHeapHeaderOnly(page, lp);
 
 	/* SpecTokenOffsetNumber should be distinguishable from any real offset */
 	StaticAssertStmt(MaxOffsetNumber < SpecTokenOffsetNumber,
@@ -6059,7 +6059,7 @@ heap_abort_speculative(Relation relation, HeapTuple tuple)
 	Assert(ItemIdIsNormal(lp));
 
 	tp.t_tableOid = RelationGetRelid(relation);
-	tp.t_data = (HeapTupleHeader) PageGetItem(page, lp);
+	tp.t_data = PageGetItemHeapHeaderOnly(page, lp);
 	tp.t_len = ItemIdGetLength(lp);
 	tp.t_self = *tid;
 
@@ -6201,7 +6201,7 @@ heap_inplace_update(Relation relation, HeapTuple tuple)
 	if (PageGetMaxOffsetNumber(page) < offnum || !ItemIdIsNormal(lp))
 		elog(ERROR, "invalid lp");
 
-	htup = (HeapTupleHeader) PageGetItem(page, lp);
+	htup = PageGetItemHeap(page, lp);
 
 	oldlen = ItemIdGetLength(lp) - htup->t_hoff;
 	newlen = tuple->t_len - tuple->t_data->t_hoff;
@@ -8120,7 +8120,7 @@ heap_xlog_freeze_page(XLogReaderState *record)
 
 			xlrec_tp = &tuples[ntup];
 			lp = PageGetItemId(page, xlrec_tp->offset); /* offsets are one-based */
-			tuple = (HeapTupleHeader) PageGetItem(page, lp);
+			tuple = PageGetItemHeapHeaderOnly(page, lp);
 
 			heap_execute_freeze_tuple(tuple, xlrec_tp);
 		}
@@ -8201,7 +8201,7 @@ heap_xlog_delete(XLogReaderState *record)
 		if (PageGetMaxOffsetNumber(page) < xlrec->offnum || !ItemIdIsNormal(lp))
 			elog(PANIC, "invalid lp");
 
-		htup = (HeapTupleHeader) PageGetItem(page, lp);
+		htup = PageGetItemHeapHeaderOnly(page, lp);
 
 		htup->t_infomask &= ~(HEAP_XMAX_BITS | HEAP_MOVED);
 		htup->t_infomask2 &= ~HEAP_KEYS_UPDATED;
@@ -8567,7 +8567,7 @@ heap_xlog_update(XLogReaderState *record, bool hot_update)
 		if (PageGetMaxOffsetNumber(page) < offnum || !ItemIdIsNormal(lp))
 			elog(PANIC, "invalid lp");
 
-		htup = (HeapTupleHeader) PageGetItem(page, lp);
+		htup = PageGetItemHeap(page, lp);
 
 		oldtup.t_data = htup;
 		oldtup.t_len = ItemIdGetLength(lp);
@@ -8778,7 +8778,7 @@ heap_xlog_confirm(XLogReaderState *record)
 		if (PageGetMaxOffsetNumber(page) < offnum || !ItemIdIsNormal(lp))
 			elog(PANIC, "invalid lp");
 
-		htup = (HeapTupleHeader) PageGetItem(page, lp);
+		htup = PageGetItemHeapHeaderOnly(page, lp);
 
 		/*
 		 * Confirm tuple as actually inserted
@@ -8835,7 +8835,7 @@ heap_xlog_lock(XLogReaderState *record)
 		if (PageGetMaxOffsetNumber(page) < offnum || !ItemIdIsNormal(lp))
 			elog(PANIC, "invalid lp");
 
-		htup = (HeapTupleHeader) PageGetItem(page, lp);
+		htup = PageGetItemHeapHeaderOnly(page, lp);
 
 		htup->t_infomask &= ~(HEAP_XMAX_BITS | HEAP_MOVED);
 		htup->t_infomask2 &= ~HEAP_KEYS_UPDATED;
@@ -8908,7 +8908,7 @@ heap_xlog_lock_updated(XLogReaderState *record)
 		if (PageGetMaxOffsetNumber(page) < offnum || !ItemIdIsNormal(lp))
 			elog(PANIC, "invalid lp");
 
-		htup = (HeapTupleHeader) PageGetItem(page, lp);
+		htup = PageGetItemHeapHeaderOnly(page, lp);
 
 		htup->t_infomask &= ~(HEAP_XMAX_BITS | HEAP_MOVED);
 		htup->t_infomask2 &= ~HEAP_KEYS_UPDATED;
@@ -8949,7 +8949,7 @@ heap_xlog_inplace(XLogReaderState *record)
 		if (PageGetMaxOffsetNumber(page) < offnum || !ItemIdIsNormal(lp))
 			elog(PANIC, "invalid lp");
 
-		htup = (HeapTupleHeader) PageGetItem(page, lp);
+		htup = PageGetItemHeap(page, lp);
 
 		oldlen = ItemIdGetLength(lp) - htup->t_hoff;
 		if (oldlen != newlen)
diff --git a/src/backend/access/heap/hio.c b/src/backend/access/heap/hio.c
index c90fb71..e4ef0e1 100644
--- a/src/backend/access/heap/hio.c
+++ b/src/backend/access/heap/hio.c
@@ -66,10 +66,10 @@ RelationPutHeapTuple(Relation relation,
 	 */
 	if (!token)
 	{
-		ItemId		itemId = PageGetItemId(pageHeader, offnum);
-		Item		item = PageGetItem(pageHeader, itemId);
+		ItemId			itemId = PageGetItemId(pageHeader, offnum);
+		HeapTupleHeader	onpage_tup = PageGetItemHeapHeaderOnly(pageHeader, itemId);
 
-		((HeapTupleHeader) item)->t_ctid = tuple->t_self;
+		onpage_tup->t_ctid = tuple->t_self;
 	}
 }
 
diff --git a/src/backend/access/heap/pruneheap.c b/src/backend/access/heap/pruneheap.c
index 6ff9251..3e07b10 100644
--- a/src/backend/access/heap/pruneheap.c
+++ b/src/backend/access/heap/pruneheap.c
@@ -377,7 +377,7 @@ heap_prune_chain(Relation relation, Buffer buffer, OffsetNumber rootoffnum,
 	 */
 	if (ItemIdIsNormal(rootlp))
 	{
-		htup = (HeapTupleHeader) PageGetItem(dp, rootlp);
+		htup = PageGetItemHeapHeaderOnly(dp, rootlp);
 
 		tup.t_data = htup;
 		tup.t_len = ItemIdGetLength(rootlp);
@@ -464,7 +464,7 @@ heap_prune_chain(Relation relation, Buffer buffer, OffsetNumber rootoffnum,
 			break;
 
 		Assert(ItemIdIsNormal(lp));
-		htup = (HeapTupleHeader) PageGetItem(dp, lp);
+		htup = PageGetItemHeapHeaderOnly(dp, lp);
 
 		tup.t_data = htup;
 		tup.t_len = ItemIdGetLength(lp);
@@ -762,7 +762,7 @@ heap_get_root_tuples(Page page, OffsetNumber *root_offsets)
 
 		if (ItemIdIsNormal(lp))
 		{
-			htup = (HeapTupleHeader) PageGetItem(page, lp);
+			htup = PageGetItemHeapHeaderOnly(page, lp);
 
 			/*
 			 * Check if this tuple is part of a HOT-chain rooted at some other
@@ -811,7 +811,7 @@ heap_get_root_tuples(Page page, OffsetNumber *root_offsets)
 			if (!ItemIdIsNormal(lp))
 				break;
 
-			htup = (HeapTupleHeader) PageGetItem(page, lp);
+			htup = PageGetItemHeapHeaderOnly(page, lp);
 
 			if (TransactionIdIsValid(priorXmax) &&
 				!TransactionIdEquals(priorXmax, HeapTupleHeaderGetXmin(htup)))
diff --git a/src/backend/access/heap/rewriteheap.c b/src/backend/access/heap/rewriteheap.c
index f9ce986..660925e 100644
--- a/src/backend/access/heap/rewriteheap.c
+++ b/src/backend/access/heap/rewriteheap.c
@@ -731,7 +731,7 @@ raw_heap_insert(RewriteState state, HeapTuple tup)
 		HeapTupleHeader onpage_tup;
 
 		newitemid = PageGetItemId(page, newoff);
-		onpage_tup = (HeapTupleHeader) PageGetItem(page, newitemid);
+		onpage_tup = PageGetItemHeapHeaderOnly(page, newitemid);
 
 		onpage_tup->t_ctid = tup->t_self;
 	}
diff --git a/src/backend/access/nbtree/nbtinsert.c b/src/backend/access/nbtree/nbtinsert.c
index ef69290..0005ac3 100644
--- a/src/backend/access/nbtree/nbtinsert.c
+++ b/src/backend/access/nbtree/nbtinsert.c
@@ -305,7 +305,7 @@ _bt_check_unique(Relation rel, IndexTuple itup, Relation heapRel,
 					break;		/* we're past all the equal tuples */
 
 				/* okay, we gotta fetch the heap tuple ... */
-				curitup = (IndexTuple) PageGetItem(page, curitemid);
+				curitup = PageGetItemIndex(page, curitemid);
 				htid = curitup->t_tid;
 
 				/*
@@ -1050,7 +1050,7 @@ _bt_split(Relation rel, Buffer buf, Buffer cbuf, OffsetNumber firstright,
 	{
 		itemid = PageGetItemId(origpage, P_HIKEY);
 		itemsz = ItemIdGetLength(itemid);
-		item = (IndexTuple) PageGetItem(origpage, itemid);
+		item = PageGetItemIndex(origpage, itemid);
 		if (PageAddItem(rightpage, (Item) item, itemsz, rightoff,
 						false, false) == InvalidOffsetNumber)
 		{
@@ -1079,7 +1079,7 @@ _bt_split(Relation rel, Buffer buf, Buffer cbuf, OffsetNumber firstright,
 		/* existing item at firstright will become first on right page */
 		itemid = PageGetItemId(origpage, firstright);
 		itemsz = ItemIdGetLength(itemid);
-		item = (IndexTuple) PageGetItem(origpage, itemid);
+		item = PageGetItemIndex(origpage, itemid);
 	}
 	if (PageAddItem(leftpage, (Item) item, itemsz, leftoff,
 					false, false) == InvalidOffsetNumber)
@@ -1103,7 +1103,7 @@ _bt_split(Relation rel, Buffer buf, Buffer cbuf, OffsetNumber firstright,
 	{
 		itemid = PageGetItemId(origpage, i);
 		itemsz = ItemIdGetLength(itemid);
-		item = (IndexTuple) PageGetItem(origpage, itemid);
+		item = PageGetItemIndex(origpage, itemid);
 
 		/* does new item belong before this one? */
 		if (i == newitemoff)
@@ -1309,7 +1309,7 @@ _bt_split(Relation rel, Buffer buf, Buffer cbuf, OffsetNumber firstright,
 			 * page.
 			 */
 			itemid = PageGetItemId(origpage, P_HIKEY);
-			item = (IndexTuple) PageGetItem(origpage, itemid);
+			item = PageGetItemIndex(origpage, itemid);
 			XLogRegisterBufData(0, (char *) item, MAXALIGN(IndexTupleSize(item)));
 		}
 
@@ -1692,7 +1692,7 @@ _bt_insert_parent(Relation rel,
 		}
 
 		/* get high key from left page == lowest key on new right page */
-		ritem = (IndexTuple) PageGetItem(page,
+		ritem = PageGetItemIndex(page,
 										 PageGetItemId(page, P_HIKEY));
 
 		/* form an index tuple that points at the new right page */
@@ -1860,7 +1860,7 @@ _bt_getstackbuf(Relation rel, BTStack stack, int access)
 				 offnum = OffsetNumberNext(offnum))
 			{
 				itemid = PageGetItemId(page, offnum);
-				item = (IndexTuple) PageGetItem(page, itemid);
+				item = PageGetItemIndex(page, itemid);
 				if (BTEntrySame(item, &stack->bts_btentry))
 				{
 					/* Return accurate pointer to where link is now */
@@ -1875,7 +1875,7 @@ _bt_getstackbuf(Relation rel, BTStack stack, int access)
 				 offnum = OffsetNumberPrev(offnum))
 			{
 				itemid = PageGetItemId(page, offnum);
-				item = (IndexTuple) PageGetItem(page, itemid);
+				item = PageGetItemIndex(page, itemid);
 				if (BTEntrySame(item, &stack->bts_btentry))
 				{
 					/* Return accurate pointer to where link is now */
@@ -1970,7 +1970,7 @@ _bt_newroot(Relation rel, Buffer lbuf, Buffer rbuf)
 	 */
 	itemid = PageGetItemId(lpage, P_HIKEY);
 	right_item_sz = ItemIdGetLength(itemid);
-	item = (IndexTuple) PageGetItem(lpage, itemid);
+	item = PageGetItemIndex(lpage, itemid);
 	right_item = CopyIndexTuple(item);
 	ItemPointerSet(&(right_item->t_tid), rbkno, P_HIKEY);
 
@@ -2128,7 +2128,7 @@ _bt_isequal(TupleDesc itupdesc, Page page, OffsetNumber offnum,
 	/* Better be comparing to a leaf item */
 	Assert(P_ISLEAF((BTPageOpaque) PageGetSpecialPointer(page)));
 
-	itup = (IndexTuple) PageGetItem(page, PageGetItemId(page, offnum));
+	itup = PageGetItemIndex(page, PageGetItemId(page, offnum));
 
 	for (i = 1; i <= keysz; i++)
 	{
diff --git a/src/backend/access/nbtree/nbtpage.c b/src/backend/access/nbtree/nbtpage.c
index 390bd1a..99ad72d 100644
--- a/src/backend/access/nbtree/nbtpage.c
+++ b/src/backend/access/nbtree/nbtpage.c
@@ -1209,7 +1209,7 @@ _bt_pagedel(Relation rel, Buffer buf)
 				BlockNumber leftsib;
 
 				itemid = PageGetItemId(page, P_HIKEY);
-				targetkey = CopyIndexTuple((IndexTuple) PageGetItem(page, itemid));
+				targetkey = CopyIndexTuple(PageGetItemIndex(page, itemid));
 
 				leftsib = opaque->btpo_prev;
 
@@ -1390,13 +1390,13 @@ _bt_mark_page_halfdead(Relation rel, Buffer leafbuf, BTStack stack)
 
 #ifdef USE_ASSERT_CHECKING
 	itemid = PageGetItemId(page, topoff);
-	itup = (IndexTuple) PageGetItem(page, itemid);
+	itup = PageGetItemIndex(page, itemid);
 	Assert(ItemPointerGetBlockNumber(&(itup->t_tid)) == target);
 #endif
 
 	nextoffset = OffsetNumberNext(topoff);
 	itemid = PageGetItemId(page, nextoffset);
-	itup = (IndexTuple) PageGetItem(page, itemid);
+	itup = PageGetItemIndex(page, itemid);
 	if (ItemPointerGetBlockNumber(&(itup->t_tid)) != rightsib)
 		elog(ERROR, "right sibling %u of block %u is not next child %u of block %u in index \"%s\"",
 			 rightsib, target, ItemPointerGetBlockNumber(&(itup->t_tid)),
@@ -1421,7 +1421,7 @@ _bt_mark_page_halfdead(Relation rel, Buffer leafbuf, BTStack stack)
 	opaque = (BTPageOpaque) PageGetSpecialPointer(page);
 
 	itemid = PageGetItemId(page, topoff);
-	itup = (IndexTuple) PageGetItem(page, itemid);
+	itup = PageGetItemIndex(page, itemid);
 	ItemPointerSet(&(itup->t_tid), rightsib, P_HIKEY);
 
 	nextoffset = OffsetNumberNext(topoff);
@@ -1534,7 +1534,7 @@ _bt_unlink_halfdead_page(Relation rel, Buffer leafbuf, bool *rightsib_empty)
 	 * Remember some information about the leaf page.
 	 */
 	itemid = PageGetItemId(page, P_HIKEY);
-	leafhikey = &((IndexTuple) PageGetItem(page, itemid))->t_tid;
+	leafhikey = &(PageGetItemIndex(page, itemid))->t_tid;
 	leafleftsib = opaque->btpo_prev;
 	leafrightsib = opaque->btpo_next;
 
@@ -1650,7 +1650,7 @@ _bt_unlink_halfdead_page(Relation rel, Buffer leafbuf, bool *rightsib_empty)
 
 		/* remember the next non-leaf child down in the branch. */
 		itemid = PageGetItemId(page, P_FIRSTDATAKEY(opaque));
-		nextchild = ItemPointerGetBlockNumber(&((IndexTuple) PageGetItem(page, itemid))->t_tid);
+		nextchild = ItemPointerGetBlockNumber(&(PageGetItemIndex(page, itemid))->t_tid);
 		if (nextchild == leafblkno)
 			nextchild = InvalidBlockNumber;
 	}
diff --git a/src/backend/access/nbtree/nbtree.c b/src/backend/access/nbtree/nbtree.c
index 1f47973..78af1e7 100644
--- a/src/backend/access/nbtree/nbtree.c
+++ b/src/backend/access/nbtree/nbtree.c
@@ -988,7 +988,7 @@ restart:
 				IndexTuple	itup;
 				ItemPointer htup;
 
-				itup = (IndexTuple) PageGetItem(page,
+				itup = PageGetItemIndex(page,
 												PageGetItemId(page, offnum));
 				htup = &(itup->t_tid);
 
diff --git a/src/backend/access/nbtree/nbtsearch.c b/src/backend/access/nbtree/nbtsearch.c
index ee46023..43b563c 100644
--- a/src/backend/access/nbtree/nbtsearch.c
+++ b/src/backend/access/nbtree/nbtsearch.c
@@ -142,7 +142,7 @@ _bt_search(Relation rel, int keysz, ScanKey scankey, bool nextkey,
 		 */
 		offnum = _bt_binsrch(rel, *bufP, keysz, scankey, nextkey);
 		itemid = PageGetItemId(page, offnum);
-		itup = (IndexTuple) PageGetItem(page, itemid);
+		itup = PageGetItemIndex(page, itemid);
 		blkno = ItemPointerGetBlockNumber(&(itup->t_tid));
 		par_blkno = BufferGetBlockNumber(*bufP);
 
@@ -439,7 +439,7 @@ _bt_compare(Relation rel,
 	if (!P_ISLEAF(opaque) && offnum == P_FIRSTDATAKEY(opaque))
 		return 1;
 
-	itup = (IndexTuple) PageGetItem(page, PageGetItemId(page, offnum));
+	itup = PageGetItemIndex(page, PageGetItemId(page, offnum));
 
 	/*
 	 * The scan key is set up with the attribute number associated with each
@@ -1636,7 +1636,7 @@ _bt_get_endpoint(Relation rel, uint32 level, bool rightmost,
 		else
 			offnum = P_FIRSTDATAKEY(opaque);
 
-		itup = (IndexTuple) PageGetItem(page, PageGetItemId(page, offnum));
+		itup = PageGetItemIndex(page, PageGetItemId(page, offnum));
 		blkno = ItemPointerGetBlockNumber(&(itup->t_tid));
 
 		buf = _bt_relandgetbuf(rel, buf, blkno, BT_READ);
diff --git a/src/backend/access/nbtree/nbtsort.c b/src/backend/access/nbtree/nbtsort.c
index 99a014e..82bf6f1 100644
--- a/src/backend/access/nbtree/nbtsort.c
+++ b/src/backend/access/nbtree/nbtsort.c
@@ -526,7 +526,7 @@ _bt_buildadd(BTWriteState *wstate, BTPageState *state, IndexTuple itup)
 		 */
 		Assert(last_off > P_FIRSTKEY);
 		ii = PageGetItemId(opage, last_off);
-		oitup = (IndexTuple) PageGetItem(opage, ii);
+		oitup = PageGetItemIndex(opage, ii);
 		_bt_sortaddtup(npage, ItemIdGetLength(ii), oitup, P_FIRSTKEY);
 
 		/*
diff --git a/src/backend/access/nbtree/nbtutils.c b/src/backend/access/nbtree/nbtutils.c
index 83c553c..c2537d8 100644
--- a/src/backend/access/nbtree/nbtutils.c
+++ b/src/backend/access/nbtree/nbtutils.c
@@ -1402,7 +1402,7 @@ _bt_checkkeys(IndexScanDesc scan,
 	else
 		tuple_alive = true;
 
-	tuple = (IndexTuple) PageGetItem(page, iid);
+	tuple = PageGetItemIndex(page, iid);
 
 	tupdesc = RelationGetDescr(scan->indexRelation);
 	so = (BTScanOpaque) scan->opaque;
@@ -1797,7 +1797,7 @@ _bt_killitems(IndexScanDesc scan)
 		while (offnum <= maxoff)
 		{
 			ItemId		iid = PageGetItemId(page, offnum);
-			IndexTuple	ituple = (IndexTuple) PageGetItem(page, iid);
+			IndexTuple	ituple = PageGetItemIndex(page, iid);
 
 			if (ItemPointerEquals(&ituple->t_tid, &kitem->heapTid))
 			{
diff --git a/src/backend/access/nbtree/nbtxlog.c b/src/backend/access/nbtree/nbtxlog.c
index c536e22..9162cae 100644
--- a/src/backend/access/nbtree/nbtxlog.c
+++ b/src/backend/access/nbtree/nbtxlog.c
@@ -584,7 +584,7 @@ btree_xlog_delete_get_latestRemovedXid(XLogReaderState *record)
 		 * Identify the index tuple about to be deleted
 		 */
 		iitemid = PageGetItemId(ipage, unused[i]);
-		itup = (IndexTuple) PageGetItem(ipage, iitemid);
+		itup = PageGetItemIndex(ipage, iitemid);
 
 		/*
 		 * Locate the heap page that the index tuple points at
@@ -626,7 +626,7 @@ btree_xlog_delete_get_latestRemovedXid(XLogReaderState *record)
 		 */
 		if (ItemIdHasStorage(hitemid))
 		{
-			htuphdr = (HeapTupleHeader) PageGetItem(hpage, hitemid);
+			htuphdr = PageGetItemHeapHeaderOnly(hpage, hitemid);
 
 			HeapTupleHeaderAdvanceLatestRemovedXid(htuphdr, &latestRemovedXid);
 		}
@@ -752,11 +752,11 @@ btree_xlog_mark_page_halfdead(uint8 info, XLogReaderState *record)
 
 		nextoffset = OffsetNumberNext(poffset);
 		itemid = PageGetItemId(page, nextoffset);
-		itup = (IndexTuple) PageGetItem(page, itemid);
+		itup = PageGetItemIndex(page, itemid);
 		rightsib = ItemPointerGetBlockNumber(&itup->t_tid);
 
 		itemid = PageGetItemId(page, poffset);
-		itup = (IndexTuple) PageGetItem(page, itemid);
+		itup = PageGetItemIndex(page, itemid);
 		ItemPointerSet(&(itup->t_tid), rightsib, P_HIKEY);
 		nextoffset = OffsetNumberNext(poffset);
 		PageIndexTupleDelete(page, nextoffset);
diff --git a/src/backend/commands/analyze.c b/src/backend/commands/analyze.c
index 5fcedd7..4e08899 100644
--- a/src/backend/commands/analyze.c
+++ b/src/backend/commands/analyze.c
@@ -1056,7 +1056,7 @@ acquire_sample_rows(Relation onerel, int elevel,
 			ItemPointerSet(&targtuple.t_self, targblock, targoffset);
 
 			targtuple.t_tableOid = RelationGetRelid(onerel);
-			targtuple.t_data = (HeapTupleHeader) PageGetItem(targpage, itemid);
+			targtuple.t_data = PageGetItemHeap(targpage, itemid);
 			targtuple.t_len = ItemIdGetLength(itemid);
 
 			switch (HeapTupleSatisfiesVacuum(&targtuple,
diff --git a/src/backend/commands/sequence.c b/src/backend/commands/sequence.c
index c98f981..c3312d1 100644
--- a/src/backend/commands/sequence.c
+++ b/src/backend/commands/sequence.c
@@ -1126,7 +1126,7 @@ read_seq_tuple(SeqTable elm, Relation rel, Buffer *buf, HeapTuple seqtuple)
 	Assert(ItemIdIsNormal(lp));
 
 	/* Note we currently only bother to set these two fields of *seqtuple */
-	seqtuple->t_data = (HeapTupleHeader) PageGetItem(page, lp);
+	seqtuple->t_data = PageGetItemHeap(page, lp);
 	seqtuple->t_len = ItemIdGetLength(lp);
 
 	/*
diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c
index 99a659a..969a5e9 100644
--- a/src/backend/commands/trigger.c
+++ b/src/backend/commands/trigger.c
@@ -2803,7 +2803,7 @@ ltrmark:;
 
 		Assert(ItemIdIsNormal(lp));
 
-		tuple.t_data = (HeapTupleHeader) PageGetItem(page, lp);
+		tuple.t_data = PageGetItemHeap(page, lp);
 		tuple.t_len = ItemIdGetLength(lp);
 		tuple.t_self = *tid;
 		tuple.t_tableOid = RelationGetRelid(relation);
diff --git a/src/backend/commands/vacuumlazy.c b/src/backend/commands/vacuumlazy.c
index 231e92d..5460bf7 100644
--- a/src/backend/commands/vacuumlazy.c
+++ b/src/backend/commands/vacuumlazy.c
@@ -957,7 +957,7 @@ lazy_scan_heap(Relation onerel, int options, LVRelStats *vacrelstats,
 
 			Assert(ItemIdIsNormal(itemid));
 
-			tuple.t_data = (HeapTupleHeader) PageGetItem(page, itemid);
+			tuple.t_data = PageGetItemHeap(page, itemid);
 			tuple.t_len = ItemIdGetLength(itemid);
 			tuple.t_tableOid = RelationGetRelid(onerel);
 
@@ -991,6 +991,11 @@ lazy_scan_heap(Relation onerel, int options, LVRelStats *vacrelstats,
 					break;
 				case HEAPTUPLE_LIVE:
 					/* Tuple is good --- but let's do some validity checks */
+					/*
+					 * Only this warning doesn't allow to replace PageGetItemHeap with
+					 * PageGetItemHeapHeaderOnly. We don't need any tuple's arguments
+					 * for vacuuming.
+					 */
 					if (onerel->rd_rel->relhasoids &&
 						!OidIsValid(HeapTupleGetOid(&tuple)))
 						elog(WARNING, "relation \"%s\" TID %u/%u: OID is invalid",
@@ -1100,7 +1105,7 @@ lazy_scan_heap(Relation onerel, int options, LVRelStats *vacrelstats,
 				HeapTupleHeader htup;
 
 				itemid = PageGetItemId(page, frozen[i].offset);
-				htup = (HeapTupleHeader) PageGetItem(page, itemid);
+				htup = PageGetItemHeapHeaderOnly(page, itemid);
 
 				heap_execute_freeze_tuple(htup, &frozen[i]);
 			}
@@ -1558,7 +1563,7 @@ lazy_check_needs_freeze(Buffer buf, bool *hastup)
 		if (!ItemIdIsNormal(itemid))
 			continue;
 
-		tupleheader = (HeapTupleHeader) PageGetItem(page, itemid);
+		tupleheader = PageGetItemHeapHeaderOnly(page, itemid);
 
 		if (heap_tuple_needs_freeze(tupleheader, FreezeLimit,
 									MultiXactCutoff, buf))
@@ -2098,7 +2103,7 @@ heap_page_is_all_visible(Relation rel, Buffer buf,
 
 		Assert(ItemIdIsNormal(itemid));
 
-		tuple.t_data = (HeapTupleHeader) PageGetItem(page, itemid);
+		tuple.t_data = PageGetItemHeapHeaderOnly(page, itemid);
 		tuple.t_len = ItemIdGetLength(itemid);
 		tuple.t_tableOid = RelationGetRelid(rel);
 
diff --git a/src/backend/executor/nodeBitmapHeapscan.c b/src/backend/executor/nodeBitmapHeapscan.c
index 449aacb..aa27925 100644
--- a/src/backend/executor/nodeBitmapHeapscan.c
+++ b/src/backend/executor/nodeBitmapHeapscan.c
@@ -261,7 +261,7 @@ BitmapHeapNext(BitmapHeapScanState *node)
 		lp = PageGetItemId(dp, targoffset);
 		Assert(ItemIdIsNormal(lp));
 
-		scan->rs_ctup.t_data = (HeapTupleHeader) PageGetItem((Page) dp, lp);
+		scan->rs_ctup.t_data = PageGetItemHeap((Page) dp, lp);
 		scan->rs_ctup.t_len = ItemIdGetLength(lp);
 		scan->rs_ctup.t_tableOid = scan->rs_rd->rd_id;
 		ItemPointerSet(&scan->rs_ctup.t_self, tbmres->blockno, targoffset);
@@ -388,7 +388,7 @@ bitgetpage(HeapScanDesc scan, TBMIterateResult *tbmres)
 			lp = PageGetItemId(dp, offnum);
 			if (!ItemIdIsNormal(lp))
 				continue;
-			loctup.t_data = (HeapTupleHeader) PageGetItem((Page) dp, lp);
+			loctup.t_data = PageGetItemHeapHeaderOnly((Page) dp, lp);
 			loctup.t_len = ItemIdGetLength(lp);
 			loctup.t_tableOid = scan->rs_rd->rd_id;
 			ItemPointerSet(&loctup.t_self, page, offnum);
diff --git a/src/backend/executor/nodeSamplescan.c b/src/backend/executor/nodeSamplescan.c
index 9ce7c02..33e8b55 100644
--- a/src/backend/executor/nodeSamplescan.c
+++ b/src/backend/executor/nodeSamplescan.c
@@ -461,7 +461,7 @@ tablesample_getnext(SampleScanState *scanstate)
 			if (!ItemIdIsNormal(itemid))
 				continue;
 
-			tuple->t_data = (HeapTupleHeader) PageGetItem(page, itemid);
+			tuple->t_data = PageGetItemHeap(page, itemid);
 			tuple->t_len = ItemIdGetLength(itemid);
 			ItemPointerSet(&(tuple->t_self), blockno, tupoffset);
 
diff --git a/src/include/storage/bufpage.h b/src/include/storage/bufpage.h
index 15cebfc..be6bd28 100644
--- a/src/include/storage/bufpage.h
+++ b/src/include/storage/bufpage.h
@@ -341,6 +341,31 @@ PageValidateSpecialPointer(Page page)
 	(Item)(((char *)(page)) + ItemIdGetOffset(itemId)) \
 )
 
+ /*
+ * Split PageGetItem into set of different macros
+ * in order to make code more readable.
+ */
+#define PageGetItemHeap(page, itemId) \
+( \
+	AssertMacro(PageIsValid(page)), \
+	AssertMacro(ItemIdHasStorage(itemId)), \
+	(HeapTupleHeader)(((char *)(page)) + ItemIdGetOffset(itemId)) \
+)
+
+#define PageGetItemHeapHeaderOnly(page, itemId) \
+( \
+	AssertMacro(PageIsValid(page)), \
+	AssertMacro(ItemIdHasStorage(itemId)), \
+	(HeapTupleHeader)(((char *)(page)) + ItemIdGetOffset(itemId)) \
+)
+
+#define PageGetItemIndex(page, itemId) \
+( \
+	AssertMacro(PageIsValid(page)), \
+	AssertMacro(ItemIdHasStorage(itemId)), \
+	(IndexTuple)(((char *)(page)) + ItemIdGetOffset(itemId)) \
+)
+
 /*
  * PageGetMaxOffsetNumber
  *		Returns the maximum offset number used by the given page.

