diff --git a/docs/en_US/images/preferences_sql_formatting.png b/docs/en_US/images/preferences_sql_formatting.png
new file mode 100644
index 0000000000000000000000000000000000000000..7d85cfcf8ec36249f4de80cd4734193136f8ea3b
GIT binary patch
diff --git a/docs/en_US/images/preferences_sql_options.png b/docs/en_US/images/preferences_sql_options.png
index abc16f8989de90435b0f6ad6700b32925db152ac..6ce45de47980ad80c72d1866f61ca831e137cddc 100644
GIT binary patch
diff --git a/docs/en_US/preferences.rst b/docs/en_US/preferences.rst
index 587025963..e9f1c8f31 100644
--- a/docs/en_US/preferences.rst
+++ b/docs/en_US/preferences.rst
@@ -306,12 +306,6 @@ Use the fields on the *Editor* panel to change settings of the query editor.
   changed to text/plain. Keyword highlighting and code folding will be disabled.
   This will improve editor performance with large files.
 
-* Use the *Tab size* field to specify the number of spaces per tab character in
-  the editor.
-
-* When the *Use spaces* switch is set to *True*, the editor will insert spaces
-  (instead of tab characters) when the tab key or auto-indent are used.
-
 .. image:: images/preferences_sql_explain.png
     :alt: Preferences dialog sqleditor explain options
     :align: center
@@ -375,13 +369,41 @@ preferences for copied data.
 * Use the *Result copy quoting* drop-down listbox to select which type of fields
   require quoting; select *All*, *None*, or *Strings*.
 
+.. image:: images/preferences_sql_keyboard_shortcuts.png
+    :alt: Preferences dialog sql keyboard shortcuts section
+    :align: center
+
 Use the fields on the *Keyboard shortcuts* panel to configure shortcuts for the
 Query Tool window navigation:
 
-.. image:: images/preferences_sql_keyboard_shortcuts.png
-    :alt: Preferences dialog sql keyboard shortcuts section
+.. image:: images/preferences_sql_formatting.png
+    :alt: Preferences dialog SQL Formatting section
     :align: center
 
+Use the fields on the *SQL formatting* panel to specify your preferences for
+reformatting of SQL.
+
+* Use the *Command-first notation* option to specify whether to place commas
+  before or after column names.
+* Use the *Identifier case* option to specify whether to change identifiers
+  (object names) into upper, lower, or capitalized case.
+* Use the *Keyword case* option to specify whether to change keywords into
+  upper, lower, or capitalized case.
+* Use the *Re-indent aligned?* option to specify that indentations of statements
+  should be changed, aligned by keywords.
+* Use the *Re-indent?* option to specify that indentations of statements should
+  be changed.
+* Use the *Spaces around operators?* option to specify whether or not to include
+  spaces on either side of operators.
+* Use the *Strip comments?* option to specify whether or not comments should be
+  removed.
+* Use the *Tab size* option to specify the number of spaces per tab or indent.
+* Use the *Use spaces?* option to select whether to use spaces or tabs when
+  indenting.
+* Use the *Wrap after N characters* option to specify the column limit for
+  wrapping column separated lists (e.g. of column names in a table). If set to
+  0 (zero), each item will be on it's own line.
+
 The Schema Diff Node
 ********************
 
