diff --git a/channels/chan_dahdi.c b/channels/chan_dahdi.c
index c8391c2047aabc23882ea0532d352f8c65bebd29..26a2d010035c0b3cc922846f047f6ac343ccd028 100644
--- a/channels/chan_dahdi.c
+++ b/channels/chan_dahdi.c
@@ -252,6 +252,19 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
 		<description>
 		</description>
 	</manager>
+	<manager name="PRIShowSpans" language="en_US">
+		<synopsis>
+			Show status of PRI spans.
+		</synopsis>
+		<syntax>
+			<xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
+			<parameter name="Span">
+				<para>Specify the specific span to show.  Show all spans if zero or not present.</para>
+			</parameter>
+		</syntax>
+		<description>
+		</description>
+	</manager>
  ***/
 
 #define SMDI_MD_WAIT_TIMEOUT 1500 /* 1.5 seconds */
@@ -15874,6 +15887,60 @@ static int action_dahdishowchannels(struct mansession *s, const struct message *
 	return 0;
 }
 
+#if defined(HAVE_PRI)
+static int action_prishowspans(struct mansession *s, const struct message *m)
+{
+	int count;
+	int idx;
+	int span_query;
+	struct dahdi_pri *dspan;
+	const char *id = astman_get_header(m, "ActionID");
+	const char *span_str = astman_get_header(m, "Span");
+	char action_id[256];
+	const char *show_cmd = "PRIShowSpans";
+
+	/* NOTE: Asking for span 0 gets all spans. */
+	if (!ast_strlen_zero(span_str)) {
+		span_query = atoi(span_str);
+	} else {
+		span_query = 0;
+	}
+
+	if (!ast_strlen_zero(id)) {
+		snprintf(action_id, sizeof(action_id), "ActionID: %s\r\n", id);
+	} else {
+		action_id[0] = '\0';
+	}
+
+	astman_send_ack(s, m, "Span status will follow");
+
+	count = 0;
+	for (idx = 0; idx < ARRAY_LEN(pris); ++idx) {
+		dspan = &pris[idx];
+
+		/* If a specific span is asked for, only deliver status for that span. */
+		if (0 < span_query && dspan->pri.span != span_query) {
+			continue;
+		}
+
+		if (dspan->pri.pri) {
+			count += sig_pri_ami_show_spans(s, show_cmd, &dspan->pri, dspan->dchannels,
+				action_id);
+		}
+	}
+
+	astman_append(s,
+		"Event: %sComplete\r\n"
+		"Items: %d\r\n"
+		"%s"
+		"\r\n",
+		show_cmd,
+		count,
+		action_id);
+	return 0;
+}
+#endif	/* defined(HAVE_PRI) */
+
 #if defined(HAVE_SS7)
 static int linkset_addsigchan(int sigchan)
 {
@@ -16449,6 +16516,9 @@ static int __unload_module(void)
 	ast_manager_unregister("DAHDIDNDon");
 	ast_manager_unregister("DAHDIShowChannels");
 	ast_manager_unregister("DAHDIRestart");
+#if defined(HAVE_PRI)
+	ast_manager_unregister("PRIShowSpans");
+#endif	/* defined(HAVE_PRI) */
 	ast_data_unregister(NULL);
 	ast_channel_unregister(&dahdi_tech);
 
@@ -18431,6 +18501,9 @@ static int load_module(void)
 	ast_manager_register_xml("DAHDIDNDoff", 0, action_dahdidndoff);
 	ast_manager_register_xml("DAHDIShowChannels", 0, action_dahdishowchannels);
 	ast_manager_register_xml("DAHDIRestart", 0, action_dahdirestart);
+#if defined(HAVE_PRI)
+	ast_manager_register_xml("PRIShowSpans", 0, action_prishowspans);
+#endif	/* defined(HAVE_PRI) */
 
 	ast_cond_init(&ss_thread_complete, NULL);
 
diff --git a/channels/sig_pri.c b/channels/sig_pri.c
index 49fb246bedc4c918b217e41138dfd7672a9388f2..c032bf2de262dafe41873585507981ee0aa9c5ea 100644
--- a/channels/sig_pri.c
+++ b/channels/sig_pri.c
@@ -7040,6 +7040,52 @@ static void *pri_dchannel(void *vpri)
 	return NULL;
 }
 
+/*!
+ * \brief Output AMI show spans response events for the given PRI span.
+ * \since 1.10
+ *
+ * \param show_cmd AMI command name
+ * \param s AMI session to output span information.
+ * \param pri PRI span control structure.
+ * \param dchannels Array of D channel channel numbers.
+ * \param action_id Action ID line to use.
+ *
+ * \return Number of D channels on this span.
+ */
+int sig_pri_ami_show_spans(struct mansession *s, const char *show_cmd, struct sig_pri_span *pri, const int *dchannels, const char *action_id)
+{
+	int count;
+	int x;
+
+	count = 0;
+	for (x = 0; x < ARRAY_LEN(pri->dchans); ++x) {
+		if (pri->dchans[x]) {
+			++count;
+
+			astman_append(s,
+				"Event: %s\r\n"
+				"Span: %d\r\n"
+				"DChannel: %d\r\n"
+				"Order: %s\r\n"
+				"Active: %s\r\n"
+				"Alarm: %s\r\n"
+				"Up: %s\r\n"
+				"%s"
+				"\r\n",
+				show_cmd,
+				pri->span,
+				dchannels[x],
+				pri_order(x),
+				(pri->dchans[x] == pri->pri) ? "Yes" : "No",
+				(pri->dchanavail[x] & DCHAN_NOTINALARM) ? "No" : "Yes",
+				(pri->dchanavail[x] & DCHAN_UP) ? "Yes" : "No",
+				action_id
+				);
+		}
+	}
+	return count;
+}
+
 void sig_pri_init_pri(struct sig_pri_span *pri)
 {
 	int i;
diff --git a/channels/sig_pri.h b/channels/sig_pri.h
index f2eef03d66e01cf2a89042f97d9f73fd3507daf7..9b4f56e68eb8b6f0d4c739cf4fce2bf240f5b9f9 100644
--- a/channels/sig_pri.h
+++ b/channels/sig_pri.h
@@ -615,6 +615,9 @@ void sig_pri_chan_delete(struct sig_pri_chan *doomed);
 
 int pri_is_up(struct sig_pri_span *pri);
 
+struct mansession;
+int sig_pri_ami_show_spans(struct mansession *s, const char *show_cmd, struct sig_pri_span *pri, const int *dchannels, const char *action_id);
+
 void sig_pri_cli_show_channels_header(int fd);
 void sig_pri_cli_show_channels(int fd, struct sig_pri_span *pri);
 void sig_pri_cli_show_spans(int fd, int span, struct sig_pri_span *pri);