diff --git a/libs/uw-imap/Makefile b/libs/uw-imap/Makefile
new file mode 100644
index 000000000..b3d4357da
--- /dev/null
+++ b/libs/uw-imap/Makefile
@@ -0,0 +1,70 @@
+#
+# Copyright (C) 2017 Lucian Cristian <lucian.cristian@gmail.com>
+#
+
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=uw-imap
+PKG_VERSION:=2007f
+PKG_RELEASE:=1
+
+PKG_SOURCE:=imap-$(PKG_VERSION).tar.gz
+PKG_SOURCE_URL:= \
+	https://www.mirrorservice.org/sites/ftp.cac.washington.edu/imap \
+	http://ftp.ntua.gr/pub/net/mail/imap \
+	http://gd.tuwien.ac.at/infosys/mail/imap
+
+PKG_HASH:=53e15a2b5c1bc80161d42e9f69792a3fa18332b7b771910131004eb520004a28
+PKG_BUILD_DIR:=$(BUILD_DIR)/imap-$(PKG_VERSION)
+
+PKG_MAINTAINER:=Lucian Cristian <lucian.cristian@gmail.com>
+
+PKG_LICENSE:=Apache-2.0
+PKG_LICENSE_FILES:=LICENSE.txt
+
+PKG_FIXUP:=autoreconf
+
+include $(INCLUDE_DIR)/package.mk
+
+define Package/uw-imap
+  SECTION:=libs
+  CATEGORY:=Libraries
+  TITLE:=University of Washington IMAP toolkit
+  URL:=https://www.washington.edu/imap/
+  DEPENDS:=+libpthread +libopenssl
+endef
+
+define Package/uw-imap/description
+    The UW IMAP tookit includes the following:
+    c-lient library : an API (application programming interface) used to build email clients and servers,
+    including support for IMAP,POP3, SMTP and NNTP protocols and for local mailbox file access on Unix and Windows
+endef
+
+TARGET_CFLAGS += \
+	-fPIC -DPIC -D_REENTRANT -DDISABLE_POP_PROXY -fno-strict-aliasing -Wno-pointer-sign \
+	-Wno-implicit-function-declaration -Wno-incompatible-pointer-types
+
+MAKE_FLAGS += \
+	SSLINCLUDE=$(STAGING_DIR)/usr/include SSLCERTS=/etc/ssl/certs GCCOPTLEVEL=" -Os" \
+	SSLDIR=$(STAGING_DIR)/usr SHLIBNAME=libc-client.so.$(PKG_VERSION) $(if $(CONFIG_IPV6),IP=6,IP=4)
+
+define Build/Compile
+    $(MAKE) -C $(PKG_BUILD_DIR) slx EXTRACFLAGS='$(TARGET_CFLAGS)' CC='$(TARGET_CC)' $(MAKE_FLAGS)
+endef
+
+define Build/InstallDev
+	$(INSTALL_DIR)	$(1)/usr/lib \
+			$(1)/usr/include
+	$(CP) $(PKG_BUILD_DIR)/c-client/libc-client.so.$(PKG_VERSION) $(1)/usr/lib/
+	$(LN) libc-client.so.$(PKG_VERSION) $(1)/usr/lib/libc-client.so
+	$(CP) $(PKG_BUILD_DIR)/c-client/*.h $(1)/usr/include/
+endef
+
+define Package/uw-imap/install
+	$(INSTALL_DIR) $(1)/usr/lib
+	$(CP) $(PKG_BUILD_DIR)/c-client/libc-client.so.$(PKG_VERSION) $(1)/usr/lib/
+	$(LN) libc-client.so.$(PKG_VERSION) $(1)/usr/lib/libc-client.so
+endef
+
+
+$(eval $(call BuildPackage,uw-imap))
diff --git a/libs/uw-imap/patches/001-fix_Makefiles_and_shlib.patch b/libs/uw-imap/patches/001-fix_Makefiles_and_shlib.patch
new file mode 100644
index 000000000..cf0cc7f1b
--- /dev/null
+++ b/libs/uw-imap/patches/001-fix_Makefiles_and_shlib.patch
@@ -0,0 +1,167 @@
+--- a/Makefile	2017-11-13 01:13:36.340236114 +0200
++++ b/Makefile	2017-11-13 01:34:56.869682313 +0200
+@@ -638,10 +638,6 @@
+ 	@echo + yourself, try adding IP6=4 to the make command line.
+ 	@echo +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 	@echo
+-	@echo Do you want to build with IPv6 anyway?  Type y or n please:
+-	@$(SH) -c 'read x; case "$$x" in y) exit 0;; *) (make noip6;exit 1);; esac'
+-	@echo OK, I will remember that you really want to build with IPv6.
+-	@echo You will not see this message again.
+ 	@$(TOUCH) ip6
+ 
+ noip6:
+@@ -678,20 +674,18 @@
+ 	$(TOOLS)/$@ "$(LN)" src/tmail tmail
+ 	$(LN) $(TOOLS)/$@ .
+ 
+-build:	OSTYPE rebuild rebuildclean bundled
++build:	OSTYPE rebuild rebuildclean
+ 
+ OSTYPE:
+ 	@$(MAKE) ip$(IP)
+ 	@echo Building c-client for $(BUILDTYPE)...
+ 	@$(TOUCH) SPECIALS
+-	echo `$(CAT) SPECIALS` $(EXTRASPECIALS) > c-client/SPECIALS
+ 	$(CD) c-client;$(MAKE) $(BUILDTYPE) EXTRACFLAGS='$(EXTRACFLAGS)'\
+ 	 EXTRALDFLAGS='$(EXTRALDFLAGS)'\
+ 	 EXTRADRIVERS='$(EXTRADRIVERS)'\
+ 	 EXTRAAUTHENTICATORS='$(EXTRAAUTHENTICATORS)'\
+ 	 PASSWDTYPE=$(PASSWDTYPE) SSLTYPE=$(SSLTYPE) IP=$(IP)\
+-	 $(SPECIALS) $(EXTRASPECIALS)
+-	echo $(BUILDTYPE) > OSTYPE
++	 $(SPECIALS) $(EXTRASPECIALS) OSTYPE=$(BUILDTYPE)
+ 	$(TOUCH) rebuild
+ 
+ rebuild:
+--- a/src/osdep/unix/Makefile	2017-11-13 01:37:58.674011768 +0200
++++ b/src/osdep/unix/Makefile	2017-11-13 03:30:18.204908962 +0200
+@@ -96,11 +96,11 @@
+ LOGINPW=std
+ SIGTYPE=bsd
+ CRXTYPE=std
+-ACTIVEFILE=/usr/lib/news/active
+-SPOOLDIR=/usr/spool
++ACTIVEFILE=/var/lib/news/active
++SPOOLDIR=/var/spool
+ MAILSPOOL=$(SPOOLDIR)/mail
+ NEWSSPOOL=$(SPOOLDIR)/news
+-RSHPATH=/usr/ucb/rsh
++RSHPATH=/usr/bin/rsh
+ MD5PWD=/etc/cram-md5.pwd
+ # Tries one of the test alternatives below if not specified.
+ LOCKPGM=
+@@ -154,7 +154,7 @@
+  dummy.o pseudo.o netmsg.o flstring.o fdstring.o \
+  rfc822.o nntp.o smtp.o imap4r1.o pop3.o \
+  unix.o mbx.o mmdf.o tenex.o mtx.o news.o phile.o mh.o mx.o mix.o
+-CFLAGS=-g
++CFLAGS=$(BASECFLAGS) $(EXTRACFLAGS) -DCHUNKSIZE=$(CHUNKSIZE)
+ 
+ CAT=cat
+ MAKE=make
+@@ -162,6 +162,16 @@
+ RM=rm -rf
+ SH=sh
+ 
++OSCFLAGS= $(SSLCFLAGS) \
++	 -DCREATEPROTO=$(CREATEPROTO) -DEMPTYPROTO=$(EMPTYPROTO) \
++	 -DMD5ENABLE=\"$(MD5PWD)\" -DMAILSPOOL=\"$(MAILSPOOL)\" \
++	 -DANONYMOUSHOME=\"$(MAILSPOOL)/anonymous\" \
++	 -DACTIVEFILE=\"$(ACTIVEFILE)\" -DNEWSSPOOL=\"$(NEWSSPOOL)\" \
++	 -DRSHPATH=\"$(RSHPATH)\" -DLOCKPGM=\"$(LOCKPGM)\" \
++	 -DLOCKPGM1=\"$(LOCKPGM1)\" -DLOCKPGM2=\"$(LOCKPGM2)\" \
++	 -DLOCKPGM3=\"$(LOCKPGM3)\"
++
++LDFLAGS= $(BASELDFLAGS) $(EXTRALDFLAGS) $(SSLLDFLAGS)
+ 
+ # Primary build command
+ 
+@@ -174,7 +184,7 @@
+ # Here if no make argument established
+ 
+ missing: osdep.h
+-	$(MAKE) all `$(CAT) SPECIALS`
++	$(MAKE) all $(SPECIALS)
+ 
+ osdep.h:
+ 	@echo You must specify what type of system
+@@ -674,7 +684,7 @@
+ 	@echo You are building for libc6/glibc versions of Secure Linux
+ 	@echo If you want libc5 versions you must use sl5 instead!
+ 	@echo If you want libc4 versions you must use sl4 instead!
+-	$(BUILD) `$(CAT) SPECIALS` OS=$@ \
++	$(BUILD) $(SPECIALS) OS=$@ \
+ 	 SIGTYPE=psx CHECKPW=psx CRXTYPE=nfs \
+ 	 SPOOLDIR=/var/spool \
+ 	 ACTIVEFILE=/var/lib/news/active \
+@@ -863,7 +873,7 @@
+ 	@$(SH) ARCHIVE
+ 
+ .c.o:
+-	`$(CAT) CCTYPE` -c `$(CAT) CFLAGS` $*.c
++	$(CC) -c $(CFLAGS) $*.c
+ 
+ 
+ # Cleanup
+@@ -922,8 +932,8 @@
+ 	@echo If you get No such file error messages for files x509.h, ssl.h,
+ 	@echo pem.h, buffer.h, bio.h, and crypto.h, that means that OpenSSL
+ 	@echo is not installed on your system.  Either install OpenSSL first
+-	@echo or build with command: make `$(CAT) OSTYPE` SSLTYPE=none
+-	`$(CAT) CCTYPE` -c `$(CAT) CFLAGS` `$(CAT) OSCFLAGS` -c osdep.c
++	@echo or build with command: make $(OSTYPE) SSLTYPE=none
++	$(CC) -c $(CFLAGS) $(OSCFLAGS) -c osdep.c
+ 
+ osdep.c: osdepbas.c osdepckp.c osdeplog.c osdepssl.c
+ 	$(CAT) osdepbas.c osdepckp.c osdeplog.c osdepssl.c > osdep.c
+@@ -962,21 +972,14 @@
+ 
+ # Once-only environment setup
+ 
+-once:	onceenv ckp$(PASSWDTYPE) ssl$(SSLTYPE) osdep.c
++once:	ssl$(SSLTYPE) onceenv ckp$(PASSWDTYPE) osdep.c
+ 
+ onceenv:
+ 	@echo Once-only environment setup...
+-	echo $(CC) > CCTYPE
+-	echo $(BASECFLAGS) '$(EXTRACFLAGS)' -DCHUNKSIZE=$(CHUNKSIZE) > CFLAGS
+-	echo -DCREATEPROTO=$(CREATEPROTO) -DEMPTYPROTO=$(EMPTYPROTO) \
+-	 -DMD5ENABLE=\"$(MD5PWD)\" -DMAILSPOOL=\"$(MAILSPOOL)\" \
+-	 -DANONYMOUSHOME=\"$(MAILSPOOL)/anonymous\" \
+-	 -DACTIVEFILE=\"$(ACTIVEFILE)\" -DNEWSSPOOL=\"$(NEWSSPOOL)\" \
+-	 -DRSHPATH=\"$(RSHPATH)\" -DLOCKPGM=\"$(LOCKPGM)\" \
+-	 -DLOCKPGM1=\"$(LOCKPGM1)\" -DLOCKPGM2=\"$(LOCKPGM2)\" \
+-	 -DLOCKPGM3=\"$(LOCKPGM3)\" > OSCFLAGS
+-	echo $(BASELDFLAGS) $(EXTRALDFLAGS) > LDFLAGS
+ 	echo "$(ARRC) $(ARCHIVE) $(BINARIES);$(RANLIB) $(ARCHIVE)" > ARCHIVE
++	echo "$(OSCFLAGS)" > OSCFLAGS
++	echo "$(CC) $(CFLAGS) $(OSCFLAGS) -shared  -Wl,-soname,libc-client.so \
++	-o $(SHLIBNAME) $(BINARIES) $(LDFLAGS)" >> ARCHIVE
+ 	echo $(OS) > OSTYPE
+ 	./drivers $(EXTRADRIVERS) $(DEFAULTDRIVERS) dummy
+ 	./mkauths $(EXTRAAUTHENTICATORS) $(DEFAULTAUTHENTICATORS)
+@@ -1055,7 +1058,6 @@
+ sbasic:	# UNIX OpenSSL
+ 	@echo Building with SSL
+ 	$(LN) ssl_unix.c osdepssl.c
+-	echo $(SSLCFLAGS) >> OSCFLAGS
+ 	echo "  ssl_onceonlyinit ();" >> linkage.c
+ 
+ snopwd:	# Plaintext disable
+@@ -1063,13 +1065,12 @@
+ 	echo "  mail_parameters (NIL,SET_DISABLEPLAINTEXT,(void *) 2);" >> linkage.c
+ 
+ sldunix:# Normal UNIX SSL load flags
+-	echo $(SSLLDFLAGS) >> LDFLAGS
++	@echo Normal UNIX SSL load flags
+ 
+ 
+ sldsco:	# SCO SSL load flags
+ # Note: Tim Rice says that SSL has to be lunk before other libraries on SCO.
+-	echo $(SSLLDFLAGS) `cat LDFLAGS` > LDFLAGS.tmp
+-	mv LDFLAGS.tmp LDFLAGS
++	@echo SCO SSL load flags
+ 
+ 
+ # A monument to a hack of long ago and far away...
diff --git a/libs/uw-imap/patches/002-imap-2004a-doc.patch b/libs/uw-imap/patches/002-imap-2004a-doc.patch
new file mode 100644
index 000000000..dcae4ab8e
--- /dev/null
+++ b/libs/uw-imap/patches/002-imap-2004a-doc.patch
@@ -0,0 +1,30 @@
+Patch by Robert Scheck <redhat@linuxnetz.de> for uw-imap >= 2004a, which corrects
+paths to imapd, ipop2d and ipop3d in the man pages. 
+
+This patch is based on Red Hat Bugzilla ID #127271 and solves ID #229781.
+
+--- imap-2004a/src/imapd/imapd.8		2004-05-18 19:46:54.000000000 +0200
++++ imap-2004a/src/imapd/imapd.8.doc		2004-07-23 15:24:17.000000000 +0200
+@@ -3,7 +3,7 @@
+ .SH NAME
+ IMAPd \- Internet Message Access Protocol server
+ .SH SYNOPSIS
+-.B /usr/etc/imapd
++.B /usr/sbin/imapd
+ .SH DESCRIPTION
+ .I imapd
+ is a server which supports the
+--- imap-2004a/src/ipopd/ipopd.8		2004-05-18 19:50:05.000000000 +0200
++++ imap-2004a/src/ipopd/ipopd.8.doc		2004-07-23 15:23:38.000000000 +0200
+@@ -3,9 +3,9 @@
+ .SH NAME
+ IPOPd \- Post Office Protocol server
+ .SH SYNOPSIS
+-.B /usr/etc/ipop2d
++.B /usr/sbin/ipop2d
+ .PP
+-.B /usr/etc/ipop3d
++.B /usr/sbin/ipop3d
+ .SH DESCRIPTION
+ .I ipop2d
+ and
diff --git a/libs/uw-imap/patches/003-imap-2007e-overflow.patch b/libs/uw-imap/patches/003-imap-2007e-overflow.patch
new file mode 100644
index 000000000..86512b29c
--- /dev/null
+++ b/libs/uw-imap/patches/003-imap-2007e-overflow.patch
@@ -0,0 +1,13 @@
+diff -up imap-2007e/src/c-client/rfc822.c.overflow imap-2007e/src/c-client/rfc822.c
+--- imap-2007e/src/c-client/rfc822.c.overflow	2008-12-12 11:08:26.000000000 -0600
++++ imap-2007e/src/c-client/rfc822.c	2009-07-07 19:27:20.057772757 -0500
+@@ -384,6 +384,9 @@ void rfc822_parse_content (BODY *body,ST
+ 	if (CHR (bs) == '\012'){/* following LF? */
+ 	  c = SNX (bs); i--;	/* yes, slurp it */
+ 	}
++	if (!i)			/* Make sure we don't get an overflow for */
++	  break;		/* messages ending on \015 (or the following */
++				/* i-- will cause i to be MAXINT. Not good.) */
+       case '\012':		/* at start of a line, start with -- ? */
+ 	if (!(i && i-- && ((c = SNX (bs)) == '-') && i-- &&
+ 	      ((c = SNX (bs)) == '-'))) break;
diff --git a/libs/uw-imap/patches/005-imap-2007e-authmd5.patch b/libs/uw-imap/patches/005-imap-2007e-authmd5.patch
new file mode 100644
index 000000000..66883a17a
--- /dev/null
+++ b/libs/uw-imap/patches/005-imap-2007e-authmd5.patch
@@ -0,0 +1,29 @@
+diff -up imap-2007e/src/c-client/auth_md5.c.authmd5 imap-2007e/src/c-client/auth_md5.c
+--- imap-2007e/src/c-client/auth_md5.c.authmd5	2008-06-04 13:18:34.000000000 -0500
++++ imap-2007e/src/c-client/auth_md5.c	2009-07-07 19:24:12.348005485 -0500
+@@ -42,17 +42,17 @@ typedef struct {
+ 
+ /* Prototypes */
+ 
+-long auth_md5_valid (void);
+-long auth_md5_client (authchallenge_t challenger,authrespond_t responder,
++static long auth_md5_valid (void);
++static long auth_md5_client (authchallenge_t challenger,authrespond_t responder,
+ 		      char *service,NETMBX *mb,void *stream,
+ 		      unsigned long *trial,char *user);
+-char *auth_md5_server (authresponse_t responder,int argc,char *argv[]);
+-char *auth_md5_pwd (char *user);
++static char *auth_md5_server (authresponse_t responder,int argc,char *argv[]);
++static char *auth_md5_pwd (char *user);
+ char *apop_login (char *chal,char *user,char *md5,int argc,char *argv[]);
+-char *hmac_md5 (char *text,unsigned long tl,char *key,unsigned long kl);
+-void md5_init (MD5CONTEXT *ctx);
+-void md5_update (MD5CONTEXT *ctx,unsigned char *data,unsigned long len);
+-void md5_final (unsigned char *digest,MD5CONTEXT *ctx);
++static char *hmac_md5 (char *text,unsigned long tl,char *key,unsigned long kl);
++static void md5_init (MD5CONTEXT *ctx);
++static void md5_update (MD5CONTEXT *ctx,unsigned char *data,unsigned long len);
++static void md5_final (unsigned char *digest,MD5CONTEXT *ctx);
+ static void md5_transform (unsigned long *state,unsigned char *block);
+ static void md5_encode (unsigned char *dst,unsigned long *src,int len);
+ static void md5_decode (unsigned long *dst,unsigned char *src,int len);
diff --git a/libs/uw-imap/patches/006-imap-2007f-format-security.patch b/libs/uw-imap/patches/006-imap-2007f-format-security.patch
new file mode 100644
index 000000000..244153e6d
--- /dev/null
+++ b/libs/uw-imap/patches/006-imap-2007f-format-security.patch
@@ -0,0 +1,12 @@
+diff -Naur imap-2007f.orig/src/osdep/unix/flocklnx.c imap-2007f/src/osdep/unix/flocklnx.c
+--- imap-2007f.orig/src/osdep/unix/flocklnx.c	2011-07-23 02:20:11.000000000 +0200
++++ imap-2007f/src/osdep/unix/flocklnx.c	2014-04-14 19:17:46.429000000 +0200
+@@ -57,7 +57,7 @@
+     case ENOLCK:		/* lock table is full */
+       sprintf (tmp,"File locking failure: %s",strerror (errno));
+       mm_log (tmp,WARN);	/* give the user a warning of what happened */
+-      if (!logged++) syslog (LOG_ERR,tmp);
++      if (!logged++) syslog (LOG_ERR, "%s", tmp);
+ 				/* return failure if non-blocking lock */
+       if (op & LOCK_NB) return -1;
+       sleep (5);		/* slow down in case it loops */
diff --git a/libs/uw-imap/patches/007-imap-2007e-poll.patch b/libs/uw-imap/patches/007-imap-2007e-poll.patch
new file mode 100644
index 000000000..e25f1b688
--- /dev/null
+++ b/libs/uw-imap/patches/007-imap-2007e-poll.patch
@@ -0,0 +1,192 @@
+http://anonscm.debian.org/cgit/collab-maint/uw-imap.git/plain/debian/patches/1005_poll.patch
+
+Description: Use poll(2) instead of select(2) to support more than 1024 file descriptors
+Author: Ben Smithurst <ben.smithurst@gradwell.com>
+Bug-Debian: https://bugs.debian.org/478193
+
+diff --git a/src/osdep/unix/os_lnx.c b/src/osdep/unix/os_lnx.c
+index 03fd17d..671bbd6 100644
+--- a/src/osdep/unix/os_lnx.c
++++ b/src/osdep/unix/os_lnx.c
+@@ -41,6 +41,7 @@
+ extern int errno;		/* just in case */
+ #include <pwd.h>
+ #include "misc.h"
++#include <poll.h>
+ 
+ 
+ #include "fs_unix.c"
+diff --git a/src/osdep/unix/os_slx.c b/src/osdep/unix/os_slx.c
+index c94d632..f6bf27d 100644
+--- a/src/osdep/unix/os_slx.c
++++ b/src/osdep/unix/os_slx.c
+@@ -42,6 +42,7 @@ extern int errno;		/* just in case */
+ #include <pwd.h>
+ #include <shadow.h>
+ #include "misc.h"
++#include <poll.h>
+ 
+ 
+ #include "fs_unix.c"
+diff --git a/src/osdep/unix/tcp_unix.c b/src/osdep/unix/tcp_unix.c
+index 795fb4f..c69eaec 100644
+--- a/src/osdep/unix/tcp_unix.c
++++ b/src/osdep/unix/tcp_unix.c
+@@ -235,12 +235,11 @@ TCPSTREAM *tcp_open (char *host,char *service,unsigned long port)
+ int tcp_socket_open (int family,void *adr,size_t adrlen,unsigned short port,
+ 		     char *tmp,int *ctr,char *hst)
+ {
+-  int i,ti,sock,flgs;
++  int i,ti,sock,flgs,tmo;
++  struct pollfd pfd;
+   size_t len;
+   time_t now;
+   struct protoent *pt = getprotobyname ("tcp");
+-  fd_set rfds,wfds,efds;
+-  struct timeval tmo;
+   struct sockaddr *sadr = ip_sockaddr (family,adr,adrlen,port,&len);
+   blocknotify_t bn = (blocknotify_t) mail_parameters (NIL,GET_BLOCKNOTIFY,NIL);
+ 				/* fetid Solaris */
+@@ -252,14 +251,6 @@ int tcp_socket_open (int family,void *adr,size_t adrlen,unsigned short port,
+     sprintf (tmp,"Unable to create TCP socket: %s",strerror (errno));
+     (*bn) (BLOCK_NONSENSITIVE,data);
+   }
+-  else if (sock >= FD_SETSIZE) {/* unselectable sockets are useless */
+-    sprintf (tmp,"Unable to create selectable TCP socket (%d >= %d)",
+-	     sock,FD_SETSIZE);
+-    (*bn) (BLOCK_NONSENSITIVE,data);
+-    close (sock);
+-    sock = -1;
+-    errno = EMFILE;
+-  }
+ 
+   else {			/* get current socket flags */
+     flgs = fcntl (sock,F_GETFL,0);
+@@ -284,16 +275,11 @@ int tcp_socket_open (int family,void *adr,size_t adrlen,unsigned short port,
+     if ((sock >= 0) && ctr) {	/* want open timeout? */
+       now = time (0);		/* open timeout */
+       ti = ttmo_open ? now + ttmo_open : 0;
+-      tmo.tv_usec = 0;
+-      FD_ZERO (&rfds);		/* initialize selection vector */
+-      FD_ZERO (&wfds);		/* initialize selection vector */
+-      FD_ZERO (&efds);		/* handle errors too */
+-      FD_SET (sock,&rfds);	/* block for error or readable or writable */
+-      FD_SET (sock,&wfds);
+-      FD_SET (sock,&efds);
++      pfd.fd = sock;
++      pfd.events = POLLIN | POLLOUT;
+       do {			/* block under timeout */
+-	tmo.tv_sec = ti ? ti - now : 0;
+-	i = select (sock+1,&rfds,&wfds,&efds,ti ? &tmo : NIL);
++	tmo = ti ? ti - now : 0;
++	i = poll (&pfd, 1, ti ? tmo * 1000 : -1);
+ 	now = time (0);		/* fake timeout if interrupt & time expired */
+ 	if ((i < 0) && (errno == EINTR) && ti && (ti <= now)) i = 0;
+       } while ((i < 0) && (errno == EINTR));
+@@ -302,7 +288,7 @@ int tcp_socket_open (int family,void *adr,size_t adrlen,unsigned short port,
+ 	fcntl (sock,F_SETFL,flgs);
+ 	/* This used to be a zero-byte read(), but that crashes Solaris */
+ 				/* get socket status */
+-	if(FD_ISSET(sock, &rfds)) while (((i = *ctr = read (sock,tmp,1)) < 0) && (errno == EINTR));
++	if(pfd.revents & POLLIN) while (((i = *ctr = read (sock,tmp,1)) < 0) && (errno == EINTR));
+       }	
+       if (i <= 0) {		/* timeout or error? */
+ 	i = i ? errno : ETIMEDOUT;/* determine error code */
+@@ -545,9 +531,8 @@ long tcp_getbuffer (TCPSTREAM *stream,unsigned long size,char *s)
+     stream->ictr -=n;
+   }
+   if (size) {
+-    int i;
+-    fd_set fds,efds;
+-    struct timeval tmo;
++    int i, tmo;
++    struct pollfd pfd;
+     time_t t = time (0);
+     blocknotify_t bn=(blocknotify_t) mail_parameters (NIL,GET_BLOCKNOTIFY,NIL);
+     (*bn) (BLOCK_TCPREAD,NIL);
+@@ -556,16 +541,13 @@ long tcp_getbuffer (TCPSTREAM *stream,unsigned long size,char *s)
+       time_t now = tl;
+       time_t ti = ttmo_read ? now + ttmo_read : 0;
+       if (tcpdebug) mm_log ("Reading TCP buffer",TCPDEBUG);
+-      tmo.tv_usec = 0;
+-      FD_ZERO (&fds);		/* initialize selection vector */
+-      FD_ZERO (&efds);		/* handle errors too */
+-				/* set bit in selection vectors */
+-      FD_SET (stream->tcpsi,&fds);
+-      FD_SET (stream->tcpsi,&efds);
++
++      pfd.events = POLLIN;
++      pfd.fd = stream->tcpsi;
+       errno = NIL;		/* initially no error */
+       do {			/* block under timeout */
+-	tmo.tv_sec = ti ? ti - now : 0;
+-	i = select (stream->tcpsi+1,&fds,NIL,&efds,ti ? &tmo : NIL);
++	tmo = ti ? ti - now : 0;
++	i = poll (&pfd, 1, ti ? tmo * 1000 : -1);
+ 	now = time (0);		/* fake timeout if interrupt & time expired */
+ 	if ((i < 0) && (errno == EINTR) && ti && (ti <= now)) i = 0;
+       } while ((i < 0) && (errno == EINTR));
+@@ -605,9 +587,8 @@ long tcp_getbuffer (TCPSTREAM *stream,unsigned long size,char *s)
+ 
+ long tcp_getdata (TCPSTREAM *stream)
+ {
+-  int i;
+-  fd_set fds,efds;
+-  struct timeval tmo;
++  int i, tmo;
++  struct pollfd pfd;
+   time_t t = time (0);
+   blocknotify_t bn = (blocknotify_t) mail_parameters (NIL,GET_BLOCKNOTIFY,NIL);
+   if (stream->tcpsi < 0) return NIL;
+@@ -617,15 +598,12 @@ long tcp_getdata (TCPSTREAM *stream)
+     time_t now = tl;
+     time_t ti = ttmo_read ? now + ttmo_read : 0;
+     if (tcpdebug) mm_log ("Reading TCP data",TCPDEBUG);
+-    tmo.tv_usec = 0;
+-    FD_ZERO (&fds);		/* initialize selection vector */
+-    FD_ZERO (&efds);		/* handle errors too */
+-    FD_SET (stream->tcpsi,&fds);/* set bit in selection vectors */
+-    FD_SET (stream->tcpsi,&efds);
++    pfd.fd = stream->tcpsi;
++    pfd.events = POLLIN;
+     errno = NIL;		/* initially no error */
+     do {			/* block under timeout */
+-      tmo.tv_sec = ti ? ti - now : 0;
+-      i = select (stream->tcpsi+1,&fds,NIL,&efds,ti ? &tmo : NIL);
++      tmo = ti ? ti - now : 0;
++      i = poll (&pfd, 1, ti ? tmo * 1000 : -1);
+       now = time (0);		/* fake timeout if interrupt & time expired */
+       if ((i < 0) && (errno == EINTR) && ti && (ti <= now)) i = 0;
+     } while ((i < 0) && (errno == EINTR));
+@@ -677,9 +655,8 @@ long tcp_soutr (TCPSTREAM *stream,char *string)
+ 
+ long tcp_sout (TCPSTREAM *stream,char *string,unsigned long size)
+ {
+-  int i;
+-  fd_set fds,efds;
+-  struct timeval tmo;
++  int i, tmo;
++  struct pollfd pfd;
+   time_t t = time (0);
+   blocknotify_t bn = (blocknotify_t) mail_parameters (NIL,GET_BLOCKNOTIFY,NIL);
+   if (stream->tcpso < 0) return NIL;
+@@ -689,15 +666,12 @@ long tcp_sout (TCPSTREAM *stream,char *string,unsigned long size)
+     time_t now = tl;
+     time_t ti = ttmo_write ? now + ttmo_write : 0;
+     if (tcpdebug) mm_log ("Writing to TCP",TCPDEBUG);
+-    tmo.tv_usec = 0;
+-    FD_ZERO (&fds);		/* initialize selection vector */
+-    FD_ZERO (&efds);		/* handle errors too */
+-    FD_SET (stream->tcpso,&fds);/* set bit in selection vector */
+-    FD_SET(stream->tcpso,&efds);/* set bit in error selection vector */
++    pfd.fd = stream->tcpso;
++    pfd.events = POLLOUT;
+     errno = NIL;		/* block and write */
+     do {			/* block under timeout */
+-      tmo.tv_sec = ti ? ti - now : 0;
+-      i = select (stream->tcpso+1,NIL,&fds,&efds,ti ? &tmo : NIL);
++      tmo = ti ? ti - now : 0;
++      i = poll (&pfd, 1, ti ? tmo * 1000 : -1);
+       now = time (0);		/* fake timeout if interrupt & time expired */
+       if ((i < 0) && (errno == EINTR) && ti && (ti <= now)) i = 0;
+     } while ((i < 0) && (errno == EINTR));