diff --git a/docs/en_US/query_tool_toolbar.rst b/docs/en_US/query_tool_toolbar.rst
index 75f992716..63cbd3a6f 100644
--- a/docs/en_US/query_tool_toolbar.rst
+++ b/docs/en_US/query_tool_toolbar.rst
@@ -1,184 +1,186 @@
-.. _query_tool_toolbar:
-
-***************************
-`Query Tool Toolbar`:index:
-***************************
-
-The *Query Tool* toolbar uses context-sensitive icons that provide shortcuts to
-frequently performed tasks. If an icon is highlighted, the option is enabled;
-if the icon is grayed-out, the task is disabled.
-
-.. note:: The :ref:`Query Tool <query_tool>` and
-    :ref:`View/Edit Data <editgrid>` tools are actually different operating
-    modes of the same tool. Some controls will be disabled in either mode.
-
-.. image:: images/query_toolbar.png
-    :alt: Query tool toolbar
-    :align: center
-
-Hover over an icon in pgAdmin to display a tooltip that describes the icon's
-functionality.
-
-File Options
-************
-
-.. table::
-   :class: longtable
-   :widths: 1 4 1
-
-   +----------------------+---------------------------------------------------------------------------------------------------+----------------+
-   | Icon                 | Behavior                                                                                          | Shortcut       |
-   +======================+===================================================================================================+================+
-   | *Open File*          | Click the *Open File* icon to display a previously saved query in the SQL Editor.                 | Accesskey + O  |
-   +----------------------+---------------------------------------------------------------------------------------------------+----------------+
-   | *Save File*          | Click the *Save* icon to perform a quick-save of a previously saved query, or to access the       | Accesskey + S  |
-   |                      | *Save* menu:                                                                                      |                |
-   |                      |                                                                                                   |                |
-   |                      |  * Select *Save* to save the selected content of the SQL Editor panel in a  file.                 |                |
-   |                      |                                                                                                   |                |
-   |                      |  * Select *Save As* to open a new browser dialog and specify a new location to which to save the  |                |
-   |                      |    selected content of the SQL Editor panel.                                                      |                |
-   +----------------------+---------------------------------------------------------------------------------------------------+----------------+
-
-Editing Options
-***************
-
-.. table::
-   :class: longtable
-   :widths: 1 4 1
-
-   +----------------------+---------------------------------------------------------------------------------------------------+----------------+
-   | Icon                 | Behavior                                                                                          | Shortcut       |
-   +======================+===================================================================================================+================+
-   | *Save Data Changes*  | Click the *Save Data Changes* icon to save data changes (insert, update, or delete) in the Data   | F6             |
-   |                      | Output Panel to the server.                                                                       |                |
-   +----------------------+---------------------------------------------------------------------------------------------------+----------------+
-   | *Find*               | Use the *Find* menu to search, replace, or navigate the code displayed in the SQL Editor:         |                |
-   |                      +---------------------------------------------------------------------------------------------------+----------------+
-   |                      | Select *Find* to provide a search target, and search the SQL Editor contents.                     | Cmd+F          |
-   |                      +---------------------------------------------------------------------------------------------------+----------------+
-   |                      | Select *Find next* to locate the next occurrence of the search target.                            | Cmd+G          |
-   |                      +---------------------------------------------------------------------------------------------------+----------------+
-   |                      | Select *Find previous* to move to the last occurrence of the search target.                       | Cmd+Shift+G    |
-   |                      +---------------------------------------------------------------------------------------------------+----------------+
-   |                      | Select *Persistent find* to identify all occurrences of the search target within the editor.      |                |
-   |                      +---------------------------------------------------------------------------------------------------+----------------+
-   |                      | Select *Replace* to locate and replace (with prompting) individual occurrences of the target.     | Cmd+Shift+F    |
-   |                      +---------------------------------------------------------------------------------------------------+----------------+
-   |                      | Select *Replace all* to locate and replace all occurrences of the target within the editor.       |                |
-   |                      +---------------------------------------------------------------------------------------------------+----------------+
-   |                      | Select *Jump* to navigate to the next occurrence of the search target.                            | Alt+G          |
-   +----------------------+---------------------------------------------------------------------------------------------------+----------------+
-   | *Copy*               | Click the *Copy* icon to copy the content with or without header:                                 |  Accesskey + C |
-   |                      |                                                                                                   |                |
-   |                      |  * Click the *Copy* icon to copy the content that is currently highlighted in the Data Output     |                |
-   |                      |     panel.                                                                                        |                |
-   |                      |                                                                                                   |                |
-   |                      |  *  Click *Copy with headers* to copy the highlighted content along with the header.              |                |
-   +----------------------+---------------------------------------------------------------------------------------------------+----------------+
-   | *Paste*              | Click the *Paste* icon to paste a previously copied row into a new row.                           | Accesskey + P  |
-   +----------------------+---------------------------------------------------------------------------------------------------+----------------+
-   | *Delete*             | Click the *Delete* icon to mark the selected rows for deletion. These marked rows get deleted     |Accesskey + D   |
-   |                      | when you click the *Save Data Changes* icon.                                                      |                |
-   +----------------------+---------------------------------------------------------------------------------------------------+----------------+
-   | *Edit*               | Use options on the *Edit* menu to access text editing tools; the options operate on the text      |                |
-   |                      | displayed in the SQL Editor panel when in Query Tool mode:                                        |                |
-   |                      +---------------------------------------------------------------------------------------------------+----------------+
-   |                      | Select *Indent Selection* to indent the currently selected text.                                  | Tab            |
-   |                      +---------------------------------------------------------------------------------------------------+----------------+
-   |                      | Select *Unindent Selection* to remove indentation from the currently selected text.               | Shift+Tab      |
-   |                      +---------------------------------------------------------------------------------------------------+----------------+
-   |                      | Select *Inline Comment Selection* to enclose any lines that contain the selection in SQL style    | Cmd+/          |
-   |                      | comment notation.                                                                                 |                |
-   |                      +---------------------------------------------------------------------------------------------------+----------------+
-   |                      | Select *Inline Uncomment Selection* to remove SQL style comment notation from the selected line.  | Cmd+.          |
-   |                      +---------------------------------------------------------------------------------------------------+----------------+
-   |                      | Select *Block Comment* to enclose all lines that contain the selection in C style comment         | Shift+Cmd+/    |
-   |                      | notation.  This option acts as a toggle.                                                          |                |
-   +----------------------+---------------------------------------------------------------------------------------------------+----------------+
-
-View/Edit Data Resultset Control
-********************************
-
-.. table::
-   :class: longtable
-   :widths: 1 4 1
-
-   +----------------------+---------------------------------------------------------------------------------------------------+----------------+
-   | Icon                 | Behavior                                                                                          | Shortcut       |
-   +======================+===================================================================================================+================+
-   | *Filter*             | Click the *Filter* icon to set filtering and sorting criteria for the data when in View/Edit data | Accesskey + F  |
-   |                      | mode. Click the down arrow to access other filtering and sorting options:                         |                |
-   |                      |                                                                                                   |                |
-   |                      |  * Click *Sort/Filter* to open the sorting and filtering dialogue. In the *SQL Filter*, you can   |                |
-   |                      |    enter a SQL query as filtering criteria. In *Data Sorting*, you can select the column and      |                |
-   |                      |    specify the order for sorting.                                                                 |                |
-   |                      |                                                                                                   |                |
-   |                      |  * Click *Filter by Selection* to show only the rows containing the values in the selected cells. |                |
-   |                      |                                                                                                   |                |
-   |                      |  * Click *Exclude by Selection* to show only the rows that do not contain the values in the       |                |
-   |                      |    selected cells.                                                                                |                |
-   |                      |                                                                                                   |                |
-   |                      |  * Click *Remove Sort/Filter* to remove any previously selected sort or filtering options.        |                |
-   +----------------------+---------------------------------------------------------------------------------------------------+----------------+
-   | Limit Selector       | Select a value in the *Limit Selector* to limit the size of the dataset to a number of rows.      | Accesskey + R  |
-   +----------------------+---------------------------------------------------------------------------------------------------+----------------+
-   | *Stop*               | Click the *Stop* icon to cancel the execution of the currently running query.                     | Accesskey + Q  |
-   +----------------------+---------------------------------------------------------------------------------------------------+----------------+
-
-Query Execution
-***************
-
-.. table::
-   :class: longtable
-   :widths: 1 4 1
-
-   +----------------------+---------------------------------------------------------------------------------------------------+----------------+
-   | Icon                 | Behavior                                                                                          | Shortcut       |
-   +======================+===================================================================================================+================+
-   | *Execute/Refresh*    | Click the *Execute/Refresh* icon to either execute or refresh the query highlighted in the SQL    | F5             |
-   |                      | editor panel. Click the down arrow to access other execution options:                             |                |
-   |                      |                                                                                                   |                |
-   |                      |  * Add a check next to *Auto-Rollback* to instruct the server to automatically roll back a        |                |
-   |                      |    transaction if an error occurs during the transaction.                                         |                |
-   |                      |                                                                                                   |                |
-   |                      |  * Add a check next to *Auto-Commit* to instruct the server to automatically commit each          |                |
-   |                      |    transaction.  Any changes made by the transaction will be visible to others, and               |                |
-   |                      |    durable in the event of a crash.                                                               |                |
-   +----------------------+---------------------------------------------------------------------------------------------------+----------------+
-   | *Explain*            | Click the *Explain* icon to view an explanation plan for the current query. The result of the     | F7             |
-   |                      | EXPLAIN is displayed graphically on the *Explain* tab of the output panel, and in text            |                |
-   |                      | form on the *Data Output* tab.                                                                    |                |
-   +----------------------+---------------------------------------------------------------------------------------------------+----------------+
-   | *Explain analyze*    | Click the *Explain analyze* icon to invoke an EXPLAIN ANALYZE command on the current query.       | Shift+F7       |
-   |                      |                                                                                                   |                |
-   |                      | Navigate through the *Explain Options* menu to select options for the EXPLAIN command:            |                |
-   |                      |                                                                                                   |                |
-   |                      |  * Select *Verbose* to display additional information regarding the query plan.                   |                |
-   |                      |                                                                                                   |                |
-   |                      |  * Select *Costs* to include information on the estimated startup and total cost of each          |                |
-   |                      |    plan node, as well as the estimated number of rows and the estimated width of each             |                |
-   |                      |    row.                                                                                           |                |
-   |                      |                                                                                                   |                |
-   |                      |  * Select *Buffers* to include information on buffer usage.                                       |                |
-   |                      |                                                                                                   |                |
-   |                      |  * Select *Timing* to include information about the startup time and the amount of time           |                |
-   |                      |    spent in each node of the query.                                                               |                |
-   |                      |                                                                                                   |                |
-   |                      |  * Select *Summary* to include the summary information about the query plan.                      |                |
-   +----------------------+---------------------------------------------------------------------------------------------------+----------------+
-   | *Commit*             | Click the *Commit* icon to commit the transaction.                                                | Shift+CTRL+M   |
-   +----------------------+---------------------------------------------------------------------------------------------------+----------------+
-   | *Rollback*           | Click the *Rollback* icon to rollback the transaction.                                            | Shift+CTRL+R   |
-   +----------------------+---------------------------------------------------------------------------------------------------+----------------+
-   | *Clear*              | Use options on the *Clear* drop-down menu to erase display contents:                              | Accesskey + L  |
-   |                      |                                                                                                   |                |
-   |                      |  * Select *Clear Query Window* to erase the content of the SQL Editor panel.                      |                |
-   |                      |                                                                                                   |                |
-   |                      |  * Select *Clear History* to erase the content of the *History* tab.                              |                |
-   +----------------------+---------------------------------------------------------------------------------------------------+----------------+
+.. _query_tool_toolbar:
+
+***************************
+`Query Tool Toolbar`:index:
+***************************
+
+The *Query Tool* toolbar uses context-sensitive icons that provide shortcuts to
+frequently performed tasks. If an icon is highlighted, the option is enabled;
+if the icon is grayed-out, the task is disabled.
+
+.. note:: The :ref:`Query Tool <query_tool>` and
+    :ref:`View/Edit Data <editgrid>` tools are actually different operating
+    modes of the same tool. Some controls will be disabled in either mode.
+
+.. image:: images/query_toolbar.png
+    :alt: Query tool toolbar
+    :align: center
+
+Hover over an icon in pgAdmin to display a tooltip that describes the icon's
+functionality.
+
+File Options
+************
+
+.. table::
+   :class: longtable
+   :widths: 1 4 1
+
+   +----------------------+---------------------------------------------------------------------------------------------------+----------------+
+   | Icon                 | Behavior                                                                                          | Shortcut       |
+   +======================+===================================================================================================+================+
+   | *Open File*          | Click the *Open File* icon to display a previously saved query in the SQL Editor.                 | Accesskey + O  |
+   +----------------------+---------------------------------------------------------------------------------------------------+----------------+
+   | *Save File*          | Click the *Save* icon to perform a quick-save of a previously saved query, or to access the       | Accesskey + S  |
+   |                      | *Save* menu:                                                                                      |                |
+   |                      |                                                                                                   |                |
+   |                      |  * Select *Save* to save the selected content of the SQL Editor panel in a  file.                 |                |
+   |                      |                                                                                                   |                |
+   |                      |  * Select *Save As* to open a new browser dialog and specify a new location to which to save the  |                |
+   |                      |    selected content of the SQL Editor panel.                                                      |                |
+   +----------------------+---------------------------------------------------------------------------------------------------+----------------+
+
+Editing Options
+***************
+
+.. table::
+   :class: longtable
+   :widths: 1 4 1
+
+   +----------------------+---------------------------------------------------------------------------------------------------+----------------+
+   | Icon                 | Behavior                                                                                          | Shortcut       |
+   +======================+===================================================================================================+================+
+   | *Save Data Changes*  | Click the *Save Data Changes* icon to save data changes (insert, update, or delete) in the Data   | F6             |
+   |                      | Output Panel to the server.                                                                       |                |
+   +----------------------+---------------------------------------------------------------------------------------------------+----------------+
+   | *Find*               | Use the *Find* menu to search, replace, or navigate the code displayed in the SQL Editor:         |                |
+   |                      +---------------------------------------------------------------------------------------------------+----------------+
+   |                      | Select *Find* to provide a search target, and search the SQL Editor contents.                     | Cmd+F          |
+   |                      +---------------------------------------------------------------------------------------------------+----------------+
+   |                      | Select *Find next* to locate the next occurrence of the search target.                            | Cmd+G          |
+   |                      +---------------------------------------------------------------------------------------------------+----------------+
+   |                      | Select *Find previous* to move to the last occurrence of the search target.                       | Cmd+Shift+G    |
+   |                      +---------------------------------------------------------------------------------------------------+----------------+
+   |                      | Select *Persistent find* to identify all occurrences of the search target within the editor.      |                |
+   |                      +---------------------------------------------------------------------------------------------------+----------------+
+   |                      | Select *Replace* to locate and replace (with prompting) individual occurrences of the target.     | Cmd+Shift+F    |
+   |                      +---------------------------------------------------------------------------------------------------+----------------+
+   |                      | Select *Replace all* to locate and replace all occurrences of the target within the editor.       |                |
+   |                      +---------------------------------------------------------------------------------------------------+----------------+
+   |                      | Select *Jump* to navigate to the next occurrence of the search target.                            | Alt+G          |
+   +----------------------+---------------------------------------------------------------------------------------------------+----------------+
+   | *Copy*               | Click the *Copy* icon to copy the content with or without header:                                 |  Accesskey + C |
+   |                      |                                                                                                   |                |
+   |                      |  * Click the *Copy* icon to copy the content that is currently highlighted in the Data Output     |                |
+   |                      |     panel.                                                                                        |                |
+   |                      |                                                                                                   |                |
+   |                      |  *  Click *Copy with headers* to copy the highlighted content along with the header.              |                |
+   +----------------------+---------------------------------------------------------------------------------------------------+----------------+
+   | *Paste*              | Click the *Paste* icon to paste a previously copied row into a new row.                           | Accesskey + P  |
+   +----------------------+---------------------------------------------------------------------------------------------------+----------------+
+   | *Delete*             | Click the *Delete* icon to mark the selected rows for deletion. These marked rows get deleted     |Accesskey + D   |
+   |                      | when you click the *Save Data Changes* icon.                                                      |                |
+   +----------------------+---------------------------------------------------------------------------------------------------+----------------+
+   | *Edit*               | Use options on the *Edit* menu to access text editing tools; the options operate on the text      |                |
+   |                      | displayed in the SQL Editor panel when in Query Tool mode:                                        |                |
+   |                      +---------------------------------------------------------------------------------------------------+----------------+
+   |                      | Select *Indent Selection* to indent the currently selected text.                                  | Tab            |
+   |                      +---------------------------------------------------------------------------------------------------+----------------+
+   |                      | Select *Unindent Selection* to remove indentation from the currently selected text.               | Shift+Tab      |
+   |                      +---------------------------------------------------------------------------------------------------+----------------+
+   |                      | Select *Inline Comment Selection* to enclose any lines that contain the selection in SQL style    | Cmd+/          |
+   |                      | comment notation.                                                                                 |                |
+   |                      +---------------------------------------------------------------------------------------------------+----------------+
+   |                      | Select *Inline Uncomment Selection* to remove SQL style comment notation from the selected line.  | Cmd+.          |
+   |                      +---------------------------------------------------------------------------------------------------+----------------+
+   |                      | Select *Block Comment* to enclose all lines that contain the selection in C style comment         | Shift+Cmd+/    |
+   |                      | notation.  This option acts as a toggle.                                                          |                |
+   |                      +---------------------------------------------------------------------------------------------------+----------------+
+   |                      | Select *Format SQL* to format the selected SQL or all the SQL if none is selected                 | Shift+Cmd+K    |
+   +----------------------+---------------------------------------------------------------------------------------------------+----------------+
+
+View/Edit Data Resultset Control
+********************************
+
+.. table::
+   :class: longtable
+   :widths: 1 4 1
+
+   +----------------------+---------------------------------------------------------------------------------------------------+----------------+
+   | Icon                 | Behavior                                                                                          | Shortcut       |
+   +======================+===================================================================================================+================+
+   | *Filter*             | Click the *Filter* icon to set filtering and sorting criteria for the data when in View/Edit data | Accesskey + F  |
+   |                      | mode. Click the down arrow to access other filtering and sorting options:                         |                |
+   |                      |                                                                                                   |                |
+   |                      |  * Click *Sort/Filter* to open the sorting and filtering dialogue. In the *SQL Filter*, you can   |                |
+   |                      |    enter a SQL query as filtering criteria. In *Data Sorting*, you can select the column and      |                |
+   |                      |    specify the order for sorting.                                                                 |                |
+   |                      |                                                                                                   |                |
+   |                      |  * Click *Filter by Selection* to show only the rows containing the values in the selected cells. |                |
+   |                      |                                                                                                   |                |
+   |                      |  * Click *Exclude by Selection* to show only the rows that do not contain the values in the       |                |
+   |                      |    selected cells.                                                                                |                |
+   |                      |                                                                                                   |                |
+   |                      |  * Click *Remove Sort/Filter* to remove any previously selected sort or filtering options.        |                |
+   +----------------------+---------------------------------------------------------------------------------------------------+----------------+
+   | Limit Selector       | Select a value in the *Limit Selector* to limit the size of the dataset to a number of rows.      | Accesskey + R  |
+   +----------------------+---------------------------------------------------------------------------------------------------+----------------+
+   | *Stop*               | Click the *Stop* icon to cancel the execution of the currently running query.                     | Accesskey + Q  |
+   +----------------------+---------------------------------------------------------------------------------------------------+----------------+
+
+Query Execution
+***************
+
+.. table::
+   :class: longtable
+   :widths: 1 4 1
+
+   +----------------------+---------------------------------------------------------------------------------------------------+----------------+
+   | Icon                 | Behavior                                                                                          | Shortcut       |
+   +======================+===================================================================================================+================+
+   | *Execute/Refresh*    | Click the *Execute/Refresh* icon to either execute or refresh the query highlighted in the SQL    | F5             |
+   |                      | editor panel. Click the down arrow to access other execution options:                             |                |
+   |                      |                                                                                                   |                |
+   |                      |  * Add a check next to *Auto-Rollback* to instruct the server to automatically roll back a        |                |
+   |                      |    transaction if an error occurs during the transaction.                                         |                |
+   |                      |                                                                                                   |                |
+   |                      |  * Add a check next to *Auto-Commit* to instruct the server to automatically commit each          |                |
+   |                      |    transaction.  Any changes made by the transaction will be visible to others, and               |                |
+   |                      |    durable in the event of a crash.                                                               |                |
+   +----------------------+---------------------------------------------------------------------------------------------------+----------------+
+   | *Explain*            | Click the *Explain* icon to view an explanation plan for the current query. The result of the     | F7             |
+   |                      | EXPLAIN is displayed graphically on the *Explain* tab of the output panel, and in text            |                |
+   |                      | form on the *Data Output* tab.                                                                    |                |
+   +----------------------+---------------------------------------------------------------------------------------------------+----------------+
+   | *Explain analyze*    | Click the *Explain analyze* icon to invoke an EXPLAIN ANALYZE command on the current query.       | Shift+F7       |
+   |                      |                                                                                                   |                |
+   |                      | Navigate through the *Explain Options* menu to select options for the EXPLAIN command:            |                |
+   |                      |                                                                                                   |                |
+   |                      |  * Select *Verbose* to display additional information regarding the query plan.                   |                |
+   |                      |                                                                                                   |                |
+   |                      |  * Select *Costs* to include information on the estimated startup and total cost of each          |                |
+   |                      |    plan node, as well as the estimated number of rows and the estimated width of each             |                |
+   |                      |    row.                                                                                           |                |
+   |                      |                                                                                                   |                |
+   |                      |  * Select *Buffers* to include information on buffer usage.                                       |                |
+   |                      |                                                                                                   |                |
+   |                      |  * Select *Timing* to include information about the startup time and the amount of time           |                |
+   |                      |    spent in each node of the query.                                                               |                |
+   |                      |                                                                                                   |                |
+   |                      |  * Select *Summary* to include the summary information about the query plan.                      |                |
+   +----------------------+---------------------------------------------------------------------------------------------------+----------------+
+   | *Commit*             | Click the *Commit* icon to commit the transaction.                                                | Shift+CTRL+M   |
+   +----------------------+---------------------------------------------------------------------------------------------------+----------------+
+   | *Rollback*           | Click the *Rollback* icon to rollback the transaction.                                            | Shift+CTRL+R   |
+   +----------------------+---------------------------------------------------------------------------------------------------+----------------+
+   | *Clear*              | Use options on the *Clear* drop-down menu to erase display contents:                              | Accesskey + L  |
+   |                      |                                                                                                   |                |
+   |                      |  * Select *Clear Query Window* to erase the content of the SQL Editor panel.                      |                |
+   |                      |                                                                                                   |                |
+   |                      |  * Select *Clear History* to erase the content of the *History* tab.                              |                |
+   +----------------------+---------------------------------------------------------------------------------------------------+----------------+
    | *Download as CSV/TXT*| Click the *Download as CSV/TXT* icon to download the result set of the current query as a *.csv*  | F8             |
    |                      | or as a *.txt* file. if *CSV field seperator* set to comma(,) else as a *.txt* file.              |                |
    |                      | You can specify the CSV/TXT settings through *Preferences -> SQL Editor -> CSV/TXT output*        |                |
    |                      | dialogue.                                                                                         |                |
