diff --git a/lib-src/pop.c b/lib-src/pop.c
index 10aac957d4b..0b9204576bd 100644
--- a/lib-src/pop.c
+++ b/lib-src/pop.c
@@ -30,8 +30,12 @@ along with GNU Emacs. If not, see . */
#include "ntlib.h"
#undef _WIN32_WINNT
#define _WIN32_WINNT 0x0501 /* for getaddrinfo stuff */
-#include
-#include
+#if defined __MINGW32_VERSION && __MINGW32_VERSION >= 5000000L
+# include
+#else
+# include
+#endif
+# include
#undef getaddrinfo
#define getaddrinfo sys_getaddrinfo
#undef freeaddrinfo
diff --git a/nt/inc/ms-w32.h b/nt/inc/ms-w32.h
index ff4317817e0..0ab46e98328 100644
--- a/nt/inc/ms-w32.h
+++ b/nt/inc/ms-w32.h
@@ -455,7 +455,12 @@ extern char *get_emacs_configuration_options (void);
windows.h. For this to have proper effect, config.h must always be
included before windows.h. */
#define _WINSOCKAPI_ 1
-#define _WINSOCK_H
+#if defined __MINGW32_VERSION && __MINGW32_VERSION < 5000000L
+/* mingw.org's MinGW 5.x changed how it includes winsock.h and time.h,
+ and now defining _WINSOCK_H skips the definition of struct timeval,
+ which we don't want. */
+# define _WINSOCK_H
+#endif
/* Defines size_t and alloca (). */
#include
diff --git a/nt/inc/sys/socket.h b/nt/inc/sys/socket.h
index 2582cbdaef1..3ea9542b05c 100644
--- a/nt/inc/sys/socket.h
+++ b/nt/inc/sys/socket.h
@@ -49,6 +49,11 @@ along with GNU Emacs. If not, see . */
#define timeval ws_timeval
#endif
+#if defined __MINGW32_VERSION && __MINGW32_VERSION >= 5000000L
+/* Need winerror.h before winsock2.h with mingw.org's MinGW 5.x,
+ otherwise some error codes are not defined. */
+# include
+#endif
#include
#include
/* process.c uses uint16_t (from C99) for IPv6, but