diff --git a/cc3200/application.mk b/cc3200/application.mk
index 1f54b764b95c5c54d18826cbcec0c538b571b6ee..c6b91ed0edea36807fb94319dc2e12577bec2fdc 100644
--- a/cc3200/application.mk
+++ b/cc3200/application.mk
@@ -147,12 +147,12 @@ APP_LIB_SRC_C = $(addprefix lib/,\
 	netutils/netutils.c \
 	timeutils/timeutils.c \
 	utils/pyexec.c \
+	utils/sys_stdio_mphal.c \
 	)
 	
 APP_STM_SRC_C = $(addprefix stmhal/,\
 	bufhelper.c \
 	irq.c \
-	pybstdio.c \
 	)
 
 OBJ = $(PY_O) $(addprefix $(BUILD)/, $(APP_FATFS_SRC_C:.c=.o) $(APP_RTOS_SRC_C:.c=.o) $(APP_FTP_SRC_C:.c=.o) $(APP_HAL_SRC_C:.c=.o) $(APP_MISC_SRC_C:.c=.o))
diff --git a/esp8266/Makefile b/esp8266/Makefile
index d234ce0227703efd64eed81714507e9675c43dcf..96f8d504c2bef306a36e75c61f2f5578fb6c3a5e 100644
--- a/esp8266/Makefile
+++ b/esp8266/Makefile
@@ -92,10 +92,6 @@ SRC_C = \
 	hspi.c \
 	$(SRC_MOD)
 
-STM_SRC_C = $(addprefix stmhal/,\
-	pybstdio.c \
-	)
-
 EXTMOD_SRC_C = $(addprefix extmod/,\
 	modlwip.c \
         )
@@ -125,6 +121,7 @@ LIB_SRC_C = $(addprefix lib/,\
 	timeutils/timeutils.c \
 	utils/pyexec.c \
 	utils/interrupt_char.c \
+	utils/sys_stdio_mphal.c \
 	)
 
 ifeq ($(MICROPY_FATFS), 1)
@@ -144,14 +141,13 @@ OBJ =
 OBJ += $(PY_O)
 OBJ += $(addprefix $(BUILD)/, $(SRC_C:.c=.o))
 OBJ += $(addprefix $(BUILD)/, $(SRC_S:.s=.o))
-OBJ += $(addprefix $(BUILD)/, $(STM_SRC_C:.c=.o))
 OBJ += $(addprefix $(BUILD)/, $(EXTMOD_SRC_C:.c=.o))
 OBJ += $(addprefix $(BUILD)/, $(LIB_SRC_C:.c=.o))
 OBJ += $(addprefix $(BUILD)/, $(DRIVERS_SRC_C:.c=.o))
 #OBJ += $(BUILD)/pins_$(BOARD).o
 
 # List of sources for qstr extraction
-SRC_QSTR += $(SRC_C) $(STM_SRC_C) $(EXTMOD_SRC_C) $(DRIVERS_SRC_C)
+SRC_QSTR += $(SRC_C) $(EXTMOD_SRC_C) $(DRIVERS_SRC_C)
 # Append any auto-generated sources that are needed by sources listed in SRC_QSTR
 SRC_QSTR_AUTO_DEPS +=
 
diff --git a/esp8266/esp8266_common.ld b/esp8266/esp8266_common.ld
index bc983df70030fd89ad9918a2dbc9b94f49b61b56..de5268c8fe3ec9f0333992138428a233baf4bce2 100644
--- a/esp8266/esp8266_common.ld
+++ b/esp8266/esp8266_common.ld
@@ -125,8 +125,6 @@ SECTIONS
         *lib/timeutils/*.o*(.literal*, .text*)
         *lib/utils/*.o*(.literal*, .text*)
 
-        *stmhal/pybstdio.o(.literal*, .text*)
-
         build/main.o(.literal* .text*)
         *gccollect.o(.literal* .text*)
         *gchelper.o(.literal* .text*)
diff --git a/stmhal/pybstdio.c b/lib/utils/sys_stdio_mphal.c
similarity index 89%
rename from stmhal/pybstdio.c
rename to lib/utils/sys_stdio_mphal.c
index bd15c583dfe5c84737a131216a5601de20203e71..fc8a74e7d6d576ecdc91134524aba61c044ee920 100644
--- a/stmhal/pybstdio.c
+++ b/lib/utils/sys_stdio_mphal.c
@@ -1,9 +1,9 @@
 /*
- * This file is part of the Micro Python project, http://micropython.org/
+ * This file is part of the MicroPython project, http://micropython.org/
  *
  * The MIT License (MIT)
  *
- * Copyright (c) 2013, 2014, 2015 Damien P. George
+ * Copyright (c) 2013-2017 Damien P. George
  *
  * Permission is hereby granted, free of charge, to any person obtaining a copy
  * of this software and associated documentation files (the "Software"), to deal
@@ -37,28 +37,28 @@
 // objects are in a read-only module (py/modsys.c).
 
 /******************************************************************************/
