diff --git a/src/xpdev/multisock.c b/src/xpdev/multisock.c
index 482835cdfc51bb07fd75041862115dc57c5b8745..6de32e108959e21a94c1c2caa3bd87affdcc213b 100644
--- a/src/xpdev/multisock.c
+++ b/src/xpdev/multisock.c
@@ -4,7 +4,6 @@
 #include <stdlib.h>
 #include <string.h>
 #include "gen_defs.h"
-#include "genwrap.h"
 #include "sockwrap.h"
 #include "dirwrap.h"
 #include "multisock.h"
@@ -256,18 +255,22 @@ static void btox(char *hexstr, const char *srcbuf, size_t srcbuflen, size_t hexs
 
 static BOOL read_socket(SOCKET sock, char *buffer, size_t len, int (*lprintf)(int level, const char *fmt, ...))
 {
+	fd_set         socket_set;
+	struct timeval tv;
 	size_t            i;
 	int            j,rd;
 	unsigned char           ch;
 	char           err[128];
-	struct pollfd pfd;
 
 	for (i=0;i<len;i++) {
-		pfd.fd = sock;
-		pfd.events = POLLIN;
-		pfd.revents = 0;
+		FD_ZERO(&socket_set);
+		FD_SET(sock,&socket_set);
 
-		if ((j = poll(&pfd, 1, 1000)) > 0) {
+		// We'll wait 1 secs to read from the socket.
+		tv.tv_sec=1;
+		tv.tv_usec=0;
+
+		if((j=select(sock+1,&socket_set,NULL,NULL,&tv))>0) {
 			rd = recv(sock,&ch,1,0);
 			if (rd == 0) {
 				lprintf(LOG_WARNING,"%04d multisock read_socket() - remote closed the connection",sock);
@@ -286,7 +289,7 @@ static BOOL read_socket(SOCKET sock, char *buffer, size_t len, int (*lprintf)(in
 			return FALSE;
 
 		} else {
-			lprintf(LOG_WARNING,"%04d multisock read_socket() - poll() returned [%d] with error [%s].",sock,j,socket_strerror(socket_errno,err,sizeof(err)));
+			lprintf(LOG_WARNING,"%04d multisock read_socket() - select() returned [%d] with error [%s].",sock,j,socket_strerror(socket_errno,err,sizeof(err)));
 			return FALSE;
 		}
 	}
@@ -321,50 +324,44 @@ static BOOL read_socket_line(SOCKET sock, char *buffer, size_t buflen, int (*lpr
 SOCKET DLLCALL xpms_accept(struct xpms_set *xpms_set, union xp_sockaddr * addr, 
 	socklen_t * addrlen, unsigned int timeout, uint32_t flags, void **cb_data)
 {
+	fd_set         read_fs;
 	size_t         i;
+	struct timeval tv;
+	struct timeval *tvp;
+	SOCKET         max_sock=0;
 	SOCKET         ret;
 	char           hapstr[128];
 	char           haphex[256];
 	char           *p, *tok;
 	long           l;
 	void           *vp;
-	struct pollfd *pfds;
-	int timeo;
-	nfds_t cnt = 0;
-
-	if (xpms_set->sock_count < 1) {	// Just sleep()..
-		SLEEP(timeout);
-		return INVALID_SOCKET;
-	}
-
-	pfds = malloc(sizeof(struct pollfd) * xpms_set->sock_count);
-	if (pfds == NULL)
-		return INVALID_SOCKET;
 
+	FD_ZERO(&read_fs);
 	for(i=0; i<xpms_set->sock_count; i++) {
 		if(xpms_set->socks[i].sock == INVALID_SOCKET)
 			continue;
-		pfds[cnt].fd = xpms_set->socks[i].sock;
-		pfds[cnt].events = POLLIN;
-		pfds[cnt].revents = 0;
-		cnt++;
+		FD_SET(xpms_set->socks[i].sock, &read_fs);
+		if(xpms_set->socks[i].sock >= max_sock)
+			max_sock=xpms_set->socks[i].sock+1;
 	}
 
 	if(timeout==XPMS_FOREVER)
-		timeo = -1;
-	else
-		timeo = timeout;
-
-	switch(poll(pfds, cnt, timeo)) {
+		tvp=NULL;
+	else {
+		tv.tv_sec=timeout/1000;
+		tv.tv_usec=(timeout%1000)*1000;
+		tvp=&tv;
+	}
+	switch(select(max_sock, &read_fs, NULL, NULL, tvp)) {
 		case 0:
 			return INVALID_SOCKET;
 		case -1:
 			return SOCKET_ERROR;
 		default:
-			for (i = 0, cnt = 0; i < xpms_set->sock_count; i++) {
+			for(i=0; i<xpms_set->sock_count; i++) {
 				if(xpms_set->socks[i].sock == INVALID_SOCKET)
 					continue;
-				if (pfds[cnt++].revents & POLLIN) {
+				if(FD_ISSET(xpms_set->socks[i].sock, &read_fs)) {
 					if(cb_data)
 						*cb_data=xpms_set->socks[i].cb_data;
 					ret =  accept(xpms_set->socks[i].sock, &addr->addr, addrlen);