diff --git a/src/test/isolation/isolationtester.c b/src/test/isolation/isolationtester.c
index b1d49c8232015c0ab16229bc488f91725fd1e6ea..822739ec3bb4fcff666dfe3f0f8d89301c7cb9de 100644
--- a/src/test/isolation/isolationtester.c
+++ b/src/test/isolation/isolationtester.c
@@ -35,6 +35,10 @@ static PGconn **conns = NULL;
 static const char **backend_pids = NULL;
 static int	nconns = 0;
 
+/* In dry run only output permutations to be run by the tester. */
+static int	dry_run = false;
+
+static void run_testspec(TestSpec *testspec);
 static void run_all_permutations(TestSpec * testspec);
 static void run_all_permutations_recurse(TestSpec * testspec, int nsteps,
 							 Step ** steps);
@@ -69,20 +73,46 @@ main(int argc, char **argv)
 	int			i;
 	PGresult   *res;
 	PQExpBufferData wait_query;
+	int opt;
+
+	while ((opt = getopt(argc, argv, "n")) != -1)
+	{
+		switch (opt)
+		{
+			case 'n':
+				dry_run = true;
+				break;
+			default:
+				fprintf(stderr, "Usage: isolationtester [-n] [CONNINFO]\n");
+				return EXIT_FAILURE;
+		}
+	}
 
 	/*
-	 * If the user supplies a parameter on the command line, use it as the
-	 * conninfo string; otherwise default to setting dbname=postgres and using
-	 * environment variables or defaults for all other connection parameters.
+	 * If the user supplies a non-option parameter on the command line, use it
+	 * as the conninfo string; otherwise default to setting dbname=postgres and
+	 * using environment variables or defaults for all other connection
+	 * parameters.
 	 */
-	if (argc > 1)
-		conninfo = argv[1];
+	if (argc > optind)
+		conninfo = argv[optind];
 	else
 		conninfo = "dbname = postgres";
 
 	/* Read the test spec from stdin */
 	spec_yyparse();
 	testspec = &parseresult;
+
+	/*
+	 * In dry-run mode, just print the permutations that would be run, and
+	 * exit.
+	 */
+	if (dry_run)
+	{
+		run_testspec(testspec);
+		return 0;
+	}
+
 	printf("Parsed test spec with %d sessions\n", testspec->nsessions);
 
 	/*
@@ -240,10 +270,7 @@ main(int argc, char **argv)
 	 * Run the permutations specified in the spec, or all if none were
 	 * explicitly specified.
 	 */
-	if (testspec->permutations)
-		run_named_permutations(testspec);
-	else
-		run_all_permutations(testspec);
+	run_testspec(testspec);
 
 	/* Clean up and exit */
 	for (i = 0; i < nconns; i++)
@@ -253,6 +280,19 @@ main(int argc, char **argv)
 
 static int *piles;
 
+/*
+ * Run the permutations specified in the spec, or all if none were
+ * explicitly specified.
+ */
+static void
+run_testspec(TestSpec *testspec)
+{
+	if (testspec->permutations)
+		run_named_permutations(testspec);
+	else
+		run_all_permutations(testspec);
+}
+
 /*
  * Run all permutations of the steps and sessions.
  */
@@ -437,6 +477,19 @@ run_permutation(TestSpec * testspec, int nsteps, Step ** steps)
 	int			i;
 	Step	   *waiting = NULL;
 
+	/*
+	 * In dry run mode, just display the permutation in the same format used by
+	 * spec files, and return.
+	 */
+	if (dry_run)
+	{
+		printf("permutation");
+		for (i = 0; i < nsteps; i++)
+			printf(" \"%s\"", steps[i]->name);
+		printf("\n");
+		return;
+	}
+
 	printf("\nstarting permutation:");
 	for (i = 0; i < nsteps; i++)
 		printf(" %s", steps[i]->name);
@@ -649,7 +702,7 @@ try_complete_step(Step *step, int flags)
 				}
 				/* Detail may contain xid values, so just show primary. */
 				step->errormsg = malloc(5 +
-										strlen(PQresultErrorField(res, PG_DIAG_SEVERITY)) + 
+										strlen(PQresultErrorField(res, PG_DIAG_SEVERITY)) +
 										strlen(PQresultErrorField(res,
 																  PG_DIAG_MESSAGE_PRIMARY)));
 				sprintf(step->errormsg, "%s:  %s",