diff --git a/stmhal/moduselect.c b/extmod/moduselect.c
similarity index 99%
rename from stmhal/moduselect.c
rename to extmod/moduselect.c
index 0d76953c6181e430a047e51ccd9e0fb3592c0993..6cf1e70a2bff01a5dc140e399837075bf9e9c05b 100644
--- a/stmhal/moduselect.c
+++ b/extmod/moduselect.c
@@ -24,6 +24,9 @@
  * THE SOFTWARE.
  */
 
+#include "py/mpconfig.h"
+#if MICROPY_PY_USELECT
+
 #include <stdio.h>
 
 #include "py/runtime.h"
@@ -309,3 +312,5 @@ const mp_obj_module_t mp_module_uselect = {
     .base = { &mp_type_module },
     .globals = (mp_obj_dict_t*)&mp_module_select_globals,
 };
+
+#endif // MICROPY_PY_WEBSOCKET
diff --git a/py/builtin.h b/py/builtin.h
index 4477fd2462a63cd6ae6cf5929b4d28588dbcabb2..893e47104fd89482306087372c95c8955d39df69 100644
--- a/py/builtin.h
+++ b/py/builtin.h
@@ -108,6 +108,7 @@ extern const mp_obj_module_t mp_module_uheapq;
 extern const mp_obj_module_t mp_module_uhashlib;
 extern const mp_obj_module_t mp_module_ubinascii;
 extern const mp_obj_module_t mp_module_urandom;
+extern const mp_obj_module_t mp_module_uselect;
 extern const mp_obj_module_t mp_module_ussl;
 extern const mp_obj_module_t mp_module_machine;
 extern const mp_obj_module_t mp_module_lwip;
diff --git a/py/mpconfig.h b/py/mpconfig.h
index 1980e649caf743bd99f40880d737499fc5e10650..4572fc4cc9082f3be511c43fae8ca583e39122ab 100644
--- a/py/mpconfig.h
+++ b/py/mpconfig.h
@@ -873,6 +873,11 @@ typedef double mp_float_t;
 #define MICROPY_PY_UERRNO (0)
 #endif
 
+// Whether to provide "uselect" module (baremetal implementation)
+#ifndef MICROPY_PY_USELECT
+#define MICROPY_PY_USELECT (0)
+#endif
+
 // Whether to provide "utime" module functions implementation
 // in terms of mp_hal_* functions.
 #ifndef MICROPY_PY_UTIME_MP_HAL
diff --git a/py/objmodule.c b/py/objmodule.c
index 9b06e3b7b56b71ec28cb9e87c3b248a452dbdb8f..6f7d35d4267e28e3de3d2530ca5d9a3b058d97f6 100644
--- a/py/objmodule.c
+++ b/py/objmodule.c
@@ -198,6 +198,9 @@ STATIC const mp_rom_map_elem_t mp_builtin_module_table[] = {
 #if MICROPY_PY_URANDOM
     { MP_ROM_QSTR(MP_QSTR_urandom), MP_ROM_PTR(&mp_module_urandom) },
 #endif
+#if MICROPY_PY_USELECT
+    { MP_ROM_QSTR(MP_QSTR_uselect), MP_ROM_PTR(&mp_module_uselect) },
+#endif
 #if MICROPY_PY_USSL
     { MP_ROM_QSTR(MP_QSTR_ussl), MP_ROM_PTR(&mp_module_ussl) },
 #endif
diff --git a/py/py.mk b/py/py.mk
index 82e0661ef399ed8fcbcd40118db934d6b640e0c2..ec67ac2a081afc510f40ff4804e0ec7d9d9d61d0 100644
--- a/py/py.mk
+++ b/py/py.mk
@@ -219,6 +219,7 @@ PY_O_BASENAME = \
 	../extmod/modussl_axtls.o \
 	../extmod/modussl_mbedtls.o \
 	../extmod/modurandom.o \
+	../extmod/moduselect.o \
 	../extmod/modwebsocket.o \
 	../extmod/modwebrepl.o \
 	../extmod/modframebuf.o \
diff --git a/stmhal/Makefile b/stmhal/Makefile
index c08484db1c824089e78978e4183790afbfa183b1..3b70f6b935d187832af69a26b44c4ce285a03a99 100644
--- a/stmhal/Makefile
+++ b/stmhal/Makefile
@@ -150,7 +150,6 @@ SRC_C = \
 	modstm.c \
 	moduos.c \
 	modutime.c \
-	moduselect.c \
 	modusocket.c \
 	modnetwork.c \
 	import.c \
diff --git a/stmhal/mpconfigport.h b/stmhal/mpconfigport.h
index 3eec0fcce01f100a3eada92d727a214a1fce7093..66ec3647249fb0ed2bb61cac7271dfd5699ed502 100644
--- a/stmhal/mpconfigport.h
+++ b/stmhal/mpconfigport.h
@@ -92,6 +92,7 @@
 #define MICROPY_PY_UBINASCII        (1)
 #define MICROPY_PY_URANDOM          (1)
 #define MICROPY_PY_URANDOM_EXTRA_FUNCS (1)
+#define MICROPY_PY_USELECT          (1)
 #define MICROPY_PY_UCTYPES          (1)
 #define MICROPY_PY_UZLIB            (1)
 #define MICROPY_PY_UJSON            (1)
@@ -135,7 +136,6 @@ extern const struct _mp_obj_module_t mp_module_uheapq;
 extern const struct _mp_obj_module_t mp_module_uhashlib;
 extern const struct _mp_obj_module_t mp_module_uos;
 extern const struct _mp_obj_module_t mp_module_utime;
-extern const struct _mp_obj_module_t mp_module_uselect;
 extern const struct _mp_obj_module_t mp_module_usocket;
 extern const struct _mp_obj_module_t mp_module_network;
 
@@ -159,7 +159,6 @@ extern const struct _mp_obj_module_t mp_module_network;
     { MP_OBJ_NEW_QSTR(MP_QSTR_stm), (mp_obj_t)&stm_module }, \
     { MP_OBJ_NEW_QSTR(MP_QSTR_uos), (mp_obj_t)&mp_module_uos }, \
     { MP_OBJ_NEW_QSTR(MP_QSTR_utime), (mp_obj_t)&mp_module_utime }, \
-    { MP_OBJ_NEW_QSTR(MP_QSTR_uselect), (mp_obj_t)&mp_module_uselect }, \
     SOCKET_BUILTIN_MODULE \
     NETWORK_BUILTIN_MODULE \
 
diff --git a/stmhal/portmodules.h b/stmhal/portmodules.h
index 173d53cc68a49a25e7ca18d6638f25028aa039ac..0b460f38c2aeca1f424eb7aa0c092636350ef14b 100644
--- a/stmhal/portmodules.h
+++ b/stmhal/portmodules.h
@@ -28,7 +28,6 @@ extern const mp_obj_module_t pyb_module;
 extern const mp_obj_module_t stm_module;
 extern const mp_obj_module_t mp_module_uos;
 extern const mp_obj_module_t mp_module_utime;
-extern const mp_obj_module_t mp_module_uselect;
 extern const mp_obj_module_t mp_module_usocket;
 
 // additional helper functions exported by the modules