diff --git a/src/bin/scripts/reindexdb.c b/src/bin/scripts/reindexdb.c
index 342e4c9..a36a016 100644
--- a/src/bin/scripts/reindexdb.c
+++ b/src/bin/scripts/reindexdb.c
@@ -18,12 +18,12 @@ static void reindex_one_database(const char *name, const char *dbname,
 					 const char *type, const char *host,
 					 const char *port, const char *username,
 					 enum trivalue prompt_password, const char *progname,
-					 bool echo);
+					 bool echo, bool concurrently);
 static void reindex_all_databases(const char *maintenance_db,
 					  const char *host, const char *port,
 					  const char *username, enum trivalue prompt_password,
 					  const char *progname, bool echo,
-					  bool quiet);
+					  bool quiet, bool concurrently);
 static void reindex_system_catalogs(const char *dbname,
 						const char *host, const char *port,
 						const char *username, enum trivalue prompt_password,
@@ -46,6 +46,7 @@ main(int argc, char *argv[])
 		{"system", no_argument, NULL, 's'},
 		{"table", required_argument, NULL, 't'},
 		{"index", required_argument, NULL, 'i'},
+		{"concurrently", no_argument, NULL, 'c'},
 		{"maintenance-db", required_argument, NULL, 2},
 		{NULL, 0, NULL, 0}
 	};
@@ -64,6 +65,7 @@ main(int argc, char *argv[])
 	bool		alldb = false;
 	bool		echo = false;
 	bool		quiet = false;
+	bool		concurrently = false;
 	SimpleStringList indexes = {NULL, NULL};
 	SimpleStringList tables = {NULL, NULL};
 
@@ -73,7 +75,7 @@ main(int argc, char *argv[])
 	handle_help_version_opts(argc, argv, "reindexdb", help);
 
 	/* process command-line options */
-	while ((c = getopt_long(argc, argv, "h:p:U:wWeqd:ast:i:", long_options, &optindex)) != -1)
+	while ((c = getopt_long(argc, argv, "h:p:U:wWeqd:ast:i:c", long_options, &optindex)) != -1)
 	{
 		switch (c)
 		{
@@ -113,6 +115,9 @@ main(int argc, char *argv[])
 			case 'i':
 				simple_string_list_append(&indexes, optarg);
 				break;
+			case 'c':
+				concurrently = true;
+				break;
 			case 2:
 				maintenance_db = pg_strdup(optarg);
 				break;
@@ -166,7 +171,8 @@ main(int argc, char *argv[])
 		}
 
 		reindex_all_databases(maintenance_db, host, port, username,
-							  prompt_password, progname, echo, quiet);
+							  prompt_password, progname, echo, quiet,
+							  concurrently);
 	}
 	else if (syscatalog)
 	{
@@ -180,6 +186,11 @@ main(int argc, char *argv[])
 			fprintf(stderr, _("%s: cannot reindex specific index(es) and system catalogs at the same time\n"), progname);
 			exit(1);
 		}
+		if (concurrently)
+		{
+			fprintf(stderr, _("%s: cannot reindex concurrently system catalogs\n"), progname);
+			exit(1);
+		}
 
 		if (dbname == NULL)
 		{
@@ -213,7 +224,8 @@ main(int argc, char *argv[])
 			for (cell = indexes.head; cell; cell = cell->next)
 			{
 				reindex_one_database(cell->val, dbname, "INDEX", host, port,
-								  username, prompt_password, progname, echo);
+									 username, prompt_password, progname, echo,
+									 concurrently);
 			}
 		}
 		if (tables.head != NULL)
@@ -223,13 +235,15 @@ main(int argc, char *argv[])
 			for (cell = tables.head; cell; cell = cell->next)
 			{
 				reindex_one_database(cell->val, dbname, "TABLE", host, port,
-								  username, prompt_password, progname, echo);
+									 username, prompt_password, progname, echo,
+									 concurrently);
 			}
 		}
 		/* reindex database only if neither index nor table is specified */
 		if (indexes.head == NULL && tables.head == NULL)
 			reindex_one_database(dbname, dbname, "DATABASE", host, port,
-								 username, prompt_password, progname, echo);
+								 username, prompt_password, progname, echo,
+								 concurrently);
 	}
 
 	exit(0);
@@ -238,7 +252,8 @@ main(int argc, char *argv[])
 static void
 reindex_one_database(const char *name, const char *dbname, const char *type,
 					 const char *host, const char *port, const char *username,
-			  enum trivalue prompt_password, const char *progname, bool echo)
+					 enum trivalue prompt_password, const char *progname, bool echo,
+					 bool concurrently)
 {
 	PQExpBufferData sql;
 
@@ -246,13 +261,12 @@ reindex_one_database(const char *name, const char *dbname, const char *type,
 
 	initPQExpBuffer(&sql);
 
-	appendPQExpBuffer(&sql, "REINDEX");
-	if (strcmp(type, "TABLE") == 0)
-		appendPQExpBuffer(&sql, " TABLE %s", name);
-	else if (strcmp(type, "INDEX") == 0)
-		appendPQExpBuffer(&sql, " INDEX %s", name);
-	else if (strcmp(type, "DATABASE") == 0)
-		appendPQExpBuffer(&sql, " DATABASE %s", fmtId(name));
+	appendPQExpBuffer(&sql, "REINDEX %s", type);
+	if (concurrently)
+		appendPQExpBuffer(&sql, " CONCURRENTLY");
+
+	appendPQExpBuffer(&sql, " %s",
+			strcmp(type, "DATABASE") == 0 ? fmtId(name) : name);
 	appendPQExpBuffer(&sql, ";\n");
 
 	conn = connectDatabase(dbname, host, port, username, prompt_password,
@@ -281,7 +295,8 @@ static void
 reindex_all_databases(const char *maintenance_db,
 					  const char *host, const char *port,
 					  const char *username, enum trivalue prompt_password,
-					  const char *progname, bool echo, bool quiet)
+					  const char *progname, bool echo, bool quiet,
+					  bool concurrently)
 {
 	PGconn	   *conn;
 	PGresult   *result;
@@ -303,7 +318,7 @@ reindex_all_databases(const char *maintenance_db,
 		}
 
 		reindex_one_database(dbname, dbname, "DATABASE", host, port, username,
-							 prompt_password, progname, echo);
+							 prompt_password, progname, echo, concurrently);
 	}
 
 	PQclear(result);
@@ -343,6 +358,7 @@ help(const char *progname)
 	printf(_("  %s [OPTION]... [DBNAME]\n"), progname);
 	printf(_("\nOptions:\n"));
 	printf(_("  -a, --all                 reindex all databases\n"));
+	printf(_("  -c, --concurrently        reindex concurrently\n"));
 	printf(_("  -d, --dbname=DBNAME       database to reindex\n"));
 	printf(_("  -e, --echo                show the commands being sent to the server\n"));
 	printf(_("  -i, --index=INDEX         recreate specific index(es) only\n"));
