diff --git a/src/xpdev/multisock.c b/src/xpdev/multisock.c
index 3ca1b24d06b09ffe5b01648f89ad52399334e729..8586eb9f56eefd52a7fa4383a509fdfa86765128 100644
--- a/src/xpdev/multisock.c
+++ b/src/xpdev/multisock.c
@@ -42,7 +42,7 @@ void xpms_destroy(struct xpms_set *xpms_set)
 
 BOOL xpms_add(struct xpms_set *xpms_set, int domain, int type,
 	int protocol, const char *addr, uint16_t port, const char *prot, 
-	void *cbdata)
+	void (*sock_init)(SOCKET, void *), void(*bind_init)(BOOL), void *cbdata)
 {
 	struct xpms_sockdef	*new_socks;
     struct addrinfo		hints;
@@ -92,13 +92,27 @@ BOOL xpms_add(struct xpms_set *xpms_set, int domain, int type,
 			FREE_AND_NULL(xpms_set->socks[xpms_set->sock_count].prot);
 			continue;
 		}
+		if(sock_init)
+			sock_init(cb_data);
 
+		if(bind_init) {
+			if(port < IPPORT_RESERVED && port > 0)
+				bind_init(FALSE);
+		}
 		if(retry_bind(xpms_set->socks[xpms_set->sock_count].sock, cur->ai_addr, cur->ai_addrlen, xpms_set->retries, xpms_set->wait_secs, prot, xpms_set->lprintf)==-1) {
 			closesocket(xpms_set->socks[xpms_set->sock_count].sock);
 			FREE_AND_NULL(xpms_set->socks[xpms_set->sock_count].address);
 			FREE_AND_NULL(xpms_set->socks[xpms_set->sock_count].prot);
+			if(bind_init) {
+				if(startup->telnet_port < IPPORT_RESERVED)
+					bind_init(TRUE);
+			}
 			continue;
 		}
+		if(bind_init) {
+			if(port < IPPORT_RESERVED &&  && port > 0)
+				bind_init(TRUE);
+		}
 
 		if(!listen(xpms_set->socks[xpms_set->sock_count].sock, SOMAXCONN)) {
 			if(xpms_set->lprintf)
diff --git a/src/xpdev/multisock.h b/src/xpdev/multisock.h
index 2441b979b1fcaebb599dd6edb7cbc5bb613b2f4a..b836b5d50afc264e619b93f6dda589b06b5592a5 100644
--- a/src/xpdev/multisock.h
+++ b/src/xpdev/multisock.h
@@ -30,7 +30,7 @@ struct xpms_set *xpms_create(unsigned int retries, unsigned int wait_secs,
 void xpms_destroy(struct xpms_set *xpms_set);
 BOOL xpms_add(struct xpms_set *xpms_set, int domain, int type,
 	int protocol, const char *addr, uint16_t port, const char *prot, 
-	void *cbdata);
+	void (*sock_init)(SOCKET, void *), void(*bind_init)(BOOL), void *cbdata);
 SOCKET xpms_accept(struct xpms_set *, struct sockaddr * addr, 
 	socklen_t * addrlen, unsigned int timeout, void **cb_data);