diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml
index 77a9303..7fe4be2 100644
--- a/doc/src/sgml/config.sgml
+++ b/doc/src/sgml/config.sgml
@@ -2193,7 +2193,13 @@ include 'filename'
         Specifies the maximum number of concurrent connections from
         standby servers or streaming base backup clients (i.e., the
         maximum number of simultaneously running WAL sender
-        processes). The default is zero, meaning replication is
+        processes). The number of WAL senders is also reserved from
+        <xref linkend="guc-max-connections">. Whenever the number of connections
+        is at least <varname>max_connections</varname> minus
+        <varname>superuser_reserved_connections</varname> minus
+        <varname>max_wal_senders</varname> only superuser and replication
+        connections are allowed.
+        The default is zero, meaning replication is
         disabled. WAL sender processes count towards the total number
         of connections, so the parameter cannot be set higher than
         <xref linkend="guc-max-connections">.  This parameter can only
diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c
index 98086f7..dff67fc 100644
--- a/src/backend/postmaster/postmaster.c
+++ b/src/backend/postmaster/postmaster.c
@@ -198,10 +198,10 @@ char	   *ListenAddresses;
  * ReservedBackends is the number of backends reserved for superuser use.
  * This number is taken out of the pool size given by MaxBackends so
  * number of backend slots available to non-superusers is
- * (MaxBackends - ReservedBackends).  Note what this really means is
- * "if there are <= ReservedBackends connections available, only superusers
- * can make new connections" --- pre-existing superuser connections don't
- * count against the limit.
+ * (MaxBackends - ReservedBackends - max_wal_senders).  Note what this really
+ * means is "if there are <= ReservedBackends connections available, only
+ * superusers can make new connections" --- pre-existing superuser connections
+ * don't count against the limit.
  */
 int			ReservedBackends;
 
diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c
index afd559d..919409b 100644
--- a/src/backend/replication/walsender.c
+++ b/src/backend/replication/walsender.c
@@ -94,7 +94,13 @@ bool		am_cascading_walsender = false;		/* Am I cascading WAL to
 												 * another standby ? */
 
 /* User-settable parameters for walsender */
-int			max_wal_senders = 0;	/* the maximum number of concurrent walsenders */
+/*
+ * This is the maximum number of concurrent wal senders and the amount of
+ * reserved slots from max_connections for wal senders. If the number of free
+ * slots (max_connections - superuser_reserved_connections -  max_wal_senders)
+ * is depleted, only superusers and wal senders can connect.
+ */
+int			max_wal_senders = 0;
 int			wal_sender_timeout = 60 * 1000;		/* maximum time to send one
 												 * WAL data message */
 
diff --git a/src/backend/utils/init/postinit.c b/src/backend/utils/init/postinit.c
index 2c7f0f1..c03c5bf 100644
--- a/src/backend/utils/init/postinit.c
+++ b/src/backend/utils/init/postinit.c
@@ -700,10 +700,18 @@ InitPostgres(const char *in_dbname, Oid dboid, const char *username,
 	}
 
 	/*
-	 * 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.
+	 * The last few connections slots are reserved for superusers and wal_senders.
+	 */
+	if (!am_superuser && max_wal_senders > 0 &&
+		!HaveNFreeProcs(max_wal_senders + 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 superuser reserved slots, which are
+	 * intended for interactive use.
 	 */
 	if ((!am_superuser || am_walsender) &&
 		ReservedBackends > 0 &&
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index dfc6704..f6ab4ff 100644
--- a/src/backend/utils/misc/guc.c
+++ b/src/backend/utils/misc/guc.c
@@ -2064,7 +2064,8 @@ static struct config_int ConfigureNamesInt[] =
 	{
 		/* see max_connections */
 		{"max_wal_senders", PGC_POSTMASTER, REPLICATION_SENDING,
-			gettext_noop("Sets the maximum number of simultaneously running WAL sender processes."),
+			gettext_noop("Sets the maximum number of wal sender connections and reserves "
+						 "them from being used non-superuser connections."),
 			NULL
 		},
 		&max_wal_senders,
