diff --git a/src/bin/psql/command.c b/src/bin/psql/command.c
index 441c83c0c57bff391d026c323d7a80093d63a2c3..0788bb8e71a19c2b19638c7af757d8345f66dcc2 100644
--- a/src/bin/psql/command.c
+++ b/src/bin/psql/command.c
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 2000-2009, PostgreSQL Global Development Group
  *
- * $PostgreSQL: pgsql/src/bin/psql/command.c,v 1.200 2009/01/01 17:23:54 momjian Exp $
+ * $PostgreSQL: pgsql/src/bin/psql/command.c,v 1.201 2009/01/06 21:10:30 momjian Exp $
  */
 #include "postgres_fe.h"
 #include "command.h"
@@ -327,13 +327,14 @@ exec_command(const char *cmd,
 	else if (cmd[0] == 'd')
 	{
 		char	   *pattern;
-		bool		show_verbose;
+		bool		show_verbose, show_system;
 
 		/* We don't do SQLID reduction on the pattern yet */
 		pattern = psql_scan_slash_option(scan_state,
 										 OT_NORMAL, NULL, true);
 
 		show_verbose = strchr(cmd, '+') ? true : false;
+		show_system = strchr(cmd, 'S') ? true: false;
 
 		switch (cmd[1])
 		{
@@ -343,28 +344,28 @@ exec_command(const char *cmd,
 					success = describeTableDetails(pattern, show_verbose);
 				else
 					/* standard listing of interesting things */
-					success = listTables("tvs", NULL, show_verbose);
+					success = listTables("tvs", NULL, show_verbose, show_system);
 				break;
 			case 'a':
-				success = describeAggregates(pattern, show_verbose);
+				success = describeAggregates(pattern, show_verbose, show_system);
 				break;
 			case 'b':
 				success = describeTablespaces(pattern, show_verbose);
 				break;
 			case 'c':
-				success = listConversions(pattern);
+				success = listConversions(pattern, show_system);
 				break;
 			case 'C':
 				success = listCasts(pattern);
 				break;
 			case 'd':
-				success = objectDescription(pattern);
+				success = objectDescription(pattern, show_system);
 				break;
 			case 'D':
-				success = listDomains(pattern);
+				success = listDomains(pattern, show_system);
 				break;
 			case 'f':
-				success = describeFunctions(pattern, show_verbose);
+				success = describeFunctions(pattern, show_verbose, show_system);
 				break;
 			case 'g':
 				/* no longer distinct from \du */
@@ -377,20 +378,20 @@ exec_command(const char *cmd,
 				success = listSchemas(pattern, show_verbose);
 				break;
 			case 'o':
-				success = describeOperators(pattern);
+				success = describeOperators(pattern, show_system);
 				break;
 			case 'p':
 				success = permissionsList(pattern);
 				break;
 			case 'T':
-				success = describeTypes(pattern, show_verbose);
+				success = describeTypes(pattern, show_verbose, show_system);
 				break;
 			case 't':
 			case 'v':
 			case 'i':
 			case 's':
 			case 'S':
-				success = listTables(&cmd[1], pattern, show_verbose);
+				success = listTables(&cmd[1], pattern, show_verbose, show_system);
 				break;
 			case 'u':
 				success = describeRoles(pattern, show_verbose);
diff --git a/src/bin/psql/describe.c b/src/bin/psql/describe.c
index 161b582111cb219eba65a9338feb09a2ee1c56c4..3ea75f54c54b658db82eebac01faab71e6a5e0cc 100644
--- a/src/bin/psql/describe.c
+++ b/src/bin/psql/describe.c
@@ -8,7 +8,7 @@
  *
  * Copyright (c) 2000-2009, PostgreSQL Global Development Group
  *
- * $PostgreSQL: pgsql/src/bin/psql/describe.c,v 1.193 2009/01/01 17:23:54 momjian Exp $
+ * $PostgreSQL: pgsql/src/bin/psql/describe.c,v 1.194 2009/01/06 21:10:30 momjian Exp $
  */
 #include "postgres_fe.h"
 
@@ -53,7 +53,7 @@ static void printACLColumn(PQExpBuffer buf, const char *colname);
  * Takes an optional regexp to select particular aggregates
  */
 bool
-describeAggregates(const char *pattern, bool verbose)
+describeAggregates(const char *pattern, bool verbose, bool showSystem)
 {
 	PQExpBufferData buf;
 	PGresult   *res;
@@ -76,7 +76,7 @@ describeAggregates(const char *pattern, bool verbose)
 					  "    ELSE\n"
 					  "    pg_catalog.array_to_string(ARRAY(\n"
 					  "      SELECT\n"
-				 "        pg_catalog.format_type(p.proargtypes[s.i], NULL)\n"
+					  "        pg_catalog.format_type(p.proargtypes[s.i], NULL)\n"
 					  "      FROM\n"
 					  "        pg_catalog.generate_series(0, pg_catalog.array_upper(p.proargtypes, 1)) AS s(i)\n"
 					  "    ), ', ')\n"
@@ -94,6 +94,9 @@ describeAggregates(const char *pattern, bool verbose)
 					  "WHERE p.proisagg\n",
 					  gettext_noop("Description"));
 
+ 	if (!showSystem)
+ 		appendPQExpBuffer(&buf, "      AND n.nspname <> 'pg_catalog'\n");
+
 	processSQLNamePattern(pset.db, &buf, pattern, true, false,
 						  "n.nspname", "p.proname", NULL,
 						  "pg_catalog.pg_function_is_visible(p.oid)");
@@ -182,7 +185,7 @@ describeTablespaces(const char *pattern, bool verbose)
  * Takes an optional regexp to select particular functions
  */
 bool
-describeFunctions(const char *pattern, bool verbose)
+describeFunctions(const char *pattern, bool verbose, bool showSystem)
 {
 	PQExpBufferData buf;
 	PGresult   *res;
@@ -278,6 +281,9 @@ describeFunctions(const char *pattern, bool verbose)
 					  "      AND p.proargtypes[0] IS DISTINCT FROM 'pg_catalog.cstring'::pg_catalog.regtype\n"
 					  "      AND NOT p.proisagg\n");
 
+ 	if (!showSystem)
+ 		appendPQExpBuffer(&buf, "      AND n.nspname <> 'pg_catalog'\n");
+
 	processSQLNamePattern(pset.db, &buf, pattern, true, false,
 						  "n.nspname", "p.proname", NULL,
 						  "pg_catalog.pg_function_is_visible(p.oid)");
@@ -306,7 +312,7 @@ describeFunctions(const char *pattern, bool verbose)
  * describe types
  */
 bool
-describeTypes(const char *pattern, bool verbose)
+describeTypes(const char *pattern, bool verbose, bool showSystem)
 {
 	PQExpBufferData buf;
 	PGresult   *res;
@@ -366,6 +372,9 @@ describeTypes(const char *pattern, bool verbose)
 	else
 		appendPQExpBuffer(&buf, "  AND t.typname !~ '^_'\n");
 
+ 	if (!showSystem)
+ 		appendPQExpBuffer(&buf, "      AND n.nspname <> 'pg_catalog'\n");
+
 	/* Match name pattern against either internal or external name */
 	processSQLNamePattern(pset.db, &buf, pattern, true, false,
 						  "n.nspname", "t.typname",
@@ -393,7 +402,7 @@ describeTypes(const char *pattern, bool verbose)
 /* \do
  */
 bool
-describeOperators(const char *pattern)
+describeOperators(const char *pattern, bool showSystem)
 {
 	PQExpBufferData buf;
 	PGresult   *res;
@@ -418,7 +427,10 @@ describeOperators(const char *pattern)
 					  gettext_noop("Result type"),
 					  gettext_noop("Description"));
 
-	processSQLNamePattern(pset.db, &buf, pattern, false, true,
+ 	if (!showSystem)
+ 		appendPQExpBuffer(&buf, "      AND n.nspname <> 'pg_catalog'\n");
+
+	processSQLNamePattern(pset.db, &buf, pattern, !showSystem, true,
 						  "n.nspname", "o.oprname", NULL,
 						  "pg_catalog.pg_operator_is_visible(o.oid)");
 
@@ -580,7 +592,7 @@ permissionsList(const char *pattern)
  * lists of things, there are other \d? commands.
  */
 bool
-objectDescription(const char *pattern)
+objectDescription(const char *pattern, bool showSystem)
 {
 	PQExpBufferData buf;
 	PGresult   *res;
@@ -607,6 +619,10 @@ objectDescription(const char *pattern)
 	 "       LEFT JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace\n"
 					  "  WHERE p.proisagg\n",
 					  gettext_noop("aggregate"));
+
+ 	if (!showSystem)
+ 		appendPQExpBuffer(&buf, "      AND n.nspname <> 'pg_catalog'\n");
+
 	processSQLNamePattern(pset.db, &buf, pattern, true, false,
 						  "n.nspname", "p.proname", NULL,
 						  "pg_catalog.pg_function_is_visible(p.oid)");
@@ -626,6 +642,10 @@ objectDescription(const char *pattern)
 					  "      OR   p.proargtypes[0] <> 'pg_catalog.cstring'::pg_catalog.regtype)\n"
 					  "      AND NOT p.proisagg\n",
 					  gettext_noop("function"));
+
+ 	if (!showSystem)
+ 		appendPQExpBuffer(&buf, "      AND n.nspname <> 'pg_catalog'\n");
+
 	processSQLNamePattern(pset.db, &buf, pattern, true, false,
 						  "n.nspname", "p.proname", NULL,
 						  "pg_catalog.pg_function_is_visible(p.oid)");
@@ -640,7 +660,11 @@ objectDescription(const char *pattern)
 					  "  FROM pg_catalog.pg_operator o\n"
 	"       LEFT JOIN pg_catalog.pg_namespace n ON n.oid = o.oprnamespace\n",
 					  gettext_noop("operator"));
-	processSQLNamePattern(pset.db, &buf, pattern, false, false,
+
+ 	if (!showSystem)
+ 		appendPQExpBuffer(&buf, "      WHERE n.nspname <> 'pg_catalog'\n");
+ 
+	processSQLNamePattern(pset.db, &buf, pattern, !showSystem, false,
 						  "n.nspname", "o.oprname", NULL,
 						  "pg_catalog.pg_operator_is_visible(o.oid)");
 
@@ -654,7 +678,11 @@ objectDescription(const char *pattern)
 					  "  FROM pg_catalog.pg_type t\n"
 	"       LEFT JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace\n",
 					  gettext_noop("data type"));
-	processSQLNamePattern(pset.db, &buf, pattern, false, false,
+
+ 	if (!showSystem)
+ 		appendPQExpBuffer(&buf, "      WHERE n.nspname <> 'pg_catalog'\n");
+
+	processSQLNamePattern(pset.db, &buf, pattern, !showSystem, false,
 						  "n.nspname", "pg_catalog.format_type(t.oid, NULL)",
 						  NULL,
 						  "pg_catalog.pg_type_is_visible(t.oid)");
@@ -675,6 +703,9 @@ objectDescription(const char *pattern)
 					  gettext_noop("view"),
 					  gettext_noop("index"),
 					  gettext_noop("sequence"));
+ 	if (!showSystem)
+ 		appendPQExpBuffer(&buf, "      AND n.nspname <> 'pg_catalog'\n");
+
 	processSQLNamePattern(pset.db, &buf, pattern, true, false,
 						  "n.nspname", "c.relname", NULL,
 						  "pg_catalog.pg_table_is_visible(c.oid)");
@@ -691,6 +722,10 @@ objectDescription(const char *pattern)
 	 "       LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace\n"
 					  "  WHERE r.rulename != '_RETURN'\n",
 					  gettext_noop("rule"));
+
+ 	if (!showSystem)
+ 		appendPQExpBuffer(&buf, "      AND n.nspname <> 'pg_catalog'\n");
+
 	/* XXX not sure what to do about visibility rule here? */
 	processSQLNamePattern(pset.db, &buf, pattern, true, false,
 						  "n.nspname", "r.rulename", NULL,
@@ -707,8 +742,11 @@ objectDescription(const char *pattern)
 				   "       JOIN pg_catalog.pg_class c ON c.oid = t.tgrelid\n"
 	"       LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace\n",
 					  gettext_noop("trigger"));
+ 	if (!showSystem)
+ 		appendPQExpBuffer(&buf, "      AND n.nspname <> 'pg_catalog'\n");
+
 	/* XXX not sure what to do about visibility rule here? */
-	processSQLNamePattern(pset.db, &buf, pattern, false, false,
+	processSQLNamePattern(pset.db, &buf, pattern, !showSystem, false,
 						  "n.nspname", "t.tgname", NULL,
 						  "pg_catalog.pg_table_is_visible(c.oid)");
 
@@ -1856,13 +1894,12 @@ add_role_attribute(PQExpBuffer buf, const char *const str)
  * (any order of the above is fine)
  */
 bool
-listTables(const char *tabtypes, const char *pattern, bool verbose)
+listTables(const char *tabtypes, const char *pattern, bool verbose, bool showSystem)
 {
 	bool		showTables = strchr(tabtypes, 't') != NULL;
 	bool		showIndexes = strchr(tabtypes, 'i') != NULL;
 	bool		showViews = strchr(tabtypes, 'v') != NULL;
 	bool		showSeq = strchr(tabtypes, 's') != NULL;
-	bool		showSystem = strchr(tabtypes, 'S') != NULL;
 
 	PQExpBufferData buf;
 	PGresult   *res;
@@ -1981,7 +2018,7 @@ listTables(const char *tabtypes, const char *pattern, bool verbose)
  * Describes domains.
  */
 bool
-listDomains(const char *pattern)
+listDomains(const char *pattern, bool showSystem)
 {
 	PQExpBufferData buf;
 	PGresult   *res;
@@ -2009,6 +2046,9 @@ listDomains(const char *pattern)
 					  gettext_noop("Modifier"),
 					  gettext_noop("Check"));
 
+ 	if (!showSystem)
+ 		appendPQExpBuffer(&buf, "      AND n.nspname <> 'pg_catalog'\n");
+
 	processSQLNamePattern(pset.db, &buf, pattern, true, false,
 						  "n.nspname", "t.typname", NULL,
 						  "pg_catalog.pg_type_is_visible(t.oid)");
@@ -2036,7 +2076,7 @@ listDomains(const char *pattern)
  * Describes conversions.
  */
 bool
-listConversions(const char *pattern)
+listConversions(const char *pattern, bool showSystem)
 {
 	PQExpBufferData buf;
 	PGresult   *res;
@@ -2061,6 +2101,9 @@ listConversions(const char *pattern)
 					  gettext_noop("yes"), gettext_noop("no"),
 					  gettext_noop("Default?"));
 
+ 	if (!showSystem)
+ 		appendPQExpBuffer(&buf, "      AND n.nspname <> 'pg_catalog'\n");
+
 	processSQLNamePattern(pset.db, &buf, pattern, true, false,
 						  "n.nspname", "c.conname", NULL,
 						  "pg_catalog.pg_conversion_is_visible(c.oid)");
diff --git a/src/bin/psql/describe.h b/src/bin/psql/describe.h
index ef04e952a00d700c81eff21a21cca3aa01c7e028..e45f7ac56c9a927e95fbf436d31188458c393090 100644
--- a/src/bin/psql/describe.h
+++ b/src/bin/psql/describe.h
@@ -3,26 +3,26 @@
  *
  * Copyright (c) 2000-2009, PostgreSQL Global Development Group
  *
- * $PostgreSQL: pgsql/src/bin/psql/describe.h,v 1.37 2009/01/01 17:23:55 momjian Exp $
+ * $PostgreSQL: pgsql/src/bin/psql/describe.h,v 1.38 2009/01/06 21:10:30 momjian Exp $
  */
 #ifndef DESCRIBE_H
 #define DESCRIBE_H
 
 
 /* \da */
-extern bool describeAggregates(const char *pattern, bool verbose);
+extern bool describeAggregates(const char *pattern, bool verbose, bool showSystem);
 
 /* \db */
 extern bool describeTablespaces(const char *pattern, bool verbose);
 
 /* \df */
-extern bool describeFunctions(const char *pattern, bool verbose);
+extern bool describeFunctions(const char *pattern, bool verbose, bool showSystem);
 
 /* \dT */
-extern bool describeTypes(const char *pattern, bool verbose);
+extern bool describeTypes(const char *pattern, bool verbose, bool showSystem);
 
 /* \do */
-extern bool describeOperators(const char *pattern);
+extern bool describeOperators(const char *pattern, bool showSystem);
 
 /* \du, \dg */
 extern bool describeRoles(const char *pattern, bool verbose);
@@ -31,7 +31,7 @@ extern bool describeRoles(const char *pattern, bool verbose);
 extern bool permissionsList(const char *pattern);
 
 /* \dd */
-extern bool objectDescription(const char *pattern);
+extern bool objectDescription(const char *pattern, bool showSystem);
 
 /* \d foo */
 extern bool describeTableDetails(const char *pattern, bool verbose);
@@ -52,13 +52,13 @@ extern bool listTSTemplates(const char *pattern, bool verbose);
 extern bool listAllDbs(bool verbose);
 
 /* \dt, \di, \ds, \dS, etc. */
-extern bool listTables(const char *tabtypes, const char *pattern, bool verbose);
+extern bool listTables(const char *tabtypes, const char *pattern, bool verbose, bool showSystem);
 
 /* \dD */
-extern bool listDomains(const char *pattern);
+extern bool listDomains(const char *pattern, bool showSystem);
 
 /* \dc */
-extern bool listConversions(const char *pattern);
+extern bool listConversions(const char *pattern, bool showSystem);
 
 /* \dC */
 extern bool listCasts(const char *pattern);
diff --git a/src/bin/psql/help.c b/src/bin/psql/help.c
index 08f559f96e89cb34a7d03706e3450809ab8a19ce..4fa73d195d29abfc1e7f036c99292bf40224fd16 100644
--- a/src/bin/psql/help.c
+++ b/src/bin/psql/help.c
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 2000-2009, PostgreSQL Global Development Group
  *
- * $PostgreSQL: pgsql/src/bin/psql/help.c,v 1.133 2009/01/01 17:23:55 momjian Exp $
+ * $PostgreSQL: pgsql/src/bin/psql/help.c,v 1.134 2009/01/06 21:10:30 momjian Exp $
  */
 #include "postgres_fe.h"
 
@@ -194,32 +194,37 @@ slashUsage(unsigned short int pager)
 	fprintf(output, "\n");
 
 	fprintf(output, _("Informational\n"));
-	fprintf(output, _("  \\d [NAME]      describe table, index, sequence, or view\n"));
-	fprintf(output, _("  \\d{t|i|s|v|S} [PATTERN] (add \"+\" for more detail)\n"
-	"                 list tables/indexes/sequences/views/system tables\n"));
-	fprintf(output, _("  \\da [PATTERN]  list aggregate functions\n"));
-	fprintf(output, _("  \\db [PATTERN]  list tablespaces (add \"+\" for more detail)\n"));
-	fprintf(output, _("  \\dc [PATTERN]  list conversions\n"));
-	fprintf(output, _("  \\dC [PATTERN]  list casts\n"));
-	fprintf(output, _("  \\dd [PATTERN]  show comment for object\n"));
-	fprintf(output, _("  \\dD [PATTERN]  list domains\n"));
-	fprintf(output, _("  \\des [PATTERN] list foreign servers (add \"+\" for more detail)\n"));
-	fprintf(output, _("  \\deu [PATTERN] list user mappings (add \"+\" for more detail)\n"));
-	fprintf(output, _("  \\dew [PATTERN] list foreign-data wrappers (add \"+\" for more detail)\n"));
-	fprintf(output, _("  \\df [PATTERN]  list functions (add \"+\" for more detail)\n"));
-	fprintf(output, _("  \\dF [PATTERN]  list text search configurations (add \"+\" for more detail)\n"));
-	fprintf(output, _("  \\dFd [PATTERN] list text search dictionaries (add \"+\" for more detail)\n"));
-	fprintf(output, _("  \\dFt [PATTERN] list text search templates\n"));
-	fprintf(output, _("  \\dFp [PATTERN] list text search parsers (add \"+\" for more detail)\n"));
-	fprintf(output, _("  \\dg [PATTERN]  list roles (groups)\n"));
-	fprintf(output, _("  \\dn [PATTERN]  list schemas (add \"+\" for more detail)\n"));
-	fprintf(output, _("  \\do [NAME]     list operators\n"));
-	fprintf(output, _("  \\dl            list large objects, same as \\lo_list\n"));
-	fprintf(output, _("  \\dp [PATTERN]  list table, view, and sequence access privileges\n"));
-	fprintf(output, _("  \\dT [PATTERN]  list data types (add \"+\" for more detail)\n"));
-	fprintf(output, _("  \\du [PATTERN]  list roles (users)\n"));
-	fprintf(output, _("  \\l             list all databases (add \"+\" for more detail)\n"));
-	fprintf(output, _("  \\z [PATTERN]   list table, view, and sequence access privileges (same as \\dp)\n"));
+ 	fprintf(output, _("  Modifiers: S = show system objects  + = Additional detail\n"));
+ 	fprintf(output, _("  \\l[+]             list all databases\n"));
+ 	fprintf(output, _("  \\d[S]             list tables, views, and sequences\n"));
+ 	fprintf(output, _("  \\d[S] NAME        describe table, view, sequence, or index\n"));
+ 	fprintf(output, _("  \\dt[S+] [PATTERN] list tables\n"));
+ 	fprintf(output, _("  \\dv[S+] [PATTERN] list views\n"));
+ 	fprintf(output, _("  \\ds[S+] [PATTERN] list sequences\n"));
+ 	fprintf(output, _("  \\di[S+] [PATTERN] list indexes\n"));
+ 	fprintf(output, _("  \\df[S+] [PATTERN] list functions\n"));
+ 	fprintf(output, _("  \\dT[S+] [PATTERN] list data types\n"));
+ 	fprintf(output, _("  \\dd[S] [PATTERN]  list comments on objects\n"));
+ 	fprintf(output, _("  \\dD[S] [PATTERN]  list domains\n"));
+	fprintf(output, _("  \\des[+] [PATTERN] list foreign servers\n"));
+	fprintf(output, _("  \\deu[+] [PATTERN] list user mappings\n"));
+	fprintf(output, _("  \\dew[+] [PATTERN] list foreign-data wrappers\n"));
+ 	fprintf(output, _("  \\do[S] [PATTERN]  list operators\n"));
+ 	fprintf(output, _("  \\da[S] [PATTERN]  list aggregate functions\n"));
+ 	fprintf(output, _("  \\dc[S] [PATTERN]  list conversions\n"));
+ 	fprintf(output, _("  \\db[+] [PATTERN]  list tablespaces\n"));
+ 	fprintf(output, _("  \\dn[+] [PATTERN]  list schemas\n"));
+	fprintf(output, _("  \\dC               list casts\n"));
+	fprintf(output, _("  \\dd [PATTERN]     show comment for object\n"));
+	fprintf(output, _("  \\dF[+] [PATTERN]  list text search configurations\n"));
+	fprintf(output, _("  \\dFd[+] [PATTERN] list text search dictionaries\n"));
+	fprintf(output, _("  \\dFt [PATTERN]    list text search templates\n"));
+	fprintf(output, _("  \\dFp[+] [PATTERN] list text search parsers\n"));
+	fprintf(output, _("  \\dg [PATTERN]     list roles (groups)\n"));
+	fprintf(output, _("  \\dl               list large objects, same as \\lo_list\n"));
+	fprintf(output, _("  \\du [PATTERN]     list roles (users)\n"));
+	fprintf(output, _("  \\dp [PATTERN]     list table, view, and sequence access privileges\n"));
+	fprintf(output, _("  \\z [PATTERN]      same as \\dp\n"));
 	fprintf(output, "\n");
 
 	fprintf(output, _("Formatting\n"));