diff --git a/contrib/pg_upgrade/controldata.c b/contrib/pg_upgrade/controldata.c
new file mode 100644
index cce44ba..9282b8e
*** a/contrib/pg_upgrade/controldata.c
--- b/contrib/pg_upgrade/controldata.c
*************** get_control_data(ClusterInfo *cluster, b
*** 209,224 ****
  		}
  		else if ((p = strstr(bufin, "Latest checkpoint's NextXID:")) != NULL)
  		{
! 			char	   *op = strchr(p, '/');
  
! 			if (op == NULL)
! 				op = strchr(p, ':');
  
! 			if (op == NULL || strlen(op) <= 1)
  				pg_fatal("%d: controldata retrieval problem\n", __LINE__);
  
! 			op++;				/* removing ':' char */
! 			cluster->controldata.chkpnt_nxtxid = str2uint(op);
  			got_xid = true;
  		}
  		else if ((p = strstr(bufin, "Latest checkpoint's NextOID:")) != NULL)
--- 209,228 ----
  		}
  		else if ((p = strstr(bufin, "Latest checkpoint's NextXID:")) != NULL)
  		{
! 			p = strchr(p, ':');
  
! 			if (p == NULL || strlen(p) <= 1)
! 				pg_fatal("%d: controldata retrieval problem\n", __LINE__);
  
! 			p++;				/* removing ':' char */
! 			cluster->controldata.chkpnt_nxtepoch = str2uint(p);
! 
! 			p = strchr(p, '/');
! 			if (p == NULL || strlen(p) <= 1)
  				pg_fatal("%d: controldata retrieval problem\n", __LINE__);
  
! 			p++;				/* removing '/' char */
! 			cluster->controldata.chkpnt_nxtxid = str2uint(p);
  			got_xid = true;
  		}
  		else if ((p = strstr(bufin, "Latest checkpoint's NextOID:")) != NULL)
diff --git a/contrib/pg_upgrade/pg_upgrade.c b/contrib/pg_upgrade/pg_upgrade.c
new file mode 100644
index b6f370f..3b8241b
*** a/contrib/pg_upgrade/pg_upgrade.c
--- b/contrib/pg_upgrade/pg_upgrade.c
*************** copy_clog_xlog_xid(void)
*** 420,431 ****
  	/* copy old commit logs to new data dir */
  	copy_subdir_files("pg_clog");
  
! 	/* set the next transaction id of the new cluster */
! 	prep_status("Setting next transaction ID for new cluster");
  	exec_prog(UTILITY_LOG_FILE, NULL, true,
  			  "\"%s/pg_resetxlog\" -f -x %u \"%s\"",
  			  new_cluster.bindir, old_cluster.controldata.chkpnt_nxtxid,
  			  new_cluster.pgdata);
  	check_ok();
  
  	/*
--- 420,435 ----
  	/* copy old commit logs to new data dir */
  	copy_subdir_files("pg_clog");
  
! 	/* set the next transaction id and epoch of the new cluster */
! 	prep_status("Setting next transaction ID and epoch for new cluster");
  	exec_prog(UTILITY_LOG_FILE, NULL, true,
  			  "\"%s/pg_resetxlog\" -f -x %u \"%s\"",
  			  new_cluster.bindir, old_cluster.controldata.chkpnt_nxtxid,
  			  new_cluster.pgdata);
+ 	exec_prog(UTILITY_LOG_FILE, NULL, true,
+ 			  "\"%s/pg_resetxlog\" -f -e %u \"%s\"",
+ 			  new_cluster.bindir, old_cluster.controldata.chkpnt_nxtepoch,
+ 			  new_cluster.pgdata);
  	check_ok();
  
  	/*
diff --git a/contrib/pg_upgrade/pg_upgrade.h b/contrib/pg_upgrade/pg_upgrade.h
new file mode 100644
index 4b8facf..1ac3394
*** a/contrib/pg_upgrade/pg_upgrade.h
--- b/contrib/pg_upgrade/pg_upgrade.h
*************** typedef struct
*** 190,195 ****
--- 190,196 ----
  	char		nextxlogfile[25];
  	uint32		chkpnt_tli;
  	uint32		chkpnt_nxtxid;
+ 	uint32		chkpnt_nxtepoch;
  	uint32		chkpnt_nxtoid;
  	uint32		chkpnt_nxtmulti;
  	uint32		chkpnt_nxtmxoff;
