diff --git a/cc3200/application.mk b/cc3200/application.mk
index 2eef3c8c32ec202c3125f358b704f19bf2356b74..b862212a545740eb1cbed85b2667eab80ed86921 100644
--- a/cc3200/application.mk
+++ b/cc3200/application.mk
@@ -152,6 +152,7 @@ APP_LIB_SRC_C = $(addprefix lib/,\
 	netutils/netutils.c \
 	timeutils/timeutils.c \
 	utils/pyexec.c \
+	utils/pyhelp.c \
 	utils/printf.c \
 	)
 	
diff --git a/cc3200/misc/help.c b/cc3200/misc/help.c
index 9bbd711a884aed2e12cb2a4d909d7abc92ce2d96..4601818bdab0143f44223a76e8b5eb0c16536da3 100644
--- a/cc3200/misc/help.c
+++ b/cc3200/misc/help.c
@@ -27,21 +27,12 @@
 
 #include <stdio.h>
 
-#include "py/mpconfig.h"
-#include "py/obj.h"
+#include "lib/utils/pyhelp.h"
 
 STATIC const char help_text[] = "Welcome to MicroPython!\n"
                                 "For online help please visit http://micropython.org/help/.\n"
                                 "For further help on a specific object, type help(obj)\n";
 
-STATIC void pyb_help_print_info_about_object(mp_obj_t name_o, mp_obj_t value) {
-    printf("  ");
-    mp_obj_print(name_o, PRINT_STR);
-    printf(" -- ");
-    mp_obj_print(value, PRINT_STR);
-    printf("\n");
-}
-
 STATIC mp_obj_t pyb_help(uint n_args, const mp_obj_t *args) {
     if (n_args == 0) {
         // print a general help message
@@ -49,31 +40,7 @@ STATIC mp_obj_t pyb_help(uint n_args, const mp_obj_t *args) {
     }
     else {
         // try to print something sensible about the given object
-        printf("object ");
-        mp_obj_print(args[0], PRINT_STR);
-        printf(" is of type %s\n", mp_obj_get_type_str(args[0]));
-
-        mp_map_t *map = NULL;
-        if (MP_OBJ_IS_TYPE(args[0], &mp_type_module)) {
-            map = mp_obj_dict_get_map(mp_obj_module_get_globals(args[0]));
-        } else {
-            mp_obj_type_t *type;
-            if (MP_OBJ_IS_TYPE(args[0], &mp_type_type)) {
-                type = args[0];
-            } else {
-                type = mp_obj_get_type(args[0]);
-            }
-            if (type->locals_dict != MP_OBJ_NULL && MP_OBJ_IS_TYPE(type->locals_dict, &mp_type_dict)) {
-                map = mp_obj_dict_get_map(type->locals_dict);
-            }
-        }
-        if (map != NULL) {
-            for (uint i = 0; i < map->alloc; i++) {
-                if (map->table[i].key != MP_OBJ_NULL) {
-                    pyb_help_print_info_about_object(map->table[i].key, map->table[i].value);
-                }
-            }
-        }
+        pyhelp_print_obj(args[0]);
     }
     return mp_const_none;
 }
diff --git a/stmhal/Makefile b/stmhal/Makefile
index 1b4b78e43ea7911ee4a51d8d88e8811bb6516f11..fffedd326c5bcba2f1096a3ce34b4a51bb34e1f6 100644
--- a/stmhal/Makefile
+++ b/stmhal/Makefile
@@ -110,6 +110,7 @@ SRC_LIB = $(addprefix lib/,\
 	netutils/netutils.c \
 	timeutils/timeutils.c \
 	utils/pyexec.c \
+	utils/pyhelp.c \
 	utils/printf.c \
 	)
 
diff --git a/stmhal/help.c b/stmhal/help.c
index 32837972f0561cf93cebb98067088051908d9162..21e81ebc0e877d29b794e6b471db767242e73ba4 100644
--- a/stmhal/help.c
+++ b/stmhal/help.c
@@ -26,8 +26,7 @@
 
 #include <stdio.h>
 
-#include "py/nlr.h"
-#include "py/obj.h"
+#include "lib/utils/pyhelp.h"
 
 STATIC const char *help_text =
 "Welcome to MicroPython!\n"
@@ -72,14 +71,6 @@ STATIC const char *help_text =
 "For further help on a specific object, type help(obj)\n"
 ;
 
-STATIC void pyb_help_print_info_about_object(mp_obj_t name_o, mp_obj_t value) {
-    printf("  ");
-    mp_obj_print(name_o, PRINT_STR);
-    printf(" -- ");
-    mp_obj_print(value, PRINT_STR);
-    printf("\n");
-}
-
 STATIC mp_obj_t pyb_help(uint n_args, const mp_obj_t *args) {
     if (n_args == 0) {
         // print a general help message
@@ -87,32 +78,7 @@ STATIC mp_obj_t pyb_help(uint n_args, const mp_obj_t *args) {
 
     } else {
         // try to print something sensible about the given object
-
-        printf("object ");
-        mp_obj_print(args[0], PRINT_STR);
-        printf(" is of type %s\n", mp_obj_get_type_str(args[0]));
-
-        mp_map_t *map = NULL;
-        if (MP_OBJ_IS_TYPE(args[0], &mp_type_module)) {
-            map = mp_obj_dict_get_map(mp_obj_module_get_globals(args[0]));
-        } else {
-            mp_obj_type_t *type;
-            if (MP_OBJ_IS_TYPE(args[0], &mp_type_type)) {
-                type = args[0];
-            } else {
-                type = mp_obj_get_type(args[0]);
-            }
-            if (type->locals_dict != MP_OBJ_NULL && MP_OBJ_IS_TYPE(type->locals_dict, &mp_type_dict)) {
-                map = mp_obj_dict_get_map(type->locals_dict);
-            }
-        }
-        if (map != NULL) {
-            for (uint i = 0; i < map->alloc; i++) {
-                if (map->table[i].key != MP_OBJ_NULL) {
-                    pyb_help_print_info_about_object(map->table[i].key, map->table[i].value);
-                }
-            }
-        }
+        pyhelp_print_obj(args[0]);
     }
 
     return mp_const_none;
diff --git a/teensy/Makefile b/teensy/Makefile
index de7036571f8d57f7c1421a4b38d36c746cd8bb42..7b34ba90e2d7a0b48c767fbb4ab051ef0e8abcf6 100644
--- a/teensy/Makefile
+++ b/teensy/Makefile
@@ -109,6 +109,7 @@ LIB_SRC_C = $(addprefix lib/,\
 	libc/string0.c \
 	mp-readline/readline.c \
 	utils/pyexec.c \
+	utils/pyhelp.c \
 	utils/printf.c \
 	)
 
diff --git a/teensy/help.c b/teensy/help.c
index d8fe3a1d9c97955f347d882c25f5c532f2c3ebde..147347fc22bed96367d15f68265f18a73e232560 100644
--- a/teensy/help.c
+++ b/teensy/help.c
@@ -26,7 +26,7 @@
 
 #include <stdio.h>
 
-#include "py/obj.h"
+#include "lib/utils/pyhelp.h"
 
 STATIC const char *help_text =
 "Welcome to MicroPython!\n"
@@ -70,14 +70,6 @@ STATIC const char *help_text =
 "For further help on a specific object, type help(obj)\n"
 ;
 
-STATIC void pyb_help_print_info_about_object(mp_obj_t name_o, mp_obj_t value) {
-    printf("  ");
-    mp_obj_print(name_o, PRINT_STR);
-    printf(" -- ");
-    mp_obj_print(value, PRINT_STR);
-    printf("\n");
-}
-
 STATIC mp_obj_t pyb_help(uint n_args, const mp_obj_t *args) {
     if (n_args == 0) {
         // print a general help message
@@ -85,32 +77,7 @@ STATIC mp_obj_t pyb_help(uint n_args, const mp_obj_t *args) {
 
     } else {
         // try to print something sensible about the given object
-
-        printf("object ");
-        mp_obj_print(args[0], PRINT_STR);
-        printf(" is of type %s\n", mp_obj_get_type_str(args[0]));
-
-        mp_map_t *map = NULL;
-        if (MP_OBJ_IS_TYPE(args[0], &mp_type_module)) {
-            map = mp_obj_dict_get_map(mp_obj_module_get_globals(args[0]));
-        } else {
-            mp_obj_type_t *type;
-            if (MP_OBJ_IS_TYPE(args[0], &mp_type_type)) {
-                type = args[0];
-            } else {
-                type = mp_obj_get_type(args[0]);
-            }
-            if (type->locals_dict != MP_OBJ_NULL && MP_OBJ_IS_TYPE(type->locals_dict, &mp_type_dict)) {
-                map = mp_obj_dict_get_map(type->locals_dict);
-            }
-        }
-        if (map != NULL) {
-            for (uint i = 0; i < map->alloc; i++) {
-                if (map->table[i].key != MP_OBJ_NULL) {
-                    pyb_help_print_info_about_object(map->table[i].key, map->table[i].value);
-                }
-            }
-        }
+        pyhelp_print_obj(args[0]);
     }
 
     return mp_const_none;