diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml
index d1e628f..0cc3296 100644
*** a/doc/src/sgml/config.sgml
--- b/doc/src/sgml/config.sgml
*************** include 'filename'
*** 91,96 ****
--- 91,108 ----
  
     <para>
      <indexterm>
+      <primary><literal>include_if_exists</></primary>
+      <secondary>in configuration file</secondary>
+     </indexterm>
+     Use the same approach as the <literal>include</> directive, continuing
+     normally if the file does not exist.  A regular <literal>include</>
+     will stop with an error if the referenced file is missing, while
+     <literal>include_if_exists</> does not.  A warning about the missing
+     file will be logged.
+    </para>
+ 
+    <para>
+     <indexterm>
       <primary>SIGHUP</primary>
      </indexterm>
      The configuration file is reread whenever the main server process receives a
diff --git a/src/backend/utils/misc/guc-file.l b/src/backend/utils/misc/guc-file.l
index a094c7a..6ba130c 100644
*** a/src/backend/utils/misc/guc-file.l
--- b/src/backend/utils/misc/guc-file.l
*************** ProcessConfigFile(GucContext context)
*** 129,135 ****
  	/* Parse the file into a list of option names and values */
  	head = tail = NULL;
  
! 	if (!ParseConfigFile(ConfigFileName, NULL, 0, elevel, &head, &tail))
  	{
  		/* Syntax error(s) detected in the file, so bail out */
  		error = true;
--- 129,135 ----
  	/* Parse the file into a list of option names and values */
  	head = tail = NULL;
  
! 	if (!ParseConfigFile(ConfigFileName, NULL, true, 0, elevel, &head, &tail))
  	{
  		/* Syntax error(s) detected in the file, so bail out */
  		error = true;
*************** ProcessConfigFile(GucContext context)
*** 363,369 ****
   * and absolute-ifying the path name if necessary.
   */
  bool
! ParseConfigFile(const char *config_file, const char *calling_file,
  				int depth, int elevel,
  				ConfigVariable **head_p,
  				ConfigVariable **tail_p)
--- 363,369 ----
   * and absolute-ifying the path name if necessary.
   */
  bool
! ParseConfigFile(const char *config_file, const char *calling_file, bool strict,
  				int depth, int elevel,
  				ConfigVariable **head_p,
  				ConfigVariable **tail_p)
*************** ParseConfigFile(const char *config_file,
*** 414,424 ****
  	fp = AllocateFile(config_file, "r");
  	if (!fp)
  	{
! 		ereport(elevel,
! 				(errcode_for_file_access(),
! 				 errmsg("could not open configuration file \"%s\": %m",
! 						config_file)));
! 		return false;
  	}
  
  	OK = ParseConfigFp(fp, config_file, depth, elevel, head_p, tail_p);
--- 414,430 ----
  	fp = AllocateFile(config_file, "r");
  	if (!fp)
  	{
! 		if (strict)
! 		{
! 			ereport(elevel,
! 					(errcode_for_file_access(),
! 					 errmsg("could not open configuration file \"%s\": %m",
! 							config_file)));
! 			return false;
! 		}
! 
! 		elog(LOG, "skipping missing configuration file \"%s\"", config_file);
! 		return OK;
  	}
  
  	OK = ParseConfigFp(fp, config_file, depth, elevel, head_p, tail_p);
*************** ParseConfigFp(FILE *fp, const char *conf
*** 512,518 ****
  		}
  
  		/* OK, process the option name and value */
! 		if (guc_name_compare(opt_name, "include") == 0)
  		{
  			/*
  			 * An include directive isn't a variable and should be processed
--- 518,541 ----
  		}
  
  		/* OK, process the option name and value */
! 		if (guc_name_compare(opt_name, "include_if_exists") == 0)
! 		{
! 			/*
! 			 * An include_if_exists directive isn't a variable and should be
! 			 * processed immediately.
! 			 */
! 			unsigned int save_ConfigFileLineno = ConfigFileLineno;
! 
! 			if (!ParseConfigFile(opt_value, config_file, false,
! 								 depth + 1, elevel,
! 								 head_p, tail_p))
! 				OK = false;
! 			yy_switch_to_buffer(lex_buffer);
! 			ConfigFileLineno = save_ConfigFileLineno;
! 			pfree(opt_name);
! 			pfree(opt_value);
! 		}
! 		else if (guc_name_compare(opt_name, "include") == 0)
  		{
  			/*
  			 * An include directive isn't a variable and should be processed
*************** ParseConfigFp(FILE *fp, const char *conf
*** 520,526 ****
  			 */
  			unsigned int save_ConfigFileLineno = ConfigFileLineno;
  
! 			if (!ParseConfigFile(opt_value, config_file,
  								 depth + 1, elevel,
  								 head_p, tail_p))
  				OK = false;
--- 543,549 ----
  			 */
  			unsigned int save_ConfigFileLineno = ConfigFileLineno;
  
! 			if (!ParseConfigFile(opt_value, config_file, true,
  								 depth + 1, elevel,
  								 head_p, tail_p))
  				OK = false;
diff --git a/src/include/utils/guc.h b/src/include/utils/guc.h
index 8e3057a..52109e5 100644
*** a/src/include/utils/guc.h
--- b/src/include/utils/guc.h
*************** typedef struct ConfigVariable
*** 111,117 ****
  } ConfigVariable;
  
  extern bool ParseConfigFile(const char *config_file, const char *calling_file,
! 				int depth, int elevel,
  				ConfigVariable **head_p, ConfigVariable **tail_p);
  extern bool ParseConfigFp(FILE *fp, const char *config_file,
  			  int depth, int elevel,
--- 111,117 ----
  } ConfigVariable;
  
  extern bool ParseConfigFile(const char *config_file, const char *calling_file,
! 				bool strict, int depth, int elevel,
  				ConfigVariable **head_p, ConfigVariable **tail_p);
  extern bool ParseConfigFp(FILE *fp, const char *config_file,
  			  int depth, int elevel,
