diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml
new file mode 100644
index 6a4d15f..cd6264e
*** a/doc/src/sgml/config.sgml
--- b/doc/src/sgml/config.sgml
*************** include 'filename'
*** 530,535 ****
--- 530,562 ----
        </listitem>
       </varlistentry>
  
+     <varlistentry id="guc-replication_reserved_connections"
+     xreflabel="replication_reserved_connections">
+       <term><varname>replication_reserved_connections</varname></term>
+       (<type>integer</type>)</term>
+       <indexterm>
+        <primary><varname>replication_reserved_connections</> configuration parameter</primary>
+       </indexterm>
+       <listitem>
+        <para>
+         Determines the number of connection <quote>slots</quote> that
+         are reserved for connections by <productname>PostgreSQL</>
+         replication users.  At most <xref linkend="guc-max-connections">
+         connections can ever be active simultaneously.  Whenever the
+         number of active concurrent connections is at least
+         <varname>max_connections</> minus
+         <varname>superuser_reserved_connections</varname> minus
+         <varname>replication_reserved_connections</varname>, new
+         connections will be accepted only for replication and superusers.
+        </para>
+ 
+        <para>
+         The default value is zero connections. The value must be less
+         than the value of <varname>max_connections</varname>. This
+         parameter can only be set at server start.
+        </para>
+     </varlistentry>
+ 
       <varlistentry id="guc-unix-socket-directories" xreflabel="unix_socket_directories">
        <term><varname>unix_socket_directories</varname> (<type>string</type>)</term>
        <indexterm>
diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c
new file mode 100644
index 496192d..ce37b0d
*** a/src/backend/postmaster/postmaster.c
--- b/src/backend/postmaster/postmaster.c
*************** char	   *ListenAddresses;
*** 224,229 ****
--- 224,238 ----
   * count against the limit.
   */
  int			ReservedBackends;
+ /*
+  * ReservedReplicationBackends is the number of backends reserved for
+  * replication user use. Like ReservedBackends the number will be taken out
+  * of the pool size given by MaxBackends so the number available to
+  * non-superusers is
+  * (MaxBackends - ReservedBackends - ReservedReplicationBackends).
+  * This option does not block superusers.
+  */
+ int			ReservedReplicationBackends;
  
  /* The socket(s) we're listening to. */
  #define MAXLISTEN	64
diff --git a/src/backend/utils/init/postinit.c b/src/backend/utils/init/postinit.c
new file mode 100644
index 2c7f0f1..d0f8f91
*** a/src/backend/utils/init/postinit.c
--- b/src/backend/utils/init/postinit.c
*************** InitPostgres(const char *in_dbname, Oid 
*** 700,707 ****
  	}
  
  	/*
! 	 * The last few connections slots are reserved for superusers. Although
! 	 * replication connections currently require superuser privileges, we
  	 * don't allow them to consume the reserved slots, which are intended for
  	 * interactive use.
  	 */
--- 700,716 ----
  	}
  
  	/*
! 	 * The last few connections slots are reserved for superusers and replication.
! 	 */
! 	if (!am_superuser &&
! 		(ReservedReplicationBackends > 0 || ReservedBackends > 0) &&
! 		!HaveNFreeProcs(ReservedReplicationBackends + ReservedBackends))
! 		ereport(FATAL,
! 				(errcode(ERRCODE_TOO_MANY_CONNECTIONS),
! 				 errmsg("remaining connection slots are reserved for replication and superuser connections")));
! 
! 	/*
! 	 * Although replication connections currently require superuser privileges, we
  	 * don't allow them to consume the reserved slots, which are intended for
  	 * interactive use.
  	 */
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
new file mode 100644
index 5aefd1b..b03d722
*** a/src/backend/utils/misc/guc.c
--- b/src/backend/utils/misc/guc.c
*************** static struct config_int ConfigureNamesI
*** 1633,1638 ****
--- 1633,1647 ----
  		3, 0, MAX_BACKENDS,
  		NULL, NULL, NULL
  	},
+ 	{
+ 		{"replication_reserved_connections", PGC_POSTMASTER, CONN_AUTH_SETTINGS,
+ 			gettext_noop("Sets the number of connection slots reserved for replication."),
+ 			NULL
+ 		},
+ 		&ReservedReplicationBackends,
+ 		1, 0, MAX_BACKENDS,
+ 		NULL, NULL, NULL
+ 	},
  
  	/*
  	 * We sometimes multiply the number of shared buffers by two without
diff --git a/src/backend/utils/misc/postgresql.conf.sample b/src/backend/utils/misc/postgresql.conf.sample
new file mode 100644
index d69a02b..0be67af
*** a/src/backend/utils/misc/postgresql.conf.sample
--- b/src/backend/utils/misc/postgresql.conf.sample
***************
*** 65,70 ****
--- 65,71 ----
  # Note:  Increasing max_connections costs ~400 bytes of shared memory per
  # connection slot, plus lock space (see max_locks_per_transaction).
  #superuser_reserved_connections = 3	# (change requires restart)
+ #replication_reserved_connections = 0	# (change requires restart)
  #unix_socket_directories = '/tmp'	# comma-separated list of directories
  					# (change requires restart)
  #unix_socket_group = ''			# (change requires restart)
diff --git a/src/include/postmaster/postmaster.h b/src/include/postmaster/postmaster.h
new file mode 100644
index c090595..dd2f049
*** a/src/include/postmaster/postmaster.h
--- b/src/include/postmaster/postmaster.h
***************
*** 16,21 ****
--- 16,22 ----
  /* GUC options */
  extern bool EnableSSL;
  extern int	ReservedBackends;
+ extern int	ReservedReplicationBackends;
  extern int	PostPortNumber;
  extern int	Unix_socket_permissions;
  extern char *Unix_socket_group;
