diff --git a/contrib/pg_upgrade/check.c b/contrib/pg_upgrade/check.c
index fdec6e34af166362f5553b21f0356e0ef4468db0..376d25a09a8825a5d22a8a9b314558b3523d0cc5 100644
--- a/contrib/pg_upgrade/check.c
+++ b/contrib/pg_upgrade/check.c
@@ -16,6 +16,7 @@ static void check_old_cluster_has_new_cluster_dbs(void);
 static void check_locale_and_encoding(ControlData *oldctrl,
 						  ControlData *newctrl);
 static void check_is_super_user(ClusterInfo *cluster);
+static void check_for_prepared_transactions(ClusterInfo *cluster);
 static void check_for_isn_and_int8_passing_mismatch(ClusterInfo *cluster);
 static void check_for_reg_data_type_usage(ClusterInfo *cluster);
 
@@ -65,6 +66,7 @@ check_old_cluster(bool live_check,
 	 * Check for various failure cases
 	 */
 	check_is_super_user(&old_cluster);
+	check_for_prepared_transactions(&old_cluster);
 	check_for_reg_data_type_usage(&old_cluster);
 	check_for_isn_and_int8_passing_mismatch(&old_cluster);
 
@@ -117,6 +119,7 @@ check_new_cluster(void)
 	get_db_and_rel_infos(&new_cluster);
 
 	check_new_cluster_is_empty();
+	check_for_prepared_transactions(&new_cluster);
 	check_old_cluster_has_new_cluster_dbs();
 
 	check_loadable_libraries();
@@ -506,6 +509,36 @@ check_is_super_user(ClusterInfo *cluster)
 }
 
 
+/*
+ *	check_for_prepared_transactions()
+ *
+ *	Make sure there are no prepared transactions because the storage format
+ *	might have changed.
+ */
+static void
+check_for_prepared_transactions(ClusterInfo *cluster)
+{
+	PGresult   *res;
+	PGconn	   *conn = connectToServer(cluster, "template1");
+
+	prep_status("Checking for prepared transactions");
+
+	res = executeQueryOrDie(conn,
+							"SELECT * "
+							"FROM pg_catalog.pg_prepared_xact()");
+
+	if (PQntuples(res) != 0)
+		pg_log(PG_FATAL, "The %s cluster contains prepared transactions\n",
+			   CLUSTER_NAME(cluster));
+
+	PQclear(res);
+
+	PQfinish(conn);
+
+	check_ok();
+}
+
+
 /*
  *	check_for_isn_and_int8_passing_mismatch()
  *