diff --git a/doc/src/sgml/ref/alter_system.sgml b/doc/src/sgml/ref/alter_system.sgml
index 23c30ef..a6e3210 100644
--- a/doc/src/sgml/ref/alter_system.sgml
+++ b/doc/src/sgml/ref/alter_system.sgml
@@ -22,6 +22,9 @@ PostgreSQL documentation
  <refsynopsisdiv>
 <synopsis>
 ALTER SYSTEM SET <replaceable class="PARAMETER">configuration_parameter</replaceable> { TO | = } { <replaceable class="PARAMETER">value</replaceable> | '<replaceable class="PARAMETER">value</replaceable>' | DEFAULT }
+
+ALTER SYSTEM RESET <replaceable class="PARAMETER">configuration_parameter</replaceable>
+ALTER SYSTEM RESET ALL
 </synopsis>
  </refsynopsisdiv>
 
@@ -30,10 +33,12 @@ ALTER SYSTEM SET <replaceable class="PARAMETER">configuration_parameter</replace
 
   <para>
    <command>ALTER SYSTEM</command> writes the configuration parameter
-   values to the <filename>postgresql.auto.conf</filename> file. With
-   <literal>DEFAULT</literal>, it removes a configuration entry from
-   <filename>postgresql.auto.conf</filename> file. The values will be
-   effective after reload of server configuration (SIGHUP) or in next
+   values to the <filename>postgresql.auto.conf</filename> file.
+   Setting the parameter to <literal>DEFAULT</literal>, or using the
+   <command>RESET</command> variant, removes the configuration entry from
+   <filename>postgresql.auto.conf</filename> file. Use <literal>RESET
+   ALL</literal> to clear all configuration entries.  The values will
+   be effective after reload of server configuration (SIGHUP) or in next
    server start based on the type of configuration parameter modified.
   </para>
 
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 327f2d2..828c685 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -411,7 +411,8 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 
 %type <istmt>	insert_rest
 
-%type <vsetstmt> generic_set set_rest set_rest_more SetResetClause FunctionSetResetClause
+%type <vsetstmt> generic_set set_rest set_rest_more generic_reset reset_rest
+				 SetResetClause FunctionSetResetClause
 
 %type <node>	TableElement TypedTableElement ConstraintElem TableFuncElement
 %type <node>	columnDef columnOptions
@@ -1579,39 +1580,47 @@ NonReservedWord_or_Sconst:
 		;
 
 VariableResetStmt:
-			RESET var_name
+			RESET reset_rest						{ $$ = (Node *) $2; }
+		;
+
+reset_rest:
+			generic_reset							{ $$ = $1; }
+			| TIME ZONE
 				{
 					VariableSetStmt *n = makeNode(VariableSetStmt);
 					n->kind = VAR_RESET;
-					n->name = $2;
-					$$ = (Node *) n;
+					n->name = "timezone";
+					$$ = n;
 				}
-			| RESET TIME ZONE
+			| TRANSACTION ISOLATION LEVEL
 				{
 					VariableSetStmt *n = makeNode(VariableSetStmt);
 					n->kind = VAR_RESET;
-					n->name = "timezone";
-					$$ = (Node *) n;
+					n->name = "transaction_isolation";
+					$$ = n;
 				}
-			| RESET TRANSACTION ISOLATION LEVEL
+			| SESSION AUTHORIZATION
 				{
 					VariableSetStmt *n = makeNode(VariableSetStmt);
 					n->kind = VAR_RESET;
-					n->name = "transaction_isolation";
-					$$ = (Node *) n;
+					n->name = "session_authorization";
+					$$ = n;
 				}
-			| RESET SESSION AUTHORIZATION
+		;
+
+generic_reset:
+			var_name
 				{
 					VariableSetStmt *n = makeNode(VariableSetStmt);
 					n->kind = VAR_RESET;
-					n->name = "session_authorization";
-					$$ = (Node *) n;
+					n->name = $1;
+					$$ = n;
 				}
-			| RESET ALL
+			| ALL
 				{
 					VariableSetStmt *n = makeNode(VariableSetStmt);
 					n->kind = VAR_RESET_ALL;
-					$$ = (Node *) n;
+					$$ = n;
 				}
 		;
 
@@ -8485,7 +8494,7 @@ DropdbStmt: DROP DATABASE database_name
 
 /*****************************************************************************
  *
- *		ALTER SYSTEM SET
+ *		ALTER SYSTEM
  *
  * This is used to change configuration parameters persistently.
  *****************************************************************************/
@@ -8497,6 +8506,12 @@ AlterSystemStmt:
 					n->setstmt = $4;
 					$$ = (Node *)n;
 				}
