diff --git a/src/backend/commands/vacuumlazy.c b/src/backend/commands/vacuumlazy.c
index a01cfb4..ac44df2 100644
--- a/src/backend/commands/vacuumlazy.c
+++ b/src/backend/commands/vacuumlazy.c
@@ -105,6 +105,8 @@ typedef struct LVRelStats
 	BlockNumber old_rel_pages;	/* previous value of pg_class.relpages */
 	BlockNumber rel_pages;		/* total number of pages */
 	BlockNumber scanned_pages;	/* number of pages we examined */
+	BlockIdData last_scanned_page; /* Used for measuring index scan progress */
+	BlockNumber current_index_scanned_page_count;
 	BlockNumber pinskipped_pages;		/* # of pages we skipped due to a pin */
 	double		scanned_tuples; /* counts only tuples on scanned pages */
 	double		old_rel_tuples; /* previous value of pg_class.reltuples */
@@ -119,6 +121,8 @@ typedef struct LVRelStats
 	int			max_dead_tuples;	/* # slots allocated in array */
 	ItemPointer dead_tuples;	/* array of ItemPointerData */
 	int			num_index_scans;
+	int			total_num_indexes;
+	int			current_scanned_index;
 	TransactionId latestRemovedXid;
 	bool		lock_waiter_detected;
 } LVRelStats;
@@ -595,12 +599,16 @@ lazy_scan_heap(Relation onerel, LVRelStats *vacrelstats,
 
 			/* Log cleanup info before we touch indexes */
 			vacuum_log_cleanup_info(onerel, vacrelstats);
+			vacrelstats->total_num_indexes=nindexes;
 
 			/* Remove index entries */
 			for (i = 0; i < nindexes; i++)
+			{
+				vacrelstats->current_scanned_index = i;
 				lazy_vacuum_index(Irel[i],
 								  &indstats[i],
 								  vacrelstats);
+			}
 			/* Remove tuples from heap */
 			lazy_vacuum_heap(onerel, vacrelstats);
 
@@ -1092,12 +1100,16 @@ lazy_scan_heap(Relation onerel, LVRelStats *vacrelstats,
 	{
 		/* Log cleanup info before we touch indexes */
 		vacuum_log_cleanup_info(onerel, vacrelstats);
+		vacrelstats->total_num_indexes=nindexes;
 
 		/* Remove index entries */
 		for (i = 0; i < nindexes; i++)
+		{
+			vacrelstats->current_scanned_index = i;
 			lazy_vacuum_index(Irel[i],
 							  &indstats[i],
 							  vacrelstats);
+		}
 		/* Remove tuples from heap */
 		lazy_vacuum_heap(onerel, vacrelstats);
 		vacrelstats->num_index_scans++;
@@ -1364,6 +1376,7 @@ lazy_vacuum_index(Relation indrel,
 	ivinfo.strategy = vac_strategy;
 
 	/* Do bulk deletion */
+	vacrelstats->current_index_scanned_page_count = 0;
 	*stats = index_bulk_delete(&ivinfo, *stats,
 							   lazy_tid_reaped, (void *) vacrelstats);
 
@@ -1736,7 +1749,22 @@ lazy_tid_reaped(ItemPointer itemptr, void *state)
 {
 	LVRelStats *vacrelstats = (LVRelStats *) state;
 	ItemPointer res;
-
+	BlockNumber current_count;
+	float current_index_progress = 0;
+	float all_index_progress = 0;
+	if (((itemptr->ip_blkid.bi_hi != vacrelstats->last_scanned_page.bi_hi) || (itemptr->ip_blkid.bi_lo != vacrelstats->last_scanned_page.bi_lo)) && (vacrelstats->current_index_scanned_page_count < vacrelstats->scanned_pages))
+	{
+		vacrelstats->last_scanned_page = itemptr->ip_blkid;
+		vacrelstats->current_index_scanned_page_count = vacrelstats->current_index_scanned_page_count ++;
+		current_count = vacrelstats->current_index_scanned_page_count;
+		current_index_progress = ((float)current_count/(float)vacrelstats->scanned_pages) * 100;
+		all_index_progress = ((vacrelstats->current_scanned_index + current_index_progress)/vacrelstats->total_num_indexes) * 100;
+		elog(WARNING, "Current index percentage completion = %f, Overall index percentage completion = %f",current_index_progress, all_index_progress);
+	}
+	else
+	{
+		vacrelstats->last_scanned_page=itemptr->ip_blkid;
+	}
 	res = (ItemPointer) bsearch((void *) itemptr,
 								(void *) vacrelstats->dead_tuples,
 								vacrelstats->num_dead_tuples,