-   +----------------------+---------------------------------------------------------------------------------------------------+----------------+
+   +----------------------+---------------------------------------------------------------------------------------------------+----------------+
diff --git a/web/pgadmin/misc/sql/__init__.py b/web/pgadmin/misc/sql/__init__.py
index 3a13bd84a..f2b9e052f 100644
--- a/web/pgadmin/misc/sql/__init__.py
+++ b/web/pgadmin/misc/sql/__init__.py
@@ -9,8 +9,12 @@
 
 """A blueprint module providing utility functions for the application."""
 
-from flask import url_for
+import sqlparse
+from flask import request, url_for
+from flask_security import login_required
 from pgadmin.utils import PgAdminModule
+from pgadmin.utils.ajax import make_json_response
+from pgadmin.utils.preferences import Preferences
 
 MODULE_NAME = 'sql'
 
@@ -23,6 +27,61 @@ class SQLModule(PgAdminModule):
             'when': None
         }]
 
+    def get_exposed_url_endpoints(self):
+        """
+        Returns:
+            list: URL endpoints
+        """
+        return [
+            'sql.format', 'sql.format'
+        ]
+
 
 # Initialise the module
 blueprint = SQLModule(MODULE_NAME, __name__, url_prefix='/misc/sql')
+
+
+def sql_format(sql):
+    """
+    This function takes a SQL statement, formats it, and returns it
+    """
+    p = Preferences.module('sqleditor')
+    output = sqlparse.format(sql,
+                             keyword_case=p.preference(
+                                 'keyword_case').get(),
+                             identifier_case=p.preference(
+                                 'identifier_case').get(),
+                             strip_comments=p.preference(
+                                 'strip_comments').get(),
+                             reindent=p.preference(
+                                 'reindent').get(),
+                             reindent_aligned=p.preference(
+                                 'reindent_aligned').get(),
+                             use_space_around_operators=p.preference(
+                                 'spaces_around_operators').get(),
+                             comma_first=p.preference(
+                                 'comma_first').get(),
+                             wrap_after=p.preference(
+                                 'wrap_after').get(),
+                             indent_tabs=not p.preference(
+                                 'use_spaces').get(),
+                             indent_width=p.preference(
+                                 'tab_size').get())
+
+    return output
+
+
+@blueprint.route("/format", methods=['POST'], endpoint="format")
+@login_required
+def sql_format_wrapper():
+    """
+    This endpoint takes a SQL statement, formats it, and returns it
+    """
+    sql = ''
+    if request.data:
+        sql = sql_format(request.get_json()['sql'])
+
+    return make_json_response(
+        data={'sql': sql},
+        status=200
+    )
diff --git a/web/pgadmin/static/js/keyboard_shortcuts.js b/web/pgadmin/static/js/keyboard_shortcuts.js
index 0a17ec133..c021d1830 100644
--- a/web/pgadmin/static/js/keyboard_shortcuts.js
+++ b/web/pgadmin/static/js/keyboard_shortcuts.js
@@ -17,7 +17,8 @@ const PERIOD_KEY = 190,
   LEFT_KEY = 37,
   UP_KEY = 38,
   RIGHT_KEY = 39,
