</listitem>
           </varlistentry>
 
+          <varlistentry id="app-psql-meta-command-pset-display-false">
+          <term><literal>display_false</literal></term>
+          <listitem>
+          <para>
+          Sets the string to be printed in place of a false value.
+          The default is to print <literal>f</literal>.
+          </para>
+          </listitem>
+          </varlistentry>
+
+          <varlistentry id="app-psql-meta-command-pset-display-true">
+          <term><literal>display_true</literal></term>
+          <listitem>
+          <para>
+          Sets the string to be printed in place of a true value.
+          The default is to print <literal>t</literal>.
+          </para>
+          </listitem>
+          </varlistentry>
+
           <varlistentry id="app-psql-meta-command-pset-expanded">
           <term><literal>expanded</literal> (or <literal>x</literal>)</term>
           <listitem>
 
 
            int         i;
            static const char *const my_list[] = {
-               "border", "columns", "csv_fieldsep", "expanded", "fieldsep",
+               "border", "columns", "csv_fieldsep",
+               "display_false", "display_true", "expanded", "fieldsep",
                "fieldsep_zero", "footer", "format", "linestyle", "null",
                "numericlocale", "pager", "pager_min_lines",
                "recordsep", "recordsep_zero",
        }
    }
 
+   /* 'false' display */
+   else if (strcmp(param, "display_false") == 0)
+   {
+       if (value)
+       {
+           free(popt->falsePrint);
+           popt->falsePrint = pg_strdup(value);
+       }
+   }
+
+   /* 'true' display */
+   else if (strcmp(param, "display_true") == 0)
+   {
+       if (value)
+       {
+           free(popt->truePrint);
+           popt->truePrint = pg_strdup(value);
+       }
+   }
+
    /* field separator for unaligned text */
    else if (strcmp(param, "fieldsep") == 0)
    {
               popt->topt.csvFieldSep);
    }
 
+   /* show boolean 'false' display */
+   else if (strcmp(param, "display_false") == 0)
+   {
+       printf(_("Boolean false display is \"%s\".\n"),
+              popt->falsePrint ? popt->falsePrint : "f");
+   }
+
+   /* show boolean 'true' display */
+   else if (strcmp(param, "display_true") == 0)
+   {
+       printf(_("Boolean true display is \"%s\".\n"),
+              popt->truePrint ? popt->truePrint : "t");
+   }
+
    /* show field separator for unaligned text */
    else if (strcmp(param, "fieldsep") == 0)
    {
        return psprintf("%d", popt->topt.columns);
    else if (strcmp(param, "csv_fieldsep") == 0)
        return pset_quoted_string(popt->topt.csvFieldSep);
+   else if (strcmp(param, "display_false") == 0)
+       return pset_quoted_string(popt->falsePrint ? popt->falsePrint : "f");
+   else if (strcmp(param, "display_true") == 0)
+       return pset_quoted_string(popt->truePrint ? popt->truePrint : "t");
    else if (strcmp(param, "expanded") == 0)
        return pstrdup(popt->topt.expanded == 2
                       ? "auto"
 
    HELPN("  \\H                     toggle HTML output mode (currently %s)\n",
          ON(pset.popt.topt.format == PRINT_HTML));
    HELP0("  \\pset [NAME [VALUE]]   set table output option\n"
-         "                         (border|columns|csv_fieldsep|expanded|fieldsep|\n"
-         "                         fieldsep_zero|footer|format|linestyle|null|\n"
-         "                         numericlocale|pager|pager_min_lines|recordsep|\n"
+         "                         (border|columns|csv_fieldsep|display_false|display_true|\n"
+         "                         expanded|fieldsep|fieldsep_zero|footer|format|linestyle|\n"
+         "                         null|numericlocale|pager|pager_min_lines|recordsep|\n"
          "                         recordsep_zero|tableattr|title|tuples_only|\n"
          "                         unicode_border_linestyle|unicode_column_linestyle|\n"
          "                         unicode_header_linestyle|xheader_width)\n");
          "    border style (number)\n");
    HELP0("  columns\n"
          "    target width for the wrapped format\n");
+   HELP0("  display_false\n"
+         "    set the string to be printed in place of a boolean 'false'\n");
+   HELP0("  display_true\n"
+         "    set the string to be printed in place of a boolean 'true'\n");
    HELP0("  expanded (or x)\n"
          "    expanded output [on, off, auto]\n");
    HELPN("  fieldsep\n"
 
    else if (TailMatchesCS("\\password"))
        COMPLETE_WITH_QUERY(Query_for_list_of_roles);
    else if (TailMatchesCS("\\pset"))
-       COMPLETE_WITH_CS("border", "columns", "csv_fieldsep", "expanded",
+       COMPLETE_WITH_CS("border", "columns", "csv_fieldsep",
+                        "display_false", "display_true", "expanded",
                         "fieldsep", "fieldsep_zero", "footer", "format",
                         "linestyle", "null", "numericlocale",
                         "pager", "pager_min_lines",
 
 
            if (PQgetisnull(result, r, c))
                cell = opt->nullPrint ? opt->nullPrint : "";
+           else if (PQftype(result, c) == BOOLOID)
+               cell = (PQgetvalue(result, r, c)[0] == 't' ?
+                       (opt->truePrint ? opt->truePrint : "t") :
+                       (opt->falsePrint ? opt->falsePrint : "f"));
            else
            {
                cell = PQgetvalue(result, r, c);
 
 {
    printTableOpt topt;         /* the options above */
    char       *nullPrint;      /* how to print null entities */
+   char       *truePrint;      /* how to print boolean true values */
+   char       *falsePrint;     /* how to print boolean false values */
    char       *title;          /* override title */
    char      **footers;        /* override footer (default is "(xx rows)") */
    bool        translate_header;   /* do gettext on column headers */
 
 border                   1
 columns                  0
 csv_fieldsep             ','
+display_false            'f'
+display_true             't'
 expanded                 off
 fieldsep                 '|'
 fieldsep_zero            off
 unicode_column_linestyle single
 unicode_header_linestyle single
 xheader_width            full
+-- test the simple display substitution settings
+prepare q as select null as n, true as t, false as f;
+\pset null '(null)'
+\pset display_true 'true'
+\pset display_false 'false'
+execute q;
+   n    |  t   |   f   
+--------+------+-------
+ (null) | true | false
+(1 row)
+
+\pset null
+\pset display_true
+\pset display_false
+execute q;
+   n    |  t   |   f   
+--------+------+-------
+ (null) | true | false
+(1 row)
+
+\pset null ''
+\pset display_true 't'
+\pset display_false 'f'
+execute q;
+ n | t | f 
+---+---+---
+   | t | f
+(1 row)
+
+deallocate q;
 -- test multi-line headers, wrapping, and newline indicators
 -- in aligned, unaligned, and wrapped formats
 prepare q as select array_to_string(array_agg(repeat('x',2*n)),E'\n') as "ab
 
 -- show all pset options
 \pset
 
+-- test the simple display substitution settings
+prepare q as select null as n, true as t, false as f;
+\pset null '(null)'
+\pset display_true 'true'
+\pset display_false 'false'
+execute q;
+\pset null
+\pset display_true
+\pset display_false
+execute q;
+\pset null ''
+\pset display_true 't'
+\pset display_false 'f'
+execute q;
+deallocate q;
+
 -- test multi-line headers, wrapping, and newline indicators
 -- in aligned, unaligned, and wrapped formats
 prepare q as select array_to_string(array_agg(repeat('x',2*n)),E'\n') as "ab