+			| ALTER SYSTEM_P RESET generic_reset
+				{
+					AlterSystemStmt *n = makeNode(AlterSystemStmt);
+					n->setstmt = $4;
+					$$ = (Node *)n;
+				}
 		;
 
 
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index a8a17c2..ce1c969 100644
--- a/src/backend/utils/misc/guc.c
+++ b/src/backend/utils/misc/guc.c
@@ -6696,6 +6696,8 @@ replace_auto_config_value(ConfigVariable **head_p, ConfigVariable **tail_p,
  * This function takes all previous configuration parameters
  * set by ALTER SYSTEM command and the currently set ones
  * and write them all to the automatic configuration file.
+ * It just writes an empty file incase user wants to reset
+ * all the parameters.
  *
  * The configuration parameters are written to a temporary
  * file then renamed to the final name.
@@ -6710,6 +6712,7 @@ AlterSystemSetConfigFile(AlterSystemStmt *altersysstmt)
 {
 	char	   *name;
 	char	   *value;
+	bool		resetall = false;
 	int			Tmpfd = -1;
 	FILE	   *infile;
 	struct config_generic *record;
@@ -6737,37 +6740,48 @@ AlterSystemSetConfigFile(AlterSystemStmt *altersysstmt)
 			break;
 
 		case VAR_SET_DEFAULT:
+		case VAR_RESET:
+			value = NULL;
+			break;
+
+		case VAR_RESET_ALL:
 			value = NULL;
+			resetall = true;
 			break;
+
 		default:
 			elog(ERROR, "unrecognized alter system stmt type: %d",
 				 altersysstmt->setstmt->kind);
 			break;
 	}
 
-	record = find_option(name, false, LOG);
-	if (record == NULL)
-		ereport(ERROR,
-				(errcode(ERRCODE_UNDEFINED_OBJECT),
-			   errmsg("unrecognized configuration parameter \"%s\"", name)));
+	/* If we're resetting everything, there's no need to validate anything */
+	if (!resetall)
+	{
+		record = find_option(name, false, LOG);
+		if (record == NULL)
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_OBJECT),
+				   errmsg("unrecognized configuration parameter \"%s\"", name)));
 
-	/*
-	 * Don't allow the parameters which can't be set in configuration
-	 * files to be set in PG_AUTOCONF_FILENAME file.
-	 */
-	if ((record->context == PGC_INTERNAL) ||
-		(record->flags & GUC_DISALLOW_IN_FILE) ||
-		(record->flags & GUC_DISALLOW_IN_AUTO_FILE))
-		 ereport(ERROR,
-				 (errcode(ERRCODE_CANT_CHANGE_RUNTIME_PARAM),
-				  errmsg("parameter \"%s\" cannot be changed",
-						 name)));
-
-	if (!validate_conf_option(record, name, value, PGC_S_FILE,
-							  ERROR, true, NULL,
-							  &newextra))
-		ereport(ERROR,
-		(errmsg("invalid value for parameter \"%s\": \"%s\"", name, value)));
+		/*
+		 * Don't allow the parameters which can't be set in configuration
+		 * files to be set in PG_AUTOCONF_FILENAME file.
+		 */
+		if ((record->context == PGC_INTERNAL) ||
+			(record->flags & GUC_DISALLOW_IN_FILE) ||
+			(record->flags & GUC_DISALLOW_IN_AUTO_FILE))
+			 ereport(ERROR,
+					 (errcode(ERRCODE_CANT_CHANGE_RUNTIME_PARAM),
+					  errmsg("parameter \"%s\" cannot be changed",
+							 name)));
+
+		if (!validate_conf_option(record, name, value, PGC_S_FILE,
+								  ERROR, true, NULL,
+								  &newextra))
+			ereport(ERROR,
+			(errmsg("invalid value for parameter \"%s\": \"%s\"", name, value)));
+	}
 
 
 	/*
@@ -6799,26 +6813,34 @@ AlterSystemSetConfigFile(AlterSystemStmt *altersysstmt)
 
 	PG_TRY();
 	{
-		if (stat(AutoConfFileName, &st) == 0)
+		/*
+		 * If we're going to reset everything, then don't open the file, don't
+		 * parse it, and don't do anything with the configuration list.  Just
+		 * write out an empty file.
+		 */
+		if (!resetall)
 		{
-			/* open file PG_AUTOCONF_FILENAME */
-			infile = AllocateFile(AutoConfFileName, "r");
-			if (infile == NULL)
-				ereport(ERROR,
-						(errmsg("failed to open auto conf file \"%s\": %m ",
-								AutoConfFileName)));
+			if (stat(AutoConfFileName, &st) == 0)
+			{
+				/* open file PG_AUTOCONF_FILENAME */
+				infile = AllocateFile(AutoConfFileName, "r");
+				if (infile == NULL)
+					ereport(ERROR,
+							(errmsg("failed to open auto conf file \"%s\": %m ",
+									AutoConfFileName)));
 
-			/* parse it */
-			ParseConfigFp(infile, AutoConfFileName, 0, LOG, &head, &tail);
+				/* parse it */
+				ParseConfigFp(infile, AutoConfFileName, 0, LOG, &head, &tail);
 
-			FreeFile(infile);
-		}
+				FreeFile(infile);
+			}
 
-		/*
-		 * replace with new value if the configuration parameter already
-		 * exists OR add it as a new cofiguration parameter in the file.
-		 */
-		replace_auto_config_value(&head, &tail, AutoConfFileName, name, value);
+			/*
+			 * replace with new value if the configuration parameter already
+			 * exists OR add it as a new cofiguration parameter in the file.
+			 */
+			replace_auto_config_value(&head, &tail, AutoConfFileName, name, value);
+		}
 
 		/* Write and sync the new contents to the temporary file */
 		write_auto_conf_file(Tmpfd, AutoConfTmpFileName, &head);
