diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c
index dd7dd55..a4745cc 100644
--- a/src/backend/postmaster/postmaster.c
+++ b/src/backend/postmaster/postmaster.c
@@ -156,9 +156,16 @@ static Backend *ShmemBackendArray;
 
 /* The socket number we are listening for connections on */
 int			PostPortNumber;
+
+/* UNIX socket directory */
 char	   *UnixSocketDir;
+
+/* Addresses to bind to, for port number above */
 char	   *ListenAddresses;
 
+/* Additional sockets */
+char	   *additional_sockets;
+
 /*
  * ReservedBackends is the number of backends reserved for superuser use.
  * This number is taken out of the pool size given by MaxBackends so
@@ -896,6 +903,86 @@ PostmasterMain(int argc, char *argv[])
 		pfree(rawstring);
 	}
 
+	if (additional_sockets)
+	{
+		char	   *rawstring;
+		List	   *elemlist;
+		ListCell   *l;
+
+		/* Need a modifiable copy of additional_sockets */
+		rawstring = pstrdup(additional_sockets);
+
+		/* Parse string into list of identifiers */
+		if (!SplitIdentifierString(rawstring, ',', &elemlist))
+		{
+			/* syntax error in list */
+			ereport(FATAL,
+					(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+					 errmsg("invalid list syntax for \"additional_sockets\"")));
+		}
+
+		foreach(l, elemlist)
+		{
+			char	   *cursocket = (char *) lfirst(l);
+			char	   *colon;
+			char	   *host;
+			char	   *port;
+			int64		portnum;
+			char	   *endptr;
+			bool		bad_strtol;
+
+			/* syntax is port or host:port */
+			colon = strchr(cursocket, ':');
+			if (colon != NULL)
+			{
+				host = cursocket;
+				port = colon + 1;
+				*colon = '\0';
+			}
+			else
+			{
+				host = NULL;
+				port = cursocket;
+			}
+
+			/*
+			 * convert port number to integer, ignoring optional trailing
+			 * whitespace).  strtol should ignore leading whitespace, too.
+			 */
+			portnum = strtol(port, &endptr, 0);
+			bad_strtol = (errno == ERANGE);
+			while (isspace((unsigned char) *endptr))
+				endptr++;
+			if (*endptr != '\0')
+				ereport(FATAL,
+						(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+						 errmsg("port number \"%s\" invalid in \"additional_sockets\"", port)));
+			if (bad_strtol || portnum < 1 || portnum > 65535)
+				ereport(FATAL,
+						(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+						 errmsg("port number \"%s\" out of range in \"additional_sockets\"", port)));
+
+
+			status = StreamServerPort(AF_UNSPEC, host,
+									  (unsigned short) portnum,
+									  UnixSocketDir,
+									  ListenSocket, MAXLISTEN);
+
+			if (status != STATUS_OK)
+			{
+				/* put the colon back, for error-reporting purposes */
+				if (colon != NULL)
+					*colon = ':';
+				ereport(WARNING,
+						(errmsg("could not create additional socket for \"%s\"",
+								cursocket)));
+			}
+		}
+
+		list_free(elemlist);
+		pfree(rawstring);
+	}
+
 #ifdef USE_BONJOUR
 	/* Register for Bonjour only if we opened TCP socket(s) */
 	if (enable_bonjour && ListenSocket[0] != PGINVALID_SOCKET)
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index d75ab43..2429011 100644
--- a/src/backend/utils/misc/guc.c
+++ b/src/backend/utils/misc/guc.c
@@ -2650,6 +2650,16 @@ static struct config_string ConfigureNamesString[] =
 		NULL, NULL, NULL
 	},
 
+	{
+		{"additional_sockets", PGC_POSTMASTER, CONN_AUTH_SETTINGS,
+			gettext_noop("Listen on additional sockets."),
+			NULL
+		},
+		&additional_sockets,
+		"",
+		NULL, NULL, NULL
+	},
+
 	/* See main.c about why defaults for LC_foo are not all alike */
 
 	{
diff --git a/src/backend/utils/misc/postgresql.conf.sample b/src/backend/utils/misc/postgresql.conf.sample
index fa75d00..ce1c385 100644
--- a/src/backend/utils/misc/postgresql.conf.sample
+++ b/src/backend/utils/misc/postgresql.conf.sample
@@ -61,6 +61,8 @@
 					# defaults to 'localhost'; use '*' for all
 					# (change requires restart)
 #port = 5432				# (change requires restart)
+#additional_sockets = ''	# comma-separated list of [host:]port
+					# (change requires restart)
 #max_connections = 100			# (change requires restart)
 # Note:  Increasing max_connections costs ~400 bytes of shared memory per
 # connection slot, plus lock space (see max_locks_per_transaction).
diff --git a/src/include/postmaster/postmaster.h b/src/include/postmaster/postmaster.h
index dded0e6..3d9ea41 100644
--- a/src/include/postmaster/postmaster.h
+++ b/src/include/postmaster/postmaster.h
@@ -17,6 +17,7 @@
 extern bool EnableSSL;
 extern int	ReservedBackends;
 extern int	PostPortNumber;
+extern char *additional_sockets;
 extern int	Unix_socket_permissions;
 extern char *Unix_socket_group;
 extern char *UnixSocketDir;