-// Micro Python bindings
+// MicroPython bindings
 
 #define STDIO_FD_IN  (0)
 #define STDIO_FD_OUT (1)
 #define STDIO_FD_ERR (2)
 
-typedef struct _pyb_stdio_obj_t {
+typedef struct _sys_stdio_obj_t {
     mp_obj_base_t base;
     int fd;
-} pyb_stdio_obj_t;
+} sys_stdio_obj_t;
 
 #if MICROPY_PY_SYS_STDIO_BUFFER
-STATIC const pyb_stdio_obj_t stdio_buffer_obj;
+STATIC const sys_stdio_obj_t stdio_buffer_obj;
 #endif
 
 void stdio_obj_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) {
-    pyb_stdio_obj_t *self = self_in;
+    sys_stdio_obj_t *self = self_in;
     mp_printf(print, "<io.FileIO %d>", self->fd);
 }
 
 STATIC mp_uint_t stdio_read(mp_obj_t self_in, void *buf, mp_uint_t size, int *errcode) {
-    pyb_stdio_obj_t *self = self_in;
+    sys_stdio_obj_t *self = self_in;
     if (self->fd == STDIO_FD_IN) {
         for (uint i = 0; i < size; i++) {
             int c = mp_hal_stdin_rx_chr();
@@ -75,7 +75,7 @@ STATIC mp_uint_t stdio_read(mp_obj_t self_in, void *buf, mp_uint_t size, int *er
 }
 
 STATIC mp_uint_t stdio_write(mp_obj_t self_in, const void *buf, mp_uint_t size, int *errcode) {
-    pyb_stdio_obj_t *self = self_in;
+    sys_stdio_obj_t *self = self_in;
     if (self->fd == STDIO_FD_OUT || self->fd == STDIO_FD_ERR) {
         mp_hal_stdout_tx_strn_cooked(buf, size);
         return size;
@@ -126,9 +126,9 @@ STATIC const mp_obj_type_t stdio_obj_type = {
     .locals_dict = (mp_obj_dict_t*)&stdio_locals_dict,
 };
 
-const pyb_stdio_obj_t mp_sys_stdin_obj = {{&stdio_obj_type}, .fd = STDIO_FD_IN};
-const pyb_stdio_obj_t mp_sys_stdout_obj = {{&stdio_obj_type}, .fd = STDIO_FD_OUT};
-const pyb_stdio_obj_t mp_sys_stderr_obj = {{&stdio_obj_type}, .fd = STDIO_FD_ERR};
+const sys_stdio_obj_t mp_sys_stdin_obj = {{&stdio_obj_type}, .fd = STDIO_FD_IN};
+const sys_stdio_obj_t mp_sys_stdout_obj = {{&stdio_obj_type}, .fd = STDIO_FD_OUT};
+const sys_stdio_obj_t mp_sys_stderr_obj = {{&stdio_obj_type}, .fd = STDIO_FD_ERR};
 
 #if MICROPY_PY_SYS_STDIO_BUFFER
 STATIC mp_uint_t stdio_buffer_read(mp_obj_t self_in, void *buf, mp_uint_t size, int *errcode) {
@@ -159,5 +159,5 @@ STATIC const mp_obj_type_t stdio_buffer_obj_type = {
     .locals_dict = (mp_obj_t)&stdio_locals_dict,
 };
 
-STATIC const pyb_stdio_obj_t stdio_buffer_obj = {{&stdio_buffer_obj_type}, .fd = 0}; // fd unused
+STATIC const sys_stdio_obj_t stdio_buffer_obj = {{&stdio_buffer_obj_type}, .fd = 0}; // fd unused
 #endif
diff --git a/pic16bit/Makefile b/pic16bit/Makefile
index 8c0c1c999e319f1e951e44e00bc0a29e2845b40f..1da444952140039086dc4c2d516d8ac4ae088e6f 100644
--- a/pic16bit/Makefile
+++ b/pic16bit/Makefile
@@ -39,8 +39,8 @@ SRC_C = \
 	modpyb.c \
 	modpybled.c \
 	modpybswitch.c \
-	stmhal/pybstdio.c \
 	lib/utils/pyexec.c \
+	lib/utils/sys_stdio_mphal.c \
 	lib/mp-readline/readline.c \
 
 SRC_S = \
diff --git a/qemu-arm/Makefile b/qemu-arm/Makefile
index 07aa6857208ff7b144b5dfc473cfb7eef84fd0cc..67823d99620e1d8d0dcb814bd8808aa4cedd180c 100644
--- a/qemu-arm/Makefile
+++ b/qemu-arm/Makefile
@@ -63,17 +63,13 @@ LIB_SRC_C = $(addprefix lib/,\
 	libm/asinfacosf.c \
 	libm/atanf.c \
 	libm/atan2f.c \
-	)
-
-STM_SRC_C = $(addprefix stmhal/,\
-	pybstdio.c \
+	utils/sys_stdio_mphal.c \
 	)
 
 OBJ_COMMON =
 OBJ_COMMON += $(PY_O)
 OBJ_COMMON += $(addprefix $(BUILD)/, $(SRC_COMMON_C:.c=.o))
 OBJ_COMMON += $(addprefix $(BUILD)/, $(LIB_SRC_C:.c=.o))
-OBJ_COMMON += $(addprefix $(BUILD)/, $(STM_SRC_C:.c=.o))
 
 OBJ_RUN =
 OBJ_RUN += $(addprefix $(BUILD)/, $(SRC_RUN_C:.c=.o))
@@ -86,7 +82,7 @@ OBJ_TEST += $(BUILD)/tinytest.o
 OBJ = $(OBJ_COMMON) $(OBJ_RUN) $(OBJ_TEST)
 
 # List of sources for qstr extraction
-SRC_QSTR += $(SRC_COMMON_C) $(SRC_RUN_C) $(STM_SRC_C)
+SRC_QSTR += $(SRC_COMMON_C) $(SRC_RUN_C)
 
 all: run
 
diff --git a/stmhal/Makefile b/stmhal/Makefile
index 2d9d44afd95d96d1fac56c6ddc8ec88515c8ab68..73c7ed6c4cb4d41a31e8b14b8d0e2e3a316c16bd 100644
--- a/stmhal/Makefile
+++ b/stmhal/Makefile
@@ -110,6 +110,7 @@ SRC_LIB = $(addprefix lib/,\
 	timeutils/timeutils.c \
 	utils/pyexec.c \
 	utils/interrupt_char.c \
+	utils/sys_stdio_mphal.c \
 	)
 
 DRIVERS_SRC_C = $(addprefix drivers/,\
@@ -145,7 +146,6 @@ SRC_C = \
 	usb.c \
 	wdt.c \
 	gccollect.c \
-	pybstdio.c \
 	help.c \
 	machine_i2c.c \
 	modmachine.c \
diff --git a/teensy/Makefile b/teensy/Makefile
index 923ea77ecd0d0dc7f4cf02468cde93ad0f5ca646..8c864161ab59312ee322382ddee0a7e0c2bd9232 100644
--- a/teensy/Makefile
+++ b/teensy/Makefile
@@ -96,7 +96,6 @@ STM_SRC_C = $(addprefix stmhal/,\
 	irq.c \
 	pin.c \
 	pin_named_pins.c \
-	pybstdio.c \
 	)
 
 STM_SRC_S = $(addprefix stmhal/,\
@@ -107,6 +106,7 @@ LIB_SRC_C = $(addprefix lib/,\
 	libc/string0.c \
 	mp-readline/readline.c \
 	utils/pyexec.c \
+	utils/sys_stdio_mphal.c \
 	)
 
 SRC_TEENSY = $(addprefix core/,\