diff --git a/contrib/pg_archivecleanup/pg_archivecleanup.c b/contrib/pg_archivecleanup/pg_archivecleanup.c
index 400968ce399c82c318b3ff78c5c47991c8c0c3d1..adfc83dea70eca52beebcd73e53f061161a1b300 100644
--- a/contrib/pg_archivecleanup/pg_archivecleanup.c
+++ b/contrib/pg_archivecleanup/pg_archivecleanup.c
@@ -36,6 +36,7 @@ const char *progname;
 
 /* Options and defaults */
 bool		debug = false;		/* are we debugging? */
+bool		dryrun = false;		/* are we performing a dry-run operation? */
 
 char	   *archiveLocation;	/* where to find the archive? */
 char	   *restartWALFileName; /* the file from which we can restart restore */
@@ -119,6 +120,22 @@ CleanupPriorWALFiles(void)
 			{
 				snprintf(WALFilePath, MAXPGPATH, "%s/%s",
 						 archiveLocation, xlde->d_name);
+
+				if (dryrun)
+				{
+					/*
+					 * Prints the name of the file to be removed and skips the
+					 * actual removal.  The regular printout is so that the
+					 * user can pipe the output into some other program.
+					 */
+					printf("%s\n", WALFilePath);
+					if (debug)
+						fprintf(stderr,
+								"%s: file \"%s\" would be removed\n",
+								progname, WALFilePath);
+					continue;
+				}
+
 				if (debug)
 					fprintf(stderr, "%s: removing file \"%s\"\n",
 							progname, WALFilePath);
@@ -205,6 +222,7 @@ usage(void)
 	printf("  %s [OPTION]... ARCHIVELOCATION OLDESTKEPTWALFILE\n", progname);
 	printf("\nOptions:\n");
 	printf("  -d                 generates debug output (verbose mode)\n");
+	printf("  -n                 shows the names of the files that would have been removed (dry-run)\n");
 	printf("  --help             show this help, then exit\n");
 	printf("  --version          output version information, then exit\n");
 	printf("\n"
@@ -241,13 +259,16 @@ main(int argc, char **argv)
 		}
 	}
 
-	while ((c = getopt(argc, argv, "d")) != -1)
+	while ((c = getopt(argc, argv, "dn")) != -1)
 	{
 		switch (c)
 		{
 			case 'd':			/* Debug mode */
 				debug = true;
 				break;
+			case 'n':			/* Dry-Run mode */
+				dryrun = true;
+				break;
 			default:
 				fprintf(stderr, "Try \"%s --help\" for more information.\n", progname);
 				exit(2);
diff --git a/doc/src/sgml/pgarchivecleanup.sgml b/doc/src/sgml/pgarchivecleanup.sgml
index ddffa321f6368cf52df31bbbe0c5904639a1c10c..8148c53d3a0a591f8912fa0a2180a4df4bc0333d 100644
--- a/doc/src/sgml/pgarchivecleanup.sgml
+++ b/doc/src/sgml/pgarchivecleanup.sgml
@@ -98,6 +98,15 @@ pg_archivecleanup:  removing file "archive/00000001000000370000000E"
       </listitem>
      </varlistentry>
 
+     <varlistentry>
+      <term><option>-n</option></term>
+      <listitem>
+       <para>
+        Print the names of the files that would have been removed on <filename>stdout</> (performs a dry run).
+       </para>
+      </listitem>
+     </varlistentry>
+
     </variablelist>
    </para>