diff --git a/doc/src/sgml/ref/psql-ref.sgml b/doc/src/sgml/ref/psql-ref.sgml
index d9bce25..ce15a66 100644
--- a/doc/src/sgml/ref/psql-ref.sgml
+++ b/doc/src/sgml/ref/psql-ref.sgml
@@ -3628,6 +3628,13 @@ testdb=&gt; <userinput>INSERT INTO my_table VALUES (:'content');</userinput>
       </varlistentry>
 
       <varlistentry>
+        <term><literal>%r</literal></term>
+        <listitem>
+         <para>Equals <literal>m</literal> if current instance is a master and <literal>r</literal> if it's a replica.</para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
         <term><literal>%R</literal></term>
         <listitem>
         <para>
diff --git a/src/backend/utils/init/miscinit.c b/src/backend/utils/init/miscinit.c
index d4625a6..4436561 100644
--- a/src/backend/utils/init/miscinit.c
+++ b/src/backend/utils/init/miscinit.c
@@ -31,6 +31,7 @@
 #include <utime.h>
 #endif
 
+#include "access/xlog.h"
 #include "access/htup_details.h"
 #include "catalog/pg_authid.h"
 #include "libpq/libpq.h"
@@ -565,7 +566,9 @@ InitializeSessionUserId(const char *rolename, Oid roleid)
 	SetConfigOption("is_superuser",
 					AuthenticatedUserIsSuperuser ? "on" : "off",
 					PGC_INTERNAL, PGC_S_OVERRIDE);
-
+	SetConfigOption("is_master",
+					RecoveryInProgress() ? "off" : "on",
+					PGC_INTERNAL, PGC_S_OVERRIDE);
 	ReleaseSysCache(roleTup);
 }
 
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index 9c93df0..d3eb49a 100644
--- a/src/backend/utils/misc/guc.c
+++ b/src/backend/utils/misc/guc.c
@@ -471,6 +471,7 @@ int			huge_pages;
  */
 static char *syslog_ident_str;
 static bool session_auth_is_superuser;
+static bool session_is_master;
 static double phony_random_seed;
 static char *client_encoding_string;
 static char *datestyle_string;
@@ -900,6 +901,16 @@ static struct config_bool ConfigureNamesBool[] =
 		NULL, NULL, NULL
 	},
 	{
+		{"is_master", PGC_INTERNAL, UNGROUPED,
+			gettext_noop("Shows whether the current instance is master or replica."),
+			NULL,
+			GUC_REPORT | GUC_NO_SHOW_ALL | GUC_NO_RESET_ALL | GUC_NOT_IN_SAMPLE | GUC_DISALLOW_IN_FILE
+		},
+		&session_is_master,
+		false,
+		NULL, NULL, NULL
+	},
+	{
 		{"bonjour", PGC_POSTMASTER, CONN_AUTH_SETTINGS,
 			gettext_noop("Enables advertising the server via Bonjour."),
 			NULL
diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c
index 2450b9c..da667af 100644
--- a/src/bin/psql/common.c
+++ b/src/bin/psql/common.c
@@ -1919,22 +1919,18 @@ is_select_command(const char *query)
 	return false;
 }
 
-
 /*
- * Test if the current user is a database superuser.
- *
- * Note: this will correctly detect superuserness only with a protocol-3.0
- * or newer backend; otherwise it will always say "false".
+ * If given parameter status is "on" returns true, otherwise returns false.
  */
-bool
-is_superuser(void)
+static bool
+internal_get_bool_parameter_status(const char* param_name)
 {
 	const char *val;
 
 	if (!pset.db)
 		return false;
 
-	val = PQparameterStatus(pset.db, "is_superuser");
+	val = PQparameterStatus(pset.db, param_name);
 
 	if (val && strcmp(val, "on") == 0)
 		return true;
@@ -1944,6 +1940,19 @@ is_superuser(void)
 
 
 /*
+ * Test if the current user is a database superuser.
+ *
+ * Note: this will correctly detect superuserness only with a protocol-3.0
+ * or newer backend; otherwise it will always say "false".
+ */
+bool
+is_superuser(void)
+{
+	return internal_get_bool_parameter_status("is_superuser");
+}
+
+
+/*
  * Test if the current session uses standard string literals.
  *
  * Note: With a pre-protocol-3.0 connection this will always say "false",
@@ -1952,19 +1961,17 @@ is_superuser(void)
 bool
 standard_strings(void)
 {
-	const char *val;
-
-	if (!pset.db)
-		return false;
-
-	val = PQparameterStatus(pset.db, "standard_conforming_strings");
-
-	if (val && strcmp(val, "on") == 0)
-		return true;
-
-	return false;
+	return internal_get_bool_parameter_status("standard_conforming_strings");
 }
 
+/*
+ * Test if the current instance is a master.
+ */
+bool
+is_master(void)
+{
+	return internal_get_bool_parameter_status("is_master");
+}
 
 /*
  * Return the session user of the current connection.
diff --git a/src/bin/psql/common.h b/src/bin/psql/common.h
index bdcb58f..5a6635f 100644
--- a/src/bin/psql/common.h
+++ b/src/bin/psql/common.h
@@ -39,6 +39,7 @@ extern int	PSQLexecWatch(const char *query, const printQueryOpt *opt);
 extern bool SendQuery(const char *query);
 
 extern bool is_superuser(void);
+extern bool is_master(void);
 extern bool standard_strings(void);
 extern const char *session_username(void);
 
diff --git a/src/bin/psql/prompt.c b/src/bin/psql/prompt.c
index fb08d67..f648f61 100644
--- a/src/bin/psql/prompt.c
+++ b/src/bin/psql/prompt.c
@@ -256,6 +256,14 @@ get_prompt(promptStatus_t status)
 						buf[0] = '>';
 					break;
 
+				case 'r':
+					if (is_master())
+						buf[0] = 'm';
+					else
+						buf[0] = 'r';
+					break;
+
+
 					/* execute command */
 				case '`':
 					{
