diff --git a/configure.ac b/configure.ac
index bc84a0d..da2916e 100644
--- a/configure.ac
+++ b/configure.ac
@@ -44,7 +44,7 @@ AC_PROG_MAKE_SET
 
 # Checks for header files.
 AC_HEADER_MAJOR
-AC_CHECK_HEADERS([arpa/inet.h fcntl.h float.h langinfo.h libintl.h limits.h locale.h netinet/in.h stdint.h stdio_ext.h stdlib.h string.h sys/file.h sys/ioctl.h sys/param.h sys/time.h termios.h unistd.h utmp.h values.h wchar.h wctype.h])
+AC_CHECK_HEADERS([arpa/inet.h fcntl.h float.h langinfo.h libintl.h limits.h locale.h netinet/in.h stdint.h stdio_ext.h stdlib.h string.h sys/file.h sys/ioctl.h sys/param.h sys/time.h termios.h unistd.h utmp.h utmpx.h values.h wchar.h wctype.h])
 
 # Checks for typedefs, structures, and compiler characteristics.
 AC_CHECK_HEADER_STDBOOL
diff --git a/proc/whattime.c b/proc/whattime.c
index c223cad..d55fd22 100644
--- a/proc/whattime.c
+++ b/proc/whattime.c
@@ -33,7 +33,7 @@
 #include <fcntl.h>
 #include <unistd.h>
 #include <time.h>
-#include <utmp.h>
+#include <utmpx.h>
 #include <sys/ioctl.h>
 #include "whattime.h"
 #include "sysinfo.h"
@@ -42,7 +42,7 @@ static char buf[256];
 static double av[3];
 
 char *sprint_uptime(int human_readable) {
-  struct utmp *utmpstruct;
+  struct utmpx *utmpstruct;
   int upminutes, uphours, updays, upweeks, upyears, updecades;
   int pos;
   int comma;
@@ -98,13 +98,13 @@ char *sprint_uptime(int human_readable) {
 /* count the number of users */
 
     numuser = 0;
-    setutent();
-    while ((utmpstruct = getutent())) {
+    setutxent();
+    while ((utmpstruct = getutxent())) {
       if ((utmpstruct->ut_type == USER_PROCESS) &&
          (utmpstruct->ut_name[0] != '\0'))
         numuser++;
     }
-    endutent();
+    endutxent();
 
     pos += sprintf(buf + pos, "%2d user%s, ", numuser, numuser == 1 ? "" : "s");
 
diff --git a/w.c b/w.c
index 35710a3..6caa8a6 100644
--- a/w.c
+++ b/w.c
@@ -23,6 +23,7 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
+#include "config.h"
 #include "c.h"
 #include "fileutils.h"
 #include "nls.h"
@@ -54,14 +55,22 @@
 #include <termios.h>
 #include <time.h>
 #include <unistd.h>
-#include <utmp.h>
+#ifdef HAVE_UTMPX_H
+#	include <utmpx.h>
+#else
+#	include <utmp.h>
+#endif
 #include <arpa/inet.h>
 
 static int ignoreuser = 0;	/* for '-u' */
 static int oldstyle = 0;	/* for '-o' */
 static proc_t **procs;		/* our snapshot of the process table */
 
+#ifdef HAVE_UTMPX_H
+typedef struct utmpx utmp_t;
+#else
 typedef struct utmp utmp_t;
+#endif
 
 #ifdef W_SHOWFROM
 # define FROM_STRING "on"
@@ -604,11 +613,19 @@ int main(int argc, char **argv)
 			printf(_("   IDLE WHAT\n"));
 	}
 
+#ifdef HAVE_UTMPX_H
+	setutxent();
+#else
 	utmpname(UTMP_FILE);
 	setutent();
+#endif
 	if (user) {
 		for (;;) {
+#ifdef HAVE_UTMPX_H
+			u = getutxent();
+#else
 			u = getutent();
+#endif
 			if (unlikely(!u))
 				break;
 			if (u->ut_type != USER_PROCESS)
@@ -619,7 +636,11 @@ int main(int argc, char **argv)
 		}
 	} else {
 		for (;;) {
+#ifdef HAVE_UTMPX_H
+			u = getutxent();
+#else
 			u = getutent();
+#endif
 			if (unlikely(!u))
 				break;
 			if (u->ut_type != USER_PROCESS)
@@ -629,7 +650,11 @@ int main(int argc, char **argv)
 					 fromlen, ip_addresses);
 		}
 	}
+#ifdef HAVE_UTMPX_H
+	endutxent();
+#else
 	endutent();
+#endif
 
 	return EXIT_SUCCESS;
 }