diff --git a/acinclude.m4 b/acinclude.m4
index c5187894acbf9e9e37a2d00ff8ce4dbd2ab6aa58..42e58511eb2d3e8fe01405f245eadd2eb61b0b27 100644
--- a/acinclude.m4
+++ b/acinclude.m4
@@ -580,3 +580,168 @@ AC_DEFUN([LIBZMQ_CHECK_LANG_VISIBILITY], [{
     AS_IF([test "x$libzmq_cv_[]_AC_LANG_ABBREV[]_visibility_flag" != "x"],
           [AC_MSG_RESULT(yes) ; $1], [AC_MSG_RESULT(no) ; $2])
 }])
+
+dnl ################################################################################
+dnl # LIBZMQ_CHECK_POLLER_KQUEUE([action-if-found], [action-if-not-found])         #
+dnl # Checks kqueue polling system                                                 #
+dnl ################################################################################
+AC_DEFUN([LIBZMQ_CHECK_POLLER_KQUEUE], [{
+    AC_LINK_IFELSE(
+        [AC_LANG_PROGRAM(
+        [
+#include <sys/types.h>
+#include <sys/event.h>
+#include <sys/time.h>
+        ],
+[[
+struct kevent t_kev;
+kqueue();
+]]
+        )],
+        [libzmq_cv_have_poller_kqueue="yes" ; $1],
+        [libzmq_cv_have_poller_kqueue="no" ; $2])
+}])
+
+dnl ################################################################################
+dnl # LIBZMQ_CHECK_POLLER_EPOLL([action-if-found], [action-if-not-found])          #
+dnl # Checks epoll polling system                                                  #
+dnl ################################################################################
+AC_DEFUN([LIBZMQ_CHECK_POLLER_EPOLL], [{
+    AC_LINK_IFELSE(
+        [AC_LANG_PROGRAM(
+        [
+#include <sys/epoll.h>
+        ],
+[[
+struct epoll_event t_ev;
+epoll_create(10);
+]]
+        )],
+        [libzmq_cv_have_poller_epoll="yes" ; $1],
+        [libzmq_cv_have_poller_epoll="no" ; $2])
+}])
+
+dnl ################################################################################
+dnl # LIBZMQ_CHECK_POLLER_DEVPOLL([action-if-found], [action-if-not-found])        #
+dnl # Checks devpoll polling system                                                #
+dnl ################################################################################
+AC_DEFUN([LIBZMQ_CHECK_POLLER_DEVPOLL], [{
+    AC_LINK_IFELSE(
+        [AC_LANG_PROGRAM(
+        [
+#include <sys/devpoll.h>
+        ],
+[[
+struct pollfd t_devpoll;
+int fd = open("/dev/poll", O_RDWR);
+]]
+        )],
+        [libzmq_cv_have_poller_devpoll="yes" ; $1],
+        [libzmq_cv_have_poller_devpoll="no" ; $2])
+}])
+
+dnl ################################################################################
+dnl # LIBZMQ_CHECK_POLLER_POLL([action-if-found], [action-if-not-found])           #
+dnl # Checks poll polling system                                                   #
+dnl ################################################################################
+AC_DEFUN([LIBZMQ_CHECK_POLLER_POLL], [{
+    AC_LINK_IFELSE(
+        [AC_LANG_PROGRAM(
+        [
+#include <poll.h>
+        ],
+[[
+struct pollfd t_poll;
+poll(&t_poll, 1, 1);
+]]
+        )],
+        [libzmq_cv_have_poller_poll="yes" ; $1],
+        [libzmq_cv_have_poller_poll="no" ; $2])
+}])
+
+dnl ################################################################################
+dnl # LIBZMQ_CHECK_POLLER_SELECT([action-if-found], [action-if-not-found])         #
+dnl # Checks select polling system                                                 #
+dnl ################################################################################
+AC_DEFUN([LIBZMQ_CHECK_POLLER_SELECT], [{
+    AC_LINK_IFELSE(
+        [AC_LANG_PROGRAM(
+        [
+#include <sys/select.h>
+#include <stdlib.h>
+        ],
+[[
+fd_set t_rfds;
+struct timeval tv;
+
+FD_ZERO(&t_rfds);
+FD_SET(0, &t_rfds);
+
+tv.tv_sec = 5;
+v.tv_usec = 0;
+
+select(1, &t_rfds, NULL, NULL, &tv);
+]]
+        )],
+        [libzmq_cv_have_poller_select="yes" ; $1],
+        [libzmq_cv_have_poller_select="no" ; $2])
+}])
+
+dnl ################################################################################
+dnl # LIBZMQ_CHECK_POLLER([action-if-found], [action-if-not-found])                #
+dnl # Choose polling system                                                        #
+dnl ################################################################################
+AC_DEFUN([LIBZMQ_CHECK_POLLER], [{
+
+    # Allow user to disable doc build
+    AC_ARG_WITH([poller], [AS_HELP_STRING([--with-poller],
+                [choose polling system manually. valid values are kqueue, epoll, devpoll, poll or select [default=autodetect]])])
+
+    AC_MSG_CHECKING([for suitable polling system])
+
+    case "${with_poller}" in
+        kqueue|epoll|devpoll|poll|select)
+            # User has chosen polling system
+            libzmq_cv_poller="${with_poller}"
+        ;;
+
+        *)
+            # try to find suitable polling system. the order of testing is:
+            # kqueue -> epoll -> devpoll -> poll -> select
+            for subsystem in kqueue epoll devpoll poll select; do
+
+                case "${subsystem}" in
+                    kqueue)
+                        LIBZMQ_CHECK_POLLER_KQUEUE([libzmq_cv_poller=$subsystem], [])
+                    ;;
+
+                    epoll)
+                        LIBZMQ_CHECK_POLLER_EPOLL([libzmq_cv_poller=$subsystem], [])
+                    ;;
+
+                    devpoll)
+                        LIBZMQ_CHECK_POLLER_DEVPOLL([libzmq_cv_poller=$subsystem], [])
+                    ;;
+
+                    poll)
+                        LIBZMQ_CHECK_POLLER_POLL([libzmq_cv_poller=$subsystem], [])
+                    ;;
+
+                    select)
+                        LIBZMQ_CHECK_POLLER_SELECT([libzmq_cv_poller=$subsystem], [])
+                    ;;
+                esac
+
+                if test "x${libzmq_cv_poller}" != "x"; then
+                    break
+                fi
+            done
+      ;;
+    esac
+
+    libzmq_cv_poller_flag=`echo "ZMQ_FORCE_${libzmq_cv_poller}" | tr a-z A-Z`
+
+    AS_IF([test "x${libzmq_cv_poller}" != "x"],
+          [AC_MSG_RESULT([using $libzmq_cv_poller]) ; $1], [AC_MSG_RESULT(no suitable polling system found) ; $2])
+}])
+
diff --git a/configure.in b/configure.in
index 8a31177c89ca972f969ad06b69b9292b64988920..406525212bebbf3b454788774f8c3b7b587f9577 100644
--- a/configure.in
+++ b/configure.in
@@ -229,6 +229,10 @@ esac
 # Check whether to build docs / install man pages
 LIBZMQ_CHECK_DOC_BUILD
 
+# Check polling system
+LIBZMQ_CHECK_POLLER([CPPFLAGS="${CPPFLAGS} -D${libzmq_cv_poller_flag}"],
+                    [AC_MSG_ERROR([Unable to continue without polling system])])
+
 # Checks for header files.
 AC_HEADER_STDC
 AC_CHECK_HEADERS(errno.h arpa/inet.h netinet/tcp.h netinet/in.h stddef.h \