-  DOWN_KEY = 40;
+  DOWN_KEY = 40,
+  K_KEY = 75;
 
 function isMac() {
   return window.navigator.platform.search('Mac') != -1;
@@ -247,6 +248,12 @@ function keyboardShortcutsQueryTool(
   ) && keyCode === PERIOD_KEY) {
     this._stopEventPropagation(event);
     queryToolActions.uncommentLineCode(sqlEditorController);
+  } else if ((
+    (this.isMac() && event.metaKey) ||
+     (!this.isMac() && event.ctrlKey)
+  ) && !event.altKey && event.shiftKey && keyCode === K_KEY) {
+    this._stopEventPropagation(event);
+    queryToolActions.formatSql(sqlEditorController);
   }  else if (keyCode == ESC_KEY) {
     queryToolActions.focusOut(sqlEditorController);
     /*Apply only for sub-dropdown*/
diff --git a/web/pgadmin/static/js/sqleditor/query_tool_actions.js b/web/pgadmin/static/js/sqleditor/query_tool_actions.js
index a29e0f507..a97582e6a 100644
--- a/web/pgadmin/static/js/sqleditor/query_tool_actions.js
+++ b/web/pgadmin/static/js/sqleditor/query_tool_actions.js
@@ -123,6 +123,10 @@ let queryToolActions = {
     );
   },
 
