diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c
index 59dc394..f11d4e4 100644
--- a/src/backend/access/transam/parallel.c
+++ b/src/backend/access/transam/parallel.c
@@ -62,6 +62,7 @@
 #define PARALLEL_KEY_ACTIVE_SNAPSHOT		UINT64CONST(0xFFFFFFFFFFFF0007)
 #define PARALLEL_KEY_TRANSACTION_STATE		UINT64CONST(0xFFFFFFFFFFFF0008)
 #define PARALLEL_KEY_EXTENSION_TRAMPOLINE	UINT64CONST(0xFFFFFFFFFFFF0009)
+#define	QUERY_TEXT				UINT64CONST(0xE000000000000010)
 
 /* Fixed-size parallel state. */
 typedef struct FixedParallelState
@@ -208,10 +209,16 @@ InitializeParallelDSM(ParallelContext *pcxt)
 	Size		tstatelen = 0;
 	Size		segsize = 0;
 	int			i;
+	char 		*query_string;
+	char		*query_data;
+	int 		query_len;
 	FixedParallelState *fps;
 	Snapshot	transaction_snapshot = GetTransactionSnapshot();
 	Snapshot	active_snapshot = GetActiveSnapshot();
 
+	query_data = (char *)palloc(strlen(debug_query_string));
+	strcpy(query_data, debug_query_string);
+
 	/* We might be running in a very short-lived memory context. */
 	oldcontext = MemoryContextSwitchTo(TopTransactionContext);
 
@@ -259,6 +266,9 @@ InitializeParallelDSM(ParallelContext *pcxt)
 								   + strlen(pcxt->function_name) + 2);
 			shm_toc_estimate_keys(&pcxt->estimator, 1);
 		}
+		query_len = strlen(query_data) + 1;
+		shm_toc_estimate_chunk(&pcxt->estimator, query_len);
+		shm_toc_estimate_keys(&pcxt->estimator, 1);
 	}
 
 	/*
@@ -303,6 +313,11 @@ InitializeParallelDSM(ParallelContext *pcxt)
 	fps->last_xlog_end = 0;
 	shm_toc_insert(pcxt->toc, PARALLEL_KEY_FIXED, fps);
 
+	/* Store query string */
+	query_string = shm_toc_allocate(pcxt->toc, query_len);
+	memcpy(query_string, query_data, query_len);
+	shm_toc_insert(pcxt->toc, QUERY_TEXT, query_string);
+
 	/* We can skip the rest of this if we're not budgeting for any workers. */
 	if (pcxt->nworkers > 0)
 	{
@@ -1042,6 +1057,7 @@ ParallelWorkerMain(Datum main_arg)
 	/* Restore database connection. */
 	BackgroundWorkerInitializeConnectionByOid(fps->database_id,
 											  fps->authenticated_user_id);
+	pgstat_report_activity(STATE_RUNNING, shm_toc_lookup(toc, QUERY_TEXT));
 
 	/*
 	 * Set the client encoding to the database encoding, since that is what
diff --git a/src/backend/executor/execParallel.c b/src/backend/executor/execParallel.c
index 5aa6f02..fa533d5 100644
--- a/src/backend/executor/execParallel.c
+++ b/src/backend/executor/execParallel.c
@@ -50,6 +50,7 @@
 
 #define PARALLEL_TUPLE_QUEUE_SIZE		65536
 
+#define QUERY_TEXT	UINT64CONST(0xE000000000000010)
 /*
  * DSM structure for accumulating per-PlanState instrumentation.
  *
@@ -607,6 +608,10 @@ ExecParallelGetQueryDesc(shm_toc *toc, DestReceiver *receiver,
 	char	   *paramspace;
 	PlannedStmt *pstmt;
 	ParamListInfo paramLI;
+	char *queryString;
+
+	/* Get the query string from shared memory */
+	queryString = shm_toc_lookup(toc, QUERY_TEXT);
 
 	/* Reconstruct leader-supplied PlannedStmt. */
 	pstmtspace = shm_toc_lookup(toc, PARALLEL_KEY_PLANNEDSTMT);
@@ -625,7 +630,7 @@ ExecParallelGetQueryDesc(shm_toc *toc, DestReceiver *receiver,
 	 * revising this someday.
 	 */
 	return CreateQueryDesc(pstmt,
-						   "<parallel query>",
+						   queryString,
 						   GetActiveSnapshot(), InvalidSnapshot,
 						   receiver, paramLI, instrument_options);
 }