+  formatSql: function (sqlEditorController) {
+    sqlEditorController.gridView.on_format_sql();
+  },
+
   focusOut: function () {
     document.activeElement.blur();
     pgWindow.document.activeElement.blur();
diff --git a/web/pgadmin/tools/datagrid/templates/datagrid/index.html b/web/pgadmin/tools/datagrid/templates/datagrid/index.html
index 0198210f5..7eb76f852 100644
--- a/web/pgadmin/tools/datagrid/templates/datagrid/index.html
+++ b/web/pgadmin/tools/datagrid/templates/datagrid/index.html
@@ -189,6 +189,15 @@
                                  {{ _(' (Shift+Ctrl+/)') }}{%- endif %}</span>
                         </a>
                     </li>
+                    <li class="dropdown-divider"></li>
+                    <li>
+                        <a class="dropdown-item" id="btn-format-sql" href="#" tabindex="0">
+                            <span>{{ _('Format SQL') }}{% if client_platform == 'macos' -%}
+                                 {{ _(' (Shift+Cmd+K)') }}
+                            {% else %}
+                                 {{ _(' (Shift+Ctrl+K)') }}{%- endif %}</span>
+                        </a>
+                    </li>
                 </ul>
             </div>
             <div class="btn-group mr-1" role="group" aria-label="">
diff --git a/web/pgadmin/tools/sqleditor/static/js/sqleditor.js b/web/pgadmin/tools/sqleditor/static/js/sqleditor.js
index 786e49338..dae9edea4 100644
--- a/web/pgadmin/tools/sqleditor/static/js/sqleditor.js
+++ b/web/pgadmin/tools/sqleditor/static/js/sqleditor.js
@@ -140,6 +140,9 @@ define('tools.querytool', [
       // Indentation options
       'click #btn-indent-code': 'on_indent_code',
       'click #btn-unindent-code': 'on_unindent_code',
+      // Format
+      'click #btn-format-sql': 'on_format_sql',
+      // Transaction control
       'click #btn-commit': 'on_commit_transaction',
       'click #btn-rollback': 'on_rollback_transaction',
     },
@@ -1743,6 +1746,16 @@ define('tools.querytool', [
       );
     },
 
+    on_format_sql: function() {
+      var self = this;
+      // Trigger the format signal to the SqlEditorController class
+      self.handler.trigger(
+        'pgadmin-sqleditor:format_sql',
+        self,
+        self.handler
+      );
+    },
+
     // Callback function for the clear button click.
     on_clear: function(ev) {
       var self = this;
@@ -2401,6 +2414,8 @@ define('tools.querytool', [
         // Indentation related
         self.on('pgadmin-sqleditor:indent_selected_code', self._indent_selected_code, self);
         self.on('pgadmin-sqleditor:unindent_selected_code', self._unindent_selected_code, self);
+        // Format
+        self.on('pgadmin-sqleditor:format_sql', self._format_sql, self);
 
         window.parent.$(window.parent.document).on('pgadmin-sqleditor:rows-copied', self._copied_in_other_session);
       },
@@ -4230,6 +4245,41 @@ define('tools.querytool', [
         editor.execCommand('indentLess');
       },
 
+      /*
+       * This function will format the SQL
+       */
+      _format_sql: function() {
+        var self = this,
+          editor = self.gridView.query_tool_obj,
+          selection = true,
+          sql = '';
+
+        sql = editor.getSelection();
+
+        if (sql == '') {
+          sql = editor.getValue();
+          selection = false;
+        }
+
+        $.ajax({
+          url: url_for('sql.format'),
+          data: JSON.stringify({'sql': sql}),
+          method: 'POST',
+          contentType: 'application/json',
+          dataType: 'json',
+        })
+          .done(function(res) {
+            if (selection === true) {
+              editor.replaceSelection(res.data.sql, 'around');
+            } else {
+              editor.setValue(res.data.sql);
+            }
+          })
+          .fail(function() {
+          /* failure should be ignored */
+          });
+      },
+
       isQueryRunning: function() {
         return is_query_running;
       },
diff --git a/web/pgadmin/tools/sqleditor/utils/query_tool_preferences.py b/web/pgadmin/tools/sqleditor/utils/query_tool_preferences.py
index b70e22102..ddc00b31f 100644
--- a/web/pgadmin/tools/sqleditor/utils/query_tool_preferences.py
+++ b/web/pgadmin/tools/sqleditor/utils/query_tool_preferences.py
@@ -169,27 +169,6 @@ def register_query_tool_preferences(self):
         )
     )
 
-    self.tab_size = self.preference.register(
-        'Editor', 'tab_size',
-        gettext("Tab size"), 'integer', 4,
-        min_val=2,
-        max_val=8,
-        category_label=gettext('Options'),
-        help_str=gettext(
-            'The number of spaces per tab. Minimum 2, maximum 8.'
-        )
-    )
-
-    self.use_spaces = self.preference.register(
-        'Editor', 'use_spaces',
-        gettext("Use spaces?"), 'boolean', False,
-        category_label=gettext('Options'),
-        help_str=gettext(
-            'Specifies whether or not to insert spaces instead of tabs '
-            'when the tab key or auto-indent are used.'
-        )
-    )
-
     self.wrap_code = self.preference.register(
         'Editor', 'wrap_code',
         gettext("Line wrapping?"), 'boolean', False,
@@ -703,3 +682,98 @@ def register_query_tool_preferences(self):
         category_label=gettext('Keyboard shortcuts'),
         fields=shortcut_fields
     )
+
+    # Register options for SQL formatting
+    self.keyword_case = self.preference.register(
+        'editor', 'keyword_case',
+        gettext("Keyword case"), 'radioModern', 'upper',
+        options=[{'label': 'Upper case', 'value': 'upper'},
+                 {'label': 'Lower case', 'value': 'lower'},
+                 {'label': 'Capitalized', 'value': 'capitalize'}],
+        category_label=gettext('SQL formatting'),
+        help_str=gettext(
+            'Convert keywords to upper, lower, or capitalized casing.'
+        )
+    )
+
+    self.identifier_case = self.preference.register(
+        'editor', 'identifier_case',
+        gettext("Identifier case"), 'radioModern', 'upper',
+        options=[{'label': 'Upper case', 'value': 'upper'},
+                 {'label': 'Lower case', 'value': 'lower'},
+                 {'label': 'Capitalized', 'value': 'capitalize'}],
+        category_label=gettext('SQL formatting'),
+        help_str=gettext(
+            'Convert identifiers to upper, lower, or capitalized casing.'
+        )
+    )
+
+    self.strip_comments = self.preference.register(
+        'editor', 'strip_comments',
+        gettext("Strip comments?"), 'boolean', False,
+        category_label=gettext('SQL formatting'),
+        help_str=gettext('If set to True, comments will be removed.')
+    )
+
+    self.reindent = self.preference.register(
+        'editor', 'reindent',
+        gettext("Re-indent?"), 'boolean', True,
+        category_label=gettext('SQL formatting'),
+        help_str=gettext('If set to True, the indentations of the '
+                         'statements are changed.')
+    )
+
+    self.reindent_aligned = self.preference.register(
+        'editor', 'reindent_aligned',
+        gettext("Re-indent aligned?"), 'boolean', False,
+        category_label=gettext('SQL formatting'),
+        help_str=gettext('If set to True, the indentations of the '
+                         'statements are changed, and statements are '
+                         'aligned by keywords.')
+    )
+
+    self.spaces_around_operators = self.preference.register(
+        'editor', 'spaces_around_operators',
+        gettext("Spaces around operators?"), 'boolean', True,
+        category_label=gettext('SQL formatting'),
+        help_str=gettext('If set to True, spaces are used around all '
+                         'operators.')
+    )
+
+    self.comma_first = self.preference.register(
+        'editor', 'comma_first',
+        gettext("Comma-first notation?"), 'boolean', False,
+        category_label=gettext('SQL formatting'),
+        help_str=gettext('If set to True, comma-first notation for column '
+                         'names is used.')
+    )
+
+    self.wrap_after = self.preference.register(
+        'editor', 'wrap_after',
+        gettext("Wrap after N characters"), 'integer', 4,
+        category_label=gettext('SQL formatting'),
+        help_str=gettext("The column limit (in characters) for wrapping "
+                         "comma-separated lists. If zero, it puts "
+                         "every item in the list on its own line.")
+    )
+
+    self.tab_size = self.preference.register(
+        'editor', 'tab_size',
+        gettext("Tab size"), 'integer', 4,
+        min_val=2,
+        max_val=8,
+        category_label=gettext('SQL formatting'),
+        help_str=gettext(
+            'The number of spaces per tab. Minimum 2, maximum 8.'
+        )
+    )
+
+    self.use_spaces = self.preference.register(
+        'editor', 'use_spaces',
+        gettext("Use spaces?"), 'boolean', False,
+        category_label=gettext('SQL formatting'),
+        help_str=gettext(
+            'Specifies whether or not to insert spaces instead of tabs '
+            'when the tab key or auto-indent are used.'
+        )
+    )
