From 51dfcb4bb7613ed164952712d9a5235a7b833cde Mon Sep 17 00:00:00 2001
From: Damien George <damien.p.george@gmail.com>
Date: Thu, 1 Jan 2015 20:27:54 +0000
Subject: [PATCH] py: Move to guarded includes, everywhere in py/ core.

Addresses issue #1022.
---
 py/argcheck.c        |  8 ++------
 py/asmarm.c          |  6 +++---
 py/asmthumb.c        |  6 +++---
 py/asmx64.c          |  5 ++---
 py/asmx86.c          |  5 ++---
 py/bc.c              | 14 +++-----------
 py/bc.h              |  7 +++++++
 py/bc0.h             |  4 ++++
 py/binary.c          |  8 ++------
 py/binary.h          |  6 ++++++
 py/builtin.h         |  6 ++++++
 py/builtinevex.c     | 19 +++++--------------
 py/builtinimport.c   | 20 +++++---------------
 py/compile.c         | 24 ++++++++----------------
 py/emit.h            | 11 +++++++----
 py/emitbc.c          | 13 ++-----------
 py/emitcommon.c      | 11 +----------
 py/emitcpy.c         | 11 +----------
 py/emitglue.c        | 11 +++--------
 py/emitglue.h        |  2 ++
 py/emitinlinethumb.c | 15 +++------------
 py/emitnative.c      | 24 ++++++------------------
 py/emitpass1.c       | 13 +------------
 py/formatfloat.c     |  7 ++++---
 py/formatfloat.h     |  6 +++++-
 py/gc.c              | 12 +++---------
 py/gc.h              |  9 +++++++++
 py/lexer.c           | 10 +---------
 py/lexer.h           |  5 +++++
 py/lexerstr.c        |  7 +------
 py/lexerunix.c       |  7 ++-----
 py/lexerunix.h       | 29 -----------------------------
 py/malloc.c          |  7 +++----
 py/map.c             |  8 +++-----
 py/modarray.c        |  6 +-----
 py/modbuiltins.c     | 20 ++++++++------------
 py/modcmath.c        | 10 +++-------
 py/modcollections.c  |  6 +-----
 py/modgc.c           | 10 ++--------
 py/modio.c           |  6 +-----
 py/modmath.c         | 10 +++-------
 py/modmicropython.c  | 12 ++++--------
 py/modstruct.c       | 14 +++++---------
 py/modsys.c          | 24 ++++++++----------------
 py/mpz.c             |  7 +------
 py/mpz.h             |  9 +++++++++
 py/nativeglue.c      | 12 ++++--------
 py/nlr.h             |  6 ++++++
 py/nlrsetjmp.c       |  5 +----
 py/obj.c             | 18 +++++++-----------
 py/objarray.c        | 12 ++++--------
 py/objarray.h        | 27 ---------------------------
 py/objbool.c         | 10 +++-------
 py/objboundmeth.c    |  8 ++------
 py/objcell.c         |  7 +------
 py/objclosure.c      |  9 ++-------
 py/objcomplex.c      | 21 +++++++++------------
 py/objdict.c         | 15 +++++----------
 py/objenumerate.c    |  6 +-----
 py/objexcept.c       | 21 +++++++--------------
 py/objfilter.c       | 11 ++---------
 py/objfloat.c        | 16 ++++++----------
 py/objfun.c          | 19 +++++++------------
 py/objfun.h          |  6 ++++++
 py/objgenerator.c    | 15 ++++++---------
 py/objgenerator.h    |  7 +++++++
 py/objgetitemiter.c  |  8 ++------
 py/objint.c          | 20 +++++++-------------
 py/objint.h          |  7 +++++++
 py/objint_longlong.c | 16 +++++-----------
 py/objint_mpz.c      | 18 ++++++------------
 py/objlist.c         | 12 ++++--------
 py/objlist.h         |  6 ++++++
 py/objmap.c          |  8 ++------
 py/objmodule.c       | 12 ++++--------
 py/objmodule.h       |  6 ++++++
 py/objnamedtuple.c   | 10 +++-------
 py/objnone.c         |  9 +++------
 py/objobject.c       |  9 +++------
 py/objproperty.c     |  8 ++------
 py/objrange.c        | 10 +++-------
 py/objreversed.c     |  8 ++------
 py/objset.c          | 12 ++++--------
 py/objslice.c        |  9 +++------
 py/objstr.c          | 19 +++++++------------
 py/objstr.h          |  6 ++++++
 py/objstringio.c     | 12 ++++--------
 py/objstrunicode.c   | 17 ++++++-----------
 py/objtuple.c        | 12 ++++--------
 py/objtuple.h        |  6 ++++++
 py/objtype.c         | 12 ++++--------
 py/objtype.h         |  6 ++++++
 py/objzip.c          |  8 ++------
 py/opmethods.c       | 10 ++--------
 py/parse.c           | 17 +++++++----------
 py/parse.h           |  4 ++++
 py/parsehelper.c     |  9 +--------
 py/parsehelper.h     |  1 +
 py/parsenum.c        | 12 +++---------
 py/parsenum.h        |  8 ++++++++
 py/parsenumbase.c    |  4 +---
 py/parsenumbase.h    |  6 ++++++
 py/pfenv.c           | 13 ++++---------
 py/pfenv.h           |  6 ++++++
 py/pfenv_printf.c    | 10 ++--------
 py/qstr.c            |  7 ++-----
 py/qstrdefs.h        |  3 ++-
 py/repl.c            |  4 +---
 py/repl.h            |  7 +++++++
 py/runtime.c         | 37 ++++++++++++++-----------------------
 py/scope.c           | 10 +---------
 py/scope.h           |  7 +++++++
 py/sequence.c        | 13 ++++---------
 py/showbc.c          | 10 +++-------
 py/smallint.c        |  6 +-----
 py/smallint.h        |  7 +++++++
 py/stackctrl.c       | 10 +++-------
 py/stackctrl.h       |  6 ++++++
 py/stream.c          | 12 ++++--------
 py/stream.h          |  6 ++++++
 py/unicode.c         |  4 +---
 py/unicode.h         | 33 +++++++++++++++++++++++++++++++++
 py/vm.c              | 17 ++++++-----------
 py/vmentrytable.h    |  2 +-
 py/vstr.c            |  6 +++---
 py/warning.c         | 11 +++--------
 unix-cpy/main.c      |  1 -
 unix/modsocket.c     |  1 -
 128 files changed, 529 insertions(+), 818 deletions(-)
 delete mode 100644 py/lexerunix.h
 delete mode 100644 py/objarray.h

diff --git a/py/argcheck.c b/py/argcheck.c
index 4bc0629b1..f9a4eb7f4 100644
--- a/py/argcheck.c
+++ b/py/argcheck.c
@@ -27,12 +27,8 @@
 #include <stdlib.h>
 #include <assert.h>
 
-#include "mpconfig.h"
-#include "nlr.h"
-#include "misc.h"
-#include "qstr.h"
-#include "obj.h"
-#include "runtime.h"
+#include "py/nlr.h"
+#include "py/runtime.h"
 
 void mp_arg_check_num(mp_uint_t n_args, mp_uint_t n_kw, mp_uint_t n_args_min, mp_uint_t n_args_max, bool takes_kw) {
     // TODO maybe take the function name as an argument so we can print nicer error messages
diff --git a/py/asmarm.c b/py/asmarm.c
index 51852df5f..0ca88fd97 100644
--- a/py/asmarm.c
+++ b/py/asmarm.c
@@ -29,13 +29,13 @@
 #include <assert.h>
 #include <string.h>
 
-#include "mpconfig.h"
-#include "misc.h"
-#include "asmarm.h"
+#include "py/mpconfig.h"
 
 // wrapper around everything in this file
 #if MICROPY_EMIT_ARM
 
+#include "py/asmarm.h"
+
 #define SIGNED_FIT24(x) (((x) & 0xff800000) == 0) || (((x) & 0xff000000) == 0xff000000)
 
 struct _asm_arm_t {
diff --git a/py/asmthumb.c b/py/asmthumb.c
index 7ae6862b5..14ba5a6fc 100644
--- a/py/asmthumb.c
+++ b/py/asmthumb.c
@@ -28,13 +28,13 @@
 #include <assert.h>
 #include <string.h>
 
-#include "mpconfig.h"
-#include "misc.h"
-#include "asmthumb.h"
+#include "py/mpconfig.h"
 
 // wrapper around everything in this file
 #if MICROPY_EMIT_THUMB || MICROPY_EMIT_INLINE_THUMB
 
+#include "py/asmthumb.h"
+
 #define UNSIGNED_FIT8(x) (((x) & 0xffffff00) == 0)
 #define UNSIGNED_FIT16(x) (((x) & 0xffff0000) == 0)
 #define SIGNED_FIT8(x) (((x) & 0xffffff80) == 0) || (((x) & 0xffffff80) == 0xffffff80)
diff --git a/py/asmx64.c b/py/asmx64.c
index 54f541ffb..ded778fe0 100644
--- a/py/asmx64.c
+++ b/py/asmx64.c
@@ -29,13 +29,12 @@
 #include <assert.h>
 #include <string.h>
 
-#include "mpconfig.h"
-#include "misc.h"
+#include "py/mpconfig.h"
 
 // wrapper around everything in this file
 #if MICROPY_EMIT_X64
 
-#include "asmx64.h"
+#include "py/asmx64.h"
 
 /* all offsets are measured in multiples of 8 bytes */
 #define WORD_SIZE                (8)
diff --git a/py/asmx86.c b/py/asmx86.c
index f0dc1e60f..29ceaf8f8 100644
--- a/py/asmx86.c
+++ b/py/asmx86.c
@@ -29,13 +29,12 @@
 #include <assert.h>
 #include <string.h>
 
-#include "mpconfig.h"
-#include "misc.h"
+#include "py/mpconfig.h"
 
 // wrapper around everything in this file
 #if MICROPY_EMIT_X86
 
-#include "asmx86.h"
+#include "py/asmx86.h"
 
 /* all offsets are measured in multiples of 4 bytes */
 #define WORD_SIZE                (4)
diff --git a/py/bc.c b/py/bc.c
index bbc9a207d..6aa20172f 100644
--- a/py/bc.c
+++ b/py/bc.c
@@ -29,17 +29,9 @@
 #include <string.h>
 #include <assert.h>
 
-#include "mpconfig.h"
-#include "nlr.h"
-#include "misc.h"
-#include "qstr.h"
-#include "obj.h"
-#include "objtuple.h"
-#include "objfun.h"
-#include "runtime0.h"
-#include "runtime.h"
-#include "bc.h"
-#include "stackctrl.h"
+#include "py/nlr.h"
+#include "py/objfun.h"
+#include "py/bc.h"
 
 #if 0 // print debugging info
 #define DEBUG_PRINT (1)
diff --git a/py/bc.h b/py/bc.h
index ad16f9c9d..45c63f356 100644
--- a/py/bc.h
+++ b/py/bc.h
@@ -23,6 +23,11 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  * THE SOFTWARE.
  */
+#ifndef __MICROPY_INCLUDED_PY_BC_H__
+#define __MICROPY_INCLUDED_PY_BC_H__
+
+#include "py/runtime.h"
+#include "py/obj.h"
 
 // Exception stack entry
 typedef struct _mp_exc_stack {
@@ -61,3 +66,5 @@ const byte *mp_bytecode_print_str(const byte *ip);
 #define MP_TAGPTR_TAG0(x) ((mp_uint_t)(x) & 1)
 #define MP_TAGPTR_TAG1(x) ((mp_uint_t)(x) & 2)
 #define MP_TAGPTR_MAKE(ptr, tag) ((void*)((mp_uint_t)(ptr) | (tag)))
+
+#endif // __MICROPY_INCLUDED_PY_BC_H__
diff --git a/py/bc0.h b/py/bc0.h
index 0b1091759..42b8b6280 100644
--- a/py/bc0.h
+++ b/py/bc0.h
@@ -23,6 +23,8 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  * THE SOFTWARE.
  */
+#ifndef __MICROPY_INCLUDED_PY_BC0_H__
+#define __MICROPY_INCLUDED_PY_BC0_H__
 
 // Micro Python byte-codes.
 // The comment at the end of the line (if it exists) tells the arguments to the byte-code.
@@ -118,3 +120,5 @@
 #define MP_BC_STORE_FAST_MULTI           (0xc0) // + N(16)
 #define MP_BC_UNARY_OP_MULTI             (0xd0) // + op(5)
 #define MP_BC_BINARY_OP_MULTI            (0xd5) // + op(35)
+
+#endif // __MICROPY_INCLUDED_PY_BC0_H__
diff --git a/py/binary.c b/py/binary.c
index e4dac31e9..69818e536 100644
--- a/py/binary.c
+++ b/py/binary.c
@@ -30,12 +30,8 @@
 #include <string.h>
 #include <assert.h>
 
-#include "mpconfig.h"
-#include "misc.h"
-#include "qstr.h"
-#include "obj.h"
-#include "smallint.h"
-#include "binary.h"
+#include "py/binary.h"
+#include "py/smallint.h"
 
 // Helpers to work with binary-encoded data
 
diff --git a/py/binary.h b/py/binary.h
index dc9d3f680..a0ccbd5f4 100644
--- a/py/binary.h
+++ b/py/binary.h
@@ -23,6 +23,10 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  * THE SOFTWARE.
  */
+#ifndef __MICROPY_INCLUDED_PY_BINARY_H__
+#define __MICROPY_INCLUDED_PY_BINARY_H__
+
+#include "py/obj.h"
 
 // Use special typecode to differentiate repr() of bytearray vs array.array('B')
 // (underlyingly they're same).
@@ -36,3 +40,5 @@ mp_obj_t mp_binary_get_val(char struct_type, char val_type, byte **ptr);
 void mp_binary_set_val(char struct_type, char val_type, mp_obj_t val_in, byte **ptr);
 long long mp_binary_get_int(mp_uint_t size, bool is_signed, bool big_endian, const byte *src);
 void mp_binary_set_int(mp_uint_t val_sz, bool big_endian, byte *dest, mp_uint_t val);
+
+#endif // __MICROPY_INCLUDED_PY_BINARY_H__
diff --git a/py/builtin.h b/py/builtin.h
index 70f163379..14dc27324 100644
--- a/py/builtin.h
+++ b/py/builtin.h
@@ -23,6 +23,10 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  * THE SOFTWARE.
  */
+#ifndef __MICROPY_INCLUDED_PY_BUILTIN_H__
+#define __MICROPY_INCLUDED_PY_BUILTIN_H__
+
+#include "py/obj.h"
 
 mp_obj_t mp_builtin___import__(mp_uint_t n_args, const mp_obj_t *args);
 mp_obj_t mp_builtin_open(mp_uint_t n_args, const mp_obj_t *args, mp_map_t *kwargs);
@@ -101,3 +105,5 @@ extern const mp_obj_module_t mp_module_ure;
 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;
+
+#endif // __MICROPY_INCLUDED_PY_BUILTIN_H__
diff --git a/py/builtinevex.c b/py/builtinevex.c
index bb15fd4d0..9bca4a0f5 100644
--- a/py/builtinevex.c
+++ b/py/builtinevex.c
@@ -26,20 +26,11 @@
 
 #include <stdint.h>
 
-#include "mpconfig.h"
-#include "nlr.h"
-#include "misc.h"
-#include "qstr.h"
-#include "lexer.h"
-#include "lexerunix.h"
-#include "parse.h"
-#include "obj.h"
-#include "objfun.h"
-#include "parsehelper.h"
-#include "compile.h"
-#include "runtime0.h"
-#include "runtime.h"
-#include "builtin.h"
+#include "py/nlr.h"
+#include "py/objfun.h"
+#include "py/compile.h"
+#include "py/runtime.h"
+#include "py/builtin.h"
 
 #if MICROPY_PY_BUILTINS_COMPILE
 
diff --git a/py/builtinimport.c b/py/builtinimport.c
index fd804ee35..4dc02bdc2 100644
--- a/py/builtinimport.c
+++ b/py/builtinimport.c
@@ -25,25 +25,15 @@
  * THE SOFTWARE.
  */
 
-#include <stdint.h>
 #include <stdio.h>
 #include <string.h>
 #include <assert.h>
 
-#include "mpconfig.h"
-#include "nlr.h"
-#include "misc.h"
-#include "qstr.h"
-#include "lexer.h"
-#include "lexerunix.h"
-#include "parse.h"
-#include "obj.h"
-#include "objmodule.h"
-#include "parsehelper.h"
-#include "compile.h"
-#include "runtime0.h"
-#include "runtime.h"
-#include "builtin.h"
+#include "py/nlr.h"
+#include "py/compile.h"
+#include "py/objmodule.h"
+#include "py/runtime.h"
+#include "py/builtin.h"
 
 #if 0 // print debugging info
 #define DEBUG_PRINT (1)
diff --git a/py/compile.c b/py/compile.c
index 66e2996c4..b2ba01cc9 100644
--- a/py/compile.c
+++ b/py/compile.c
@@ -31,26 +31,18 @@
 #include <assert.h>
 #include <math.h>
 
-#include "mpconfig.h"
-#include "misc.h"
-#include "qstr.h"
-#include "lexer.h"
-#include "parse.h"
-#include "runtime0.h"
-#include "obj.h"
-#include "emitglue.h"
-#include "scope.h"
-#include "emit.h"
-#include "compile.h"
-#include "runtime.h"
-#include "builtin.h"
-#include "smallint.h"
+#include "py/scope.h"
+#include "py/emit.h"
+#include "py/compile.h"
+#include "py/smallint.h"
+#include "py/runtime.h"
+#include "py/builtin.h"
 
 // TODO need to mangle __attr names
 
 typedef enum {
 #define DEF_RULE(rule, comp, kind, ...) PN_##rule,
-#include "grammar.h"
+#include "py/grammar.h"
 #undef DEF_RULE
     PN_maximum_number_of,
     PN_string, // special node for non-interned string
@@ -2937,7 +2929,7 @@ STATIC compile_function_t compile_function[] = {
 #define nc NULL
 #define c(f) compile_##f
 #define DEF_RULE(rule, comp, kind, ...) comp,
-#include "grammar.h"
+#include "py/grammar.h"
 #undef nc
 #undef c
 #undef DEF_RULE
diff --git a/py/emit.h b/py/emit.h
index f039770a5..49bb76ead 100644
--- a/py/emit.h
+++ b/py/emit.h
@@ -24,6 +24,13 @@
  * THE SOFTWARE.
  */
 
+#ifndef __MICROPY_INCLUDED_PY_EMIT_H__
+#define __MICROPY_INCLUDED_PY_EMIT_H__
+
+#include "py/lexer.h"
+#include "py/scope.h"
+#include "py/runtime0.h"
+
 /* Notes on passes:
  * We don't know exactly the opcodes in pass 1 because they depend on the
  * closing over of variables (LOAD_CLOSURE, BUILD_TUPLE, MAKE_CLOSURE), which
@@ -33,10 +40,6 @@
  * This is problematic for some emitters (x64) since they need to know the maximum
  * stack size to compile the entry to the function, and this affects code size.
  */
-#ifndef __MICROPY_INCLUDED_PY_EMIT_H__
-#define __MICROPY_INCLUDED_PY_EMIT_H__
-
-#include "py/runtime0.h"
 
 typedef enum {
     MP_PASS_SCOPE = 1,      // work out id's and their kind, and number of labels
diff --git a/py/emitbc.c b/py/emitbc.c
index f55a16634..3914a9dcb 100644
--- a/py/emitbc.c
+++ b/py/emitbc.c
@@ -30,17 +30,8 @@
 #include <string.h>
 #include <assert.h>
 
-#include "mpconfig.h"
-#include "misc.h"
-#include "qstr.h"
-#include "lexer.h"
-#include "parse.h"
-#include "obj.h"
-#include "emitglue.h"
-#include "scope.h"
-#include "runtime0.h"
-#include "emit.h"
-#include "bc0.h"
+#include "py/emit.h"
+#include "py/bc0.h"
 
 #if !MICROPY_EMIT_CPYTHON
 
diff --git a/py/emitcommon.c b/py/emitcommon.c
index e199bc6e9..4d909839a 100644
--- a/py/emitcommon.c
+++ b/py/emitcommon.c
@@ -28,16 +28,7 @@
 #include <stdint.h>
 #include <assert.h>
 
-#include "mpconfig.h"
-#include "misc.h"
-#include "qstr.h"
-#include "lexer.h"
-#include "parse.h"
-#include "runtime0.h"
-#include "obj.h"
-#include "emitglue.h"
-#include "scope.h"
-#include "emit.h"
+#include "py/emit.h"
 
 #define EMIT(fun, ...) (emit_method_table->fun(emit, __VA_ARGS__))
 
diff --git a/py/emitcpy.c b/py/emitcpy.c
index bcf8a22c3..a1e8e95c8 100644
--- a/py/emitcpy.c
+++ b/py/emitcpy.c
@@ -30,16 +30,7 @@
 #include <string.h>
 #include <assert.h>
 
-#include "mpconfig.h"
-#include "misc.h"
-#include "qstr.h"
-#include "lexer.h"
-#include "parse.h"
-#include "obj.h"
-#include "emitglue.h"
-#include "scope.h"
-#include "runtime0.h"
-#include "emit.h"
+#include "py/emit.h"
 
 // wrapper around everything in this file
 #if MICROPY_EMIT_CPYTHON
diff --git a/py/emitglue.c b/py/emitglue.c
index 5d51ba2a6..65d131125 100644
--- a/py/emitglue.c
+++ b/py/emitglue.c
@@ -30,14 +30,9 @@
 #include <string.h>
 #include <assert.h>
 
-#include "mpconfig.h"
-#include "misc.h"
-#include "qstr.h"
-#include "obj.h"
-#include "runtime0.h"
-#include "runtime.h"
-#include "emitglue.h"
-#include "bc.h"
+#include "py/emitglue.h"
+#include "py/runtime0.h"
+#include "py/bc.h"
 
 #if 0 // print debugging info
 #define DEBUG_PRINT (1)
diff --git a/py/emitglue.h b/py/emitglue.h
index 60ccd6740..6e7e72ef5 100644
--- a/py/emitglue.h
+++ b/py/emitglue.h
@@ -26,6 +26,8 @@
 #ifndef __MICROPY_INCLUDED_PY_EMITGLUE_H__
 #define __MICROPY_INCLUDED_PY_EMITGLUE_H__
 
+#include "py/obj.h"
+
 // These variables and functions glue the code emitters to the runtime.
 
 typedef enum {
diff --git a/py/emitinlinethumb.c b/py/emitinlinethumb.c
index 4cf880fab..669929b0d 100644
--- a/py/emitinlinethumb.c
+++ b/py/emitinlinethumb.c
@@ -30,23 +30,14 @@
 #include <stdarg.h>
 #include <assert.h>
 
-#include "mpconfig.h"
-#include "misc.h"
-#include "qstr.h"
-#include "lexer.h"
-#include "parse.h"
-#include "obj.h"
-#include "emitglue.h"
-#include "scope.h"
-#include "runtime0.h"
-#include "emit.h"
-#include "asmthumb.h"
+#include "py/emit.h"
+#include "py/asmthumb.h"
 
 #if MICROPY_EMIT_INLINE_THUMB
 
 typedef enum {
 #define DEF_RULE(rule, comp, kind, ...) PN_##rule,
-#include "grammar.h"
+#include "py/grammar.h"
 #undef DEF_RULE
     PN_maximum_number_of,
 } pn_kind_t;
diff --git a/py/emitnative.c b/py/emitnative.c
index c8f8cd8f2..494f89093 100644
--- a/py/emitnative.c
+++ b/py/emitnative.c
@@ -42,24 +42,12 @@
 
 // for x in l[0:8]: can be compiled into a native loop if l has pointer type
 
-#include <stdbool.h>
-#include <stdint.h>
 #include <stdio.h>
 #include <string.h>
 #include <assert.h>
 
-#include "mpconfig.h"
-#include "nlr.h"
-#include "misc.h"
-#include "qstr.h"
-#include "lexer.h"
-#include "parse.h"
-#include "obj.h"
-#include "emitglue.h"
-#include "scope.h"
-#include "runtime0.h"
-#include "emit.h"
-#include "runtime.h"
+#include "py/nlr.h"
+#include "py/emit.h"
 
 #if 0 // print debugging info
 #define DEBUG_PRINT (1)
@@ -78,7 +66,7 @@
 
 // x64 specific stuff
 
-#include "asmx64.h"
+#include "py/asmx64.h"
 
 #define EXPORT_FUN(name) emit_native_x64_##name
 
@@ -163,7 +151,7 @@
 
 // x86 specific stuff
 
-#include "asmx86.h"
+#include "py/asmx86.h"
 
 STATIC byte mp_f_n_args[MP_F_NUMBER_OF] = {
     [MP_F_CONVERT_OBJ_TO_NATIVE] = 2,
@@ -295,7 +283,7 @@ STATIC byte mp_f_n_args[MP_F_NUMBER_OF] = {
 
 // thumb specific stuff
 
-#include "asmthumb.h"
+#include "py/asmthumb.h"
 
 #define EXPORT_FUN(name) emit_native_thumb_##name
 
@@ -378,7 +366,7 @@ STATIC byte mp_f_n_args[MP_F_NUMBER_OF] = {
 
 // ARM specific stuff
 
-#include "asmarm.h"
+#include "py/asmarm.h"
 
 #define EXPORT_FUN(name) emit_native_arm_##name
 
diff --git a/py/emitpass1.c b/py/emitpass1.c
index 9e471ef59..8878b562e 100644
--- a/py/emitpass1.c
+++ b/py/emitpass1.c
@@ -24,20 +24,9 @@
  * THE SOFTWARE.
  */
 
-#include <stdlib.h>
-#include <stdint.h>
 #include <assert.h>
 
-#include "mpconfig.h"
-#include "misc.h"
-#include "qstr.h"
-#include "lexer.h"
-#include "parse.h"
-#include "obj.h"
-#include "emitglue.h"
-#include "scope.h"
-#include "runtime0.h"
-#include "emit.h"
+#include "py/emit.h"
 
 struct _emit_t {
     scope_t *scope;
diff --git a/py/formatfloat.c b/py/formatfloat.c
index d1b12cdd5..e73215a7a 100644
--- a/py/formatfloat.c
+++ b/py/formatfloat.c
@@ -42,10 +42,11 @@
 #include <stdlib.h>
 #include <stdint.h>
 
-#include "mpconfig.h"
+#include "py/mpconfig.h"
 
 #if MICROPY_FLOAT_IMPL == MICROPY_FLOAT_IMPL_FLOAT
-#include "formatfloat.h"
+
+#include "py/formatfloat.h"
 
 // 1 sign bit, 8 exponent bits, and 23 mantissa bits.
 // exponent values 0 and 255 are reserved, exponent can be 1 to 254.
@@ -63,7 +64,7 @@ static const float g_neg_pow[] = {
     1e-32, 1e-16, 1e-8, 1e-4, 1e-2, 1e-1
 };
 
-int format_float(float f, char *buf, size_t buf_size, char fmt, int prec, char sign) {
+int mp_format_float(float f, char *buf, size_t buf_size, char fmt, int prec, char sign) {
 
     char *s = buf;
     int buf_remaining = buf_size - 1;
diff --git a/py/formatfloat.h b/py/formatfloat.h
index 3b963df41..1eb2c1e46 100644
--- a/py/formatfloat.h
+++ b/py/formatfloat.h
@@ -23,5 +23,9 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  * THE SOFTWARE.
  */
+#ifndef __MICROPY_INCLUDED_PY_FORMATFLOAT_H__
+#define __MICROPY_INCLUDED_PY_FORMATFLOAT_H__
 
-int format_float(float f, char *buf, size_t bufSize, char fmt, int prec, char sign);
+int mp_format_float(float f, char *buf, size_t bufSize, char fmt, int prec, char sign);
+
+#endif // __MICROPY_INCLUDED_PY_FORMATFLOAT_H__
diff --git a/py/gc.c b/py/gc.c
index 4d9334056..8404281e4 100644
--- a/py/gc.c
+++ b/py/gc.c
@@ -27,16 +27,10 @@
 #include <assert.h>
 #include <stdio.h>
 #include <string.h>
-#include <stdbool.h>
-#include <stdint.h>
 
-#include "mpconfig.h"
-#include "misc.h"
-#include "gc.h"
-
-#include "qstr.h"
-#include "obj.h"
-#include "runtime.h"
+#include "py/gc.h"
+#include "py/obj.h"
+#include "py/runtime.h"
 
 #if MICROPY_ENABLE_GC
 
diff --git a/py/gc.h b/py/gc.h
index 69fe83752..c698c7d21 100644
--- a/py/gc.h
+++ b/py/gc.h
@@ -23,6 +23,13 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  * THE SOFTWARE.
  */
+#ifndef __MICROPY_INCLUDED_PY_GC_H__
+#define __MICROPY_INCLUDED_PY_GC_H__
+
+#include <stdint.h>
+
+#include "py/mpconfig.h"
+#include "py/misc.h"
 
 void gc_init(void *start, void *end);
 
@@ -60,3 +67,5 @@ typedef struct _gc_info_t {
 void gc_info(gc_info_t *info);
 void gc_dump_info(void);
 void gc_dump_alloc_table(void);
+
+#endif // __MICROPY_INCLUDED_PY_GC_H__
diff --git a/py/lexer.c b/py/lexer.c
index bc1b8babf..ce6aa783a 100644
--- a/py/lexer.c
+++ b/py/lexer.c
@@ -24,18 +24,10 @@
  * THE SOFTWARE.
  */
 
-/* lexer.c -- simple tokeniser for Python implementation
- */
-
-#include <stdbool.h>
-#include <stdint.h>
 #include <stdio.h>
 #include <assert.h>
 
-#include "mpconfig.h"
-#include "misc.h"
-#include "qstr.h"
-#include "lexer.h"
+#include "py/lexer.h"
 
 #define TAB_SIZE (8)
 
diff --git a/py/lexer.h b/py/lexer.h
index 7f8d93b1e..c2d2b678a 100644
--- a/py/lexer.h
+++ b/py/lexer.h
@@ -26,6 +26,11 @@
 #ifndef __MICROPY_INCLUDED_PY_LEXER_H__
 #define __MICROPY_INCLUDED_PY_LEXER_H__
 
+#include <stdint.h>
+
+#include "py/mpconfig.h"
+#include "py/qstr.h"
+
 /* lexer.h -- simple tokeniser for Micro Python
  *
  * Uses (byte) length instead of null termination.
diff --git a/py/lexerstr.c b/py/lexerstr.c
index c3456b9bd..cab3ed361 100644
--- a/py/lexerstr.c
+++ b/py/lexerstr.c
@@ -24,12 +24,7 @@
  * THE SOFTWARE.
  */
 
-#include <stdint.h>
-
-#include "mpconfig.h"
-#include "misc.h"
-#include "qstr.h"
-#include "lexer.h"
+#include "py/lexer.h"
 
 typedef struct _mp_lexer_str_buf_t {
     mp_uint_t free_len;         // if > 0, src_beg will be freed when done by: m_free(src_beg, free_len)
diff --git a/py/lexerunix.c b/py/lexerunix.c
index 8e3241ad0..b5abbc8fe 100644
--- a/py/lexerunix.c
+++ b/py/lexerunix.c
@@ -24,8 +24,7 @@
  * THE SOFTWARE.
  */
 
-#include "mpconfig.h"
-#include "misc.h"
+#include "py/mpconfig.h"
 
 #if MICROPY_HELPER_LEXER_UNIX
 
@@ -36,9 +35,7 @@
 #include <sys/stat.h>
 #include <sys/types.h>
 
-#include "qstr.h"
-#include "lexer.h"
-#include "lexerunix.h"
+#include "py/lexer.h"
 
 typedef struct _mp_lexer_file_buf_t {
     int fd;
diff --git a/py/lexerunix.h b/py/lexerunix.h
deleted file mode 100644
index 12c3e8712..000000000
--- a/py/lexerunix.h
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * This file is part of the Micro Python project, http://micropython.org/
- *
- * The MIT License (MIT)
- *
- * Copyright (c) 2013, 2014 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
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-mp_lexer_t *mp_lexer_new_from_file(const char *filename);
-
-void mp_import_set_directory(const char *dir);
diff --git a/py/malloc.c b/py/malloc.c
index 451e480e8..10e3566e8 100644
--- a/py/malloc.c
+++ b/py/malloc.c
@@ -27,10 +27,9 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
-#include <stdint.h>
 
-#include "mpconfig.h"
-#include "misc.h"
+#include "py/mpconfig.h"
+#include "py/misc.h"
 
 #if 0 // print debugging info
 #define DEBUG_printf DEBUG_printf
@@ -47,7 +46,7 @@ STATIC size_t peak_bytes_allocated = 0;
 #endif
 
 #if MICROPY_ENABLE_GC
-#include "gc.h"
+#include "py/gc.h"
 
 // We redirect standard alloc functions to GC heap - just for the rest of
 // this module. In the rest of micropython source, system malloc can be
diff --git a/py/map.c b/py/map.c
index 22580de82..c88e6e56e 100644
--- a/py/map.c
+++ b/py/map.c
@@ -28,11 +28,9 @@
 #include <stdlib.h>
 #include <assert.h>
 
-#include "mpconfig.h"
-#include "misc.h"
-#include "qstr.h"
-#include "obj.h"
-#include "runtime0.h"
+#include "py/mpconfig.h"
+#include "py/misc.h"
+#include "py/obj.h"
 
 // Fixed empty map. Useful when need to call kw-receiving functions
 // without any keywords from C, etc.
diff --git a/py/modarray.c b/py/modarray.c
index 360fe8a5f..e251b0688 100644
--- a/py/modarray.c
+++ b/py/modarray.c
@@ -24,11 +24,7 @@
  * THE SOFTWARE.
  */
 
-#include "mpconfig.h"
-#include "misc.h"
-#include "qstr.h"
-#include "obj.h"
-#include "builtin.h"
+#include "py/builtin.h"
 
 #if MICROPY_PY_ARRAY
 
diff --git a/py/modbuiltins.c b/py/modbuiltins.c
index 7ac22fc49..4a1446d23 100644
--- a/py/modbuiltins.c
+++ b/py/modbuiltins.c
@@ -27,18 +27,14 @@
 #include <stdio.h>
 #include <assert.h>
 
-#include "mpconfig.h"
-#include "nlr.h"
-#include "misc.h"
-#include "qstr.h"
-#include "obj.h"
-#include "objstr.h"
-#include "smallint.h"
-#include "runtime0.h"
-#include "runtime.h"
-#include "builtin.h"
-#include "stream.h"
-#include "pfenv.h"
+#include "py/nlr.h"
+#include "py/smallint.h"
+#include "py/objstr.h"
+#include "py/runtime0.h"
+#include "py/runtime.h"
+#include "py/builtin.h"
+#include "py/stream.h"
+#include "py/pfenv.h"
 
 #if MICROPY_PY_BUILTINS_FLOAT
 #include <math.h>
diff --git a/py/modcmath.c b/py/modcmath.c
index 7514a8c02..59fa76ee6 100644
--- a/py/modcmath.c
+++ b/py/modcmath.c
@@ -24,16 +24,12 @@
  * THE SOFTWARE.
  */
 
-#include <math.h>
-
-#include "mpconfig.h"
-#include "misc.h"
-#include "qstr.h"
-#include "obj.h"
-#include "builtin.h"
+#include "py/builtin.h"
 
 #if MICROPY_PY_BUILTINS_FLOAT && MICROPY_PY_CMATH
 
+#include <math.h>
+
 /// \module cmath - mathematical functions for complex numbers
 ///
 /// The `cmath` module provides some basic mathematical funtions for
diff --git a/py/modcollections.c b/py/modcollections.c
index 8035b72d5..9fcbe879f 100644
--- a/py/modcollections.c
+++ b/py/modcollections.c
@@ -24,11 +24,7 @@
  * THE SOFTWARE.
  */
 
-#include "mpconfig.h"
-#include "misc.h"
-#include "qstr.h"
-#include "obj.h"
-#include "builtin.h"
+#include "py/builtin.h"
 
 #if MICROPY_PY_COLLECTIONS
 
diff --git a/py/modgc.c b/py/modgc.c
index 8c9be7068..e3cbe72f9 100644
--- a/py/modgc.c
+++ b/py/modgc.c
@@ -24,14 +24,8 @@
  * THE SOFTWARE.
  */
 
-#include <stdint.h>
-
-#include "mpconfig.h"
-#include "misc.h"
-#include "qstr.h"
-#include "obj.h"
-#include "runtime.h"
-#include "gc.h"
+#include "py/obj.h"
+#include "py/gc.h"
 
 #if MICROPY_PY_GC && MICROPY_ENABLE_GC
 
diff --git a/py/modio.c b/py/modio.c
index 6a273b39b..30f766b40 100644
--- a/py/modio.c
+++ b/py/modio.c
@@ -24,11 +24,7 @@
  * THE SOFTWARE.
  */
 
-#include "mpconfig.h"
-#include "misc.h"
-#include "qstr.h"
-#include "obj.h"
-#include "builtin.h"
+#include "py/builtin.h"
 
 #if MICROPY_PY_IO
 
diff --git a/py/modmath.c b/py/modmath.c
index b922f3e49..38ed390dd 100644
--- a/py/modmath.c
+++ b/py/modmath.c
@@ -24,16 +24,12 @@
  * THE SOFTWARE.
  */
 
-#include <math.h>
-
-#include "mpconfig.h"
-#include "misc.h"
-#include "qstr.h"
-#include "obj.h"
-#include "builtin.h"
+#include "py/builtin.h"
 
 #if MICROPY_PY_BUILTINS_FLOAT && MICROPY_PY_MATH
 
+#include <math.h>
+
 /// \module math - mathematical functions
 ///
 /// The `math` module provides some basic mathematical funtions for
diff --git a/py/modmicropython.c b/py/modmicropython.c
index 170141757..035956ffc 100644
--- a/py/modmicropython.c
+++ b/py/modmicropython.c
@@ -24,15 +24,11 @@
  * THE SOFTWARE.
  */
 
-#include <stdint.h>
 #include <stdio.h>
-#include "mpconfig.h"
-#include "misc.h"
-#include "qstr.h"
-#include "obj.h"
-#include "builtin.h"
-#include "stackctrl.h"
-#include "gc.h"
+
+#include "py/builtin.h"
+#include "py/stackctrl.h"
+#include "py/gc.h"
 
 // Various builtins specific to MicroPython runtime,
 // living in micropython module
diff --git a/py/modstruct.c b/py/modstruct.c
index f29c8c1f9..114135dfd 100644
--- a/py/modstruct.c
+++ b/py/modstruct.c
@@ -27,15 +27,11 @@
 
 #include <assert.h>
 #include <string.h>
-#include "mpconfig.h"
-#include "misc.h"
-#include "qstr.h"
-#include "obj.h"
-#include "builtin.h"
-#include "objtuple.h"
-#include "objstr.h"
-#include "binary.h"
-#include "parsenum.h"
+
+#include "py/builtin.h"
+#include "py/objtuple.h"
+#include "py/binary.h"
+#include "py/parsenum.h"
 
 #if MICROPY_PY_STRUCT
 
diff --git a/py/modsys.c b/py/modsys.c
index 06bd4c80e..51bd6bfbb 100644
--- a/py/modsys.c
+++ b/py/modsys.c
@@ -24,22 +24,14 @@
  * THE SOFTWARE.
  */
 
-#include <stdint.h>
-
-#include "mpconfig.h"
-#include "nlr.h"
-#include "misc.h"
-#include "qstr.h"
-#include "obj.h"
-#include "builtin.h"
-#include "runtime.h"
-#include "objlist.h"
-#include "objtuple.h"
-#include "objstr.h"
-#include "mpz.h"
-#include "objint.h"
-#include "pfenv.h"
-#include "stream.h"
+#include "py/nlr.h"
+#include "py/builtin.h"
+#include "py/objlist.h"
+#include "py/objtuple.h"
+#include "py/objstr.h"
+#include "py/objint.h"
+#include "py/pfenv.h"
+#include "py/stream.h"
 
 #if MICROPY_PY_SYS
 
diff --git a/py/mpz.c b/py/mpz.c
index 6213b4a57..a25ba9e7d 100644
--- a/py/mpz.c
+++ b/py/mpz.c
@@ -24,15 +24,10 @@
  * THE SOFTWARE.
  */
 
-#include <stdint.h>
-#include <stdbool.h>
-#include <stdlib.h>
 #include <string.h>
 #include <assert.h>
 
-#include "mpconfig.h"
-#include "misc.h"
-#include "mpz.h"
+#include "py/mpz.h"
 
 #if MICROPY_LONGINT_IMPL == MICROPY_LONGINT_IMPL_MPZ
 
diff --git a/py/mpz.h b/py/mpz.h
index 3ae9efe42..e1d71bf4a 100644
--- a/py/mpz.h
+++ b/py/mpz.h
@@ -23,6 +23,13 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  * THE SOFTWARE.
  */
+#ifndef __MICROPY_INCLUDED_PY_MPZ_H__
+#define __MICROPY_INCLUDED_PY_MPZ_H__
+
+#include <stdint.h>
+
+#include "py/mpconfig.h"
+#include "py/misc.h"
 
 // This mpz module implements arbitrary precision integers.
 //
@@ -131,3 +138,5 @@ mp_float_t mpz_as_float(const mpz_t *z);
 #endif
 mp_uint_t mpz_as_str_size(const mpz_t *i, mp_uint_t base, const char *prefix, char comma);
 mp_uint_t mpz_as_str_inpl(const mpz_t *z, mp_uint_t base, const char *prefix, char base_char, char comma, char *str);
+
+#endif // __MICROPY_INCLUDED_PY_MPZ_H__
diff --git a/py/nativeglue.c b/py/nativeglue.c
index 05fadb7b0..d52eeaeaa 100644
--- a/py/nativeglue.c
+++ b/py/nativeglue.c
@@ -28,14 +28,10 @@
 #include <string.h>
 #include <assert.h>
 
-#include "mpconfig.h"
-#include "nlr.h"
-#include "misc.h"
-#include "qstr.h"
-#include "obj.h"
-#include "runtime0.h"
-#include "runtime.h"
-#include "emitglue.h"
+#include "py/nlr.h"
+#include "py/runtime0.h"
+#include "py/runtime.h"
+#include "py/emitglue.h"
 
 #if MICROPY_EMIT_NATIVE
 
diff --git a/py/nlr.h b/py/nlr.h
index 93eaa78b7..ae9ca1a77 100644
--- a/py/nlr.h
+++ b/py/nlr.h
@@ -23,6 +23,8 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  * THE SOFTWARE.
  */
+#ifndef __MICROPY_INCLUDED_PY_NLR_H__
+#define __MICROPY_INCLUDED_PY_NLR_H__
 
 // non-local return
 // exception handling, basically a stack of setjmp/longjmp buffers
@@ -31,6 +33,8 @@
 #include <setjmp.h>
 #include <assert.h>
 
+#include "py/mpconfig.h"
+
 typedef struct _nlr_buf_t nlr_buf_t;
 struct _nlr_buf_t {
     // the entries here must all be machine word size
@@ -91,3 +95,5 @@ void nlr_jump_fail(void *val);
         nlr_jump(_val); \
     } while (0)
 #endif
+
+#endif // __MICROPY_INCLUDED_PY_NLR_H__
diff --git a/py/nlrsetjmp.c b/py/nlrsetjmp.c
index cb5acb757..176138db0 100644
--- a/py/nlrsetjmp.c
+++ b/py/nlrsetjmp.c
@@ -24,10 +24,7 @@
  * THE SOFTWARE.
  */
 
-#include <setjmp.h>
-#include <stdio.h>
-#include "mpconfig.h"
-#include "nlr.h"
+#include "py/nlr.h"
 
 #if MICROPY_NLR_SETJMP
 
diff --git a/py/obj.c b/py/obj.c
index d2801a396..0caf10074 100644
--- a/py/obj.c
+++ b/py/obj.c
@@ -29,17 +29,13 @@
 #include <stdarg.h>
 #include <assert.h>
 
-#include "mpconfig.h"
-#include "nlr.h"
-#include "misc.h"
-#include "qstr.h"
-#include "obj.h"
-#include "objtype.h"
-#include "mpz.h"
-#include "objint.h"
-#include "runtime0.h"
-#include "runtime.h"
-#include "stackctrl.h"
+#include "py/nlr.h"
+#include "py/obj.h"
+#include "py/objtype.h"
+#include "py/objint.h"
+#include "py/runtime0.h"
+#include "py/runtime.h"
+#include "py/stackctrl.h"
 
 mp_obj_type_t *mp_obj_get_type(mp_const_obj_t o_in) {
     if (MP_OBJ_IS_SMALL_INT(o_in)) {
diff --git a/py/objarray.c b/py/objarray.c
index cb8e03e45..19705afc0 100644
--- a/py/objarray.c
+++ b/py/objarray.c
@@ -29,14 +29,10 @@
 #include <assert.h>
 #include <stdint.h>
 
-#include "mpconfig.h"
-#include "nlr.h"
-#include "misc.h"
-#include "qstr.h"
-#include "obj.h"
-#include "runtime0.h"
-#include "runtime.h"
-#include "binary.h"
+#include "py/nlr.h"
+#include "py/runtime0.h"
+#include "py/runtime.h"
+#include "py/binary.h"
 
 #if MICROPY_PY_ARRAY || MICROPY_PY_BUILTINS_BYTEARRAY || MICROPY_PY_BUILTINS_MEMORYVIEW
 
diff --git a/py/objarray.h b/py/objarray.h
deleted file mode 100644
index 730f67641..000000000
--- a/py/objarray.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * This file is part of the Micro Python project, http://micropython.org/
- *
- * The MIT License (MIT)
- *
- * Copyright (c) 2013, 2014 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
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-mp_obj_t mp_obj_new_bytearray(mp_uint_t n, void *items);
diff --git a/py/objbool.c b/py/objbool.c
index 47c91357f..6dd9e7f9f 100644
--- a/py/objbool.c
+++ b/py/objbool.c
@@ -26,13 +26,9 @@
 
 #include <stdlib.h>
 
-#include "mpconfig.h"
-#include "nlr.h"
-#include "misc.h"
-#include "qstr.h"
-#include "obj.h"
-#include "runtime0.h"
-#include "runtime.h"
+#include "py/obj.h"
+#include "py/runtime0.h"
+#include "py/runtime.h"
 
 typedef struct _mp_obj_bool_t {
     mp_obj_base_t base;
diff --git a/py/objboundmeth.c b/py/objboundmeth.c
index 66af5df0a..e451ce4c1 100644
--- a/py/objboundmeth.c
+++ b/py/objboundmeth.c
@@ -26,12 +26,8 @@
 
 #include <string.h>
 
-#include "mpconfig.h"
-#include "nlr.h"
-#include "misc.h"
-#include "qstr.h"
-#include "obj.h"
-#include "runtime.h"
+#include "py/obj.h"
+#include "py/runtime.h"
 
 typedef struct _mp_obj_bound_meth_t {
     mp_obj_base_t base;
diff --git a/py/objcell.c b/py/objcell.c
index 29280e851..b2d42001b 100644
--- a/py/objcell.c
+++ b/py/objcell.c
@@ -24,12 +24,7 @@
  * THE SOFTWARE.
  */
 
-#include "mpconfig.h"
-#include "nlr.h"
-#include "misc.h"
-#include "qstr.h"
-#include "obj.h"
-#include "runtime.h"
+#include "py/obj.h"
 
 typedef struct _mp_obj_cell_t {
     mp_obj_base_t base;
diff --git a/py/objclosure.c b/py/objclosure.c
index d563206b6..853f0930c 100644
--- a/py/objclosure.c
+++ b/py/objclosure.c
@@ -26,13 +26,8 @@
 
 #include <string.h>
 
-#include "mpconfig.h"
-#include "nlr.h"
-#include "misc.h"
-#include "qstr.h"
-#include "obj.h"
-#include "objtuple.h"
-#include "runtime.h"
+#include "py/obj.h"
+#include "py/runtime.h"
 
 typedef struct _mp_obj_closure_t {
     mp_obj_base_t base;
diff --git a/py/objcomplex.c b/py/objcomplex.c
index 2768a01e6..9e158fac6 100644
--- a/py/objcomplex.c
+++ b/py/objcomplex.c
@@ -28,21 +28,18 @@
 #include <stdio.h>
 #include <assert.h>
 
-#include "mpconfig.h"
-#include "nlr.h"
-#include "misc.h"
-#include "qstr.h"
-#include "obj.h"
-#include "parsenum.h"
-#include "runtime0.h"
-#include "runtime.h"
+#include "py/nlr.h"
+#include "py/obj.h"
+#include "py/parsenum.h"
+#include "py/runtime0.h"
+#include "py/runtime.h"
 
 #if MICROPY_PY_BUILTINS_COMPLEX
 
 #include <math.h>
 
 #if MICROPY_FLOAT_IMPL == MICROPY_FLOAT_IMPL_FLOAT
-#include "formatfloat.h"
+#include "py/formatfloat.h"
 #endif
 
 typedef struct _mp_obj_complex_t {
@@ -58,12 +55,12 @@ STATIC void complex_print(void (*print)(void *env, const char *fmt, ...), void *
 #if MICROPY_FLOAT_IMPL == MICROPY_FLOAT_IMPL_FLOAT
     char buf[16];
     if (o->real == 0) {
-        format_float(o->imag, buf, sizeof(buf), 'g', 7, '\0');
+        mp_format_float(o->imag, buf, sizeof(buf), 'g', 7, '\0');
         print(env, "%sj", buf);
     } else {
-        format_float(o->real, buf, sizeof(buf), 'g', 7, '\0');
+        mp_format_float(o->real, buf, sizeof(buf), 'g', 7, '\0');
         print(env, "(%s+", buf);
-        format_float(o->imag, buf, sizeof(buf), 'g', 7, '\0');
+        mp_format_float(o->imag, buf, sizeof(buf), 'g', 7, '\0');
         print(env, "%sj)", buf);
     }
 #else
diff --git a/py/objdict.c b/py/objdict.c
index 2f4ae7083..63b3cfb32 100644
--- a/py/objdict.c
+++ b/py/objdict.c
@@ -24,19 +24,14 @@
  * THE SOFTWARE.
  */
 
-#include <stdbool.h>
 #include <string.h>
 #include <assert.h>
 
-#include "mpconfig.h"
-#include "nlr.h"
-#include "misc.h"
-#include "qstr.h"
-#include "obj.h"
-#include "objtuple.h"
-#include "runtime0.h"
-#include "runtime.h"
-#include "builtin.h"
+#include "py/nlr.h"
+#include "py/obj.h"
+#include "py/runtime0.h"
+#include "py/runtime.h"
+#include "py/builtin.h"
 
 STATIC mp_obj_t dict_update(mp_uint_t n_args, const mp_obj_t *args, mp_map_t *kwargs);
 
diff --git a/py/objenumerate.c b/py/objenumerate.c
index 0d96712df..209af8231 100644
--- a/py/objenumerate.c
+++ b/py/objenumerate.c
@@ -27,11 +27,7 @@
 #include <stdlib.h>
 #include <assert.h>
 
-#include "mpconfig.h"
-#include "misc.h"
-#include "qstr.h"
-#include "obj.h"
-#include "runtime.h"
+#include "py/runtime.h"
 
 typedef struct _mp_obj_enumerate_t {
     mp_obj_base_t base;
diff --git a/py/objexcept.c b/py/objexcept.c
index 4b8d6ea08..a60cbb82e 100644
--- a/py/objexcept.c
+++ b/py/objexcept.c
@@ -28,20 +28,13 @@
 #include <stdarg.h>
 #include <assert.h>
 #include <stdio.h>
-#include <stdint.h>
-
-#include "mpconfig.h"
-#include "nlr.h"
-#include "misc.h"
-#include "qstr.h"
-#include "obj.h"
-#include "objlist.h"
-#include "objstr.h"
-#include "objtuple.h"
-#include "objtype.h"
-#include "runtime.h"
-#include "runtime0.h"
-#include "gc.h"
+
+#include "py/nlr.h"
+#include "py/objlist.h"
+#include "py/objstr.h"
+#include "py/objtuple.h"
+#include "py/objtype.h"
+#include "py/gc.h"
 
 typedef struct _mp_obj_exception_t {
     mp_obj_base_t base;
diff --git a/py/objfilter.c b/py/objfilter.c
index 38af31674..98200f260 100644
--- a/py/objfilter.c
+++ b/py/objfilter.c
@@ -24,15 +24,8 @@
  * THE SOFTWARE.
  */
 
-#include <stdlib.h>
-#include <assert.h>
-
-#include "mpconfig.h"
-#include "nlr.h"
-#include "misc.h"
-#include "qstr.h"
-#include "obj.h"
-#include "runtime.h"
+#include "py/nlr.h"
+#include "py/runtime.h"
 
 typedef struct _mp_obj_filter_t {
     mp_obj_base_t base;
diff --git a/py/objfloat.c b/py/objfloat.c
index b75d0e4ba..86b672007 100644
--- a/py/objfloat.c
+++ b/py/objfloat.c
@@ -30,26 +30,22 @@
 #include <assert.h>
 #include <math.h>
 
-#include "mpconfig.h"
-#include "nlr.h"
-#include "misc.h"
-#include "qstr.h"
-#include "obj.h"
-#include "parsenum.h"
-#include "runtime0.h"
-#include "runtime.h"
+#include "py/nlr.h"
+#include "py/parsenum.h"
+#include "py/runtime0.h"
+#include "py/runtime.h"
 
 #if MICROPY_PY_BUILTINS_FLOAT
 
 #if MICROPY_FLOAT_IMPL == MICROPY_FLOAT_IMPL_FLOAT
-#include "formatfloat.h"
+#include "py/formatfloat.h"
 #endif
 
 STATIC void float_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t o_in, mp_print_kind_t kind) {
     mp_obj_float_t *o = o_in;
 #if MICROPY_FLOAT_IMPL == MICROPY_FLOAT_IMPL_FLOAT
     char buf[16];
-    format_float(o->value, buf, sizeof(buf), 'g', 7, '\0');
+    mp_format_float(o->value, buf, sizeof(buf), 'g', 7, '\0');
     print(env, "%s", buf);
     if (strchr(buf, '.') == NULL && strchr(buf, 'e') == NULL) {
         // Python floats always have decimal point
diff --git a/py/objfun.c b/py/objfun.c
index 5f95a015b..b86d6f8dc 100644
--- a/py/objfun.c
+++ b/py/objfun.c
@@ -25,21 +25,16 @@
  * THE SOFTWARE.
  */
 
-#include <stdbool.h>
 #include <string.h>
 #include <assert.h>
 
-#include "mpconfig.h"
-#include "nlr.h"
-#include "misc.h"
-#include "qstr.h"
-#include "obj.h"
-#include "objtuple.h"
-#include "objfun.h"
-#include "runtime0.h"
-#include "runtime.h"
-#include "bc.h"
-#include "stackctrl.h"
+#include "py/nlr.h"
+#include "py/objtuple.h"
+#include "py/objfun.h"
+#include "py/runtime0.h"
+#include "py/runtime.h"
+#include "py/bc.h"
+#include "py/stackctrl.h"
 
 #if 0 // print debugging info
 #define DEBUG_PRINT (1)
diff --git a/py/objfun.h b/py/objfun.h
index e23fe8d52..a5b9f2b5f 100644
--- a/py/objfun.h
+++ b/py/objfun.h
@@ -23,6 +23,10 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  * THE SOFTWARE.
  */
+#ifndef __MICROPY_INCLUDED_PY_OBJFUN_H__
+#define __MICROPY_INCLUDED_PY_OBJFUN_H__
+
+#include "py/obj.h"
 
 typedef struct _mp_obj_fun_bc_t {
     mp_obj_base_t base;
@@ -41,3 +45,5 @@ typedef struct _mp_obj_fun_bc_t {
     //  - a single slot for kw args dict (if it takes them)
     mp_obj_t extra_args[];
 } mp_obj_fun_bc_t;
+
+#endif // __MICROPY_INCLUDED_PY_OBJFUN_H__
diff --git a/py/objgenerator.c b/py/objgenerator.c
index 646ae4fdd..1b06975c9 100644
--- a/py/objgenerator.c
+++ b/py/objgenerator.c
@@ -28,15 +28,12 @@
 #include <stdlib.h>
 #include <assert.h>
 
-#include "mpconfig.h"
-#include "nlr.h"
-#include "misc.h"
-#include "qstr.h"
-#include "obj.h"
-#include "runtime.h"
-#include "bc.h"
-#include "objgenerator.h"
-#include "objfun.h"
+#include "py/nlr.h"
+#include "py/obj.h"
+#include "py/runtime.h"
+#include "py/bc.h"
+#include "py/objgenerator.h"
+#include "py/objfun.h"
 
 /******************************************************************************/
 /* generator wrapper                                                          */
diff --git a/py/objgenerator.h b/py/objgenerator.h
index d0066de4e..d1b9be478 100644
--- a/py/objgenerator.h
+++ b/py/objgenerator.h
@@ -23,5 +23,12 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  * THE SOFTWARE.
  */
+#ifndef __MICROPY_INCLUDED_PY_OBJGENERATOR_H__
+#define __MICROPY_INCLUDED_PY_OBJGENERATOR_H__
+
+#include "py/obj.h"
+#include "py/runtime.h"
 
 mp_vm_return_kind_t mp_obj_gen_resume(mp_obj_t self_in, mp_obj_t send_val, mp_obj_t throw_val, mp_obj_t *ret_val);
+
+#endif // __MICROPY_INCLUDED_PY_OBJGENERATOR_H__
diff --git a/py/objgetitemiter.c b/py/objgetitemiter.c
index 75b9d1c56..2b0f7bb05 100644
--- a/py/objgetitemiter.c
+++ b/py/objgetitemiter.c
@@ -26,12 +26,8 @@
 
 #include <stdlib.h>
 
-#include "mpconfig.h"
-#include "nlr.h"
-#include "misc.h"
-#include "qstr.h"
-#include "obj.h"
-#include "runtime.h"
+#include "py/nlr.h"
+#include "py/runtime.h"
 
 // this is a wrapper object that is turns something that has a __getitem__ method into an iterator
 
diff --git a/py/objint.c b/py/objint.c
index 0aa281edd..c272fd4a7 100644
--- a/py/objint.c
+++ b/py/objint.c
@@ -25,22 +25,16 @@
  */
 
 #include <stdlib.h>
-#include <stdint.h>
 #include <assert.h>
 #include <string.h>
 
-#include "mpconfig.h"
-#include "nlr.h"
-#include "misc.h"
-#include "qstr.h"
-#include "obj.h"
-#include "parsenum.h"
-#include "smallint.h"
-#include "mpz.h"
-#include "objint.h"
-#include "objstr.h"
-#include "runtime0.h"
-#include "runtime.h"
+#include "py/nlr.h"
+#include "py/parsenum.h"
+#include "py/smallint.h"
+#include "py/objint.h"
+#include "py/objstr.h"
+#include "py/runtime0.h"
+#include "py/runtime.h"
 
 #if MICROPY_PY_BUILTINS_FLOAT
 #include <math.h>
diff --git a/py/objint.h b/py/objint.h
index 70d182ba7..fff325df8 100644
--- a/py/objint.h
+++ b/py/objint.h
@@ -23,6 +23,11 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  * THE SOFTWARE.
  */
+#ifndef __MICROPY_INCLUDED_PY_OBJINT_H__
+#define __MICROPY_INCLUDED_PY_OBJINT_H__
+
+#include "py/mpz.h"
+#include "py/obj.h"
 
 typedef struct _mp_obj_int_t {
     mp_obj_base_t base;
@@ -45,3 +50,5 @@ bool mp_obj_int_is_positive(mp_obj_t self_in);
 mp_obj_t mp_obj_int_unary_op(mp_uint_t op, mp_obj_t o_in);
 mp_obj_t mp_obj_int_binary_op(mp_uint_t op, mp_obj_t lhs_in, mp_obj_t rhs_in);
 mp_obj_t mp_obj_int_binary_op_extra_cases(mp_uint_t op, mp_obj_t lhs_in, mp_obj_t rhs_in);
+
+#endif // __MICROPY_INCLUDED_PY_OBJINT_H__
diff --git a/py/objint_longlong.c b/py/objint_longlong.c
index 5f48b7134..394ae111a 100644
--- a/py/objint_longlong.c
+++ b/py/objint_longlong.c
@@ -26,19 +26,13 @@
  */
 
 #include <stdlib.h>
-#include <stdint.h>
 #include <string.h>
 
-#include "mpconfig.h"
-#include "nlr.h"
-#include "misc.h"
-#include "qstr.h"
-#include "obj.h"
-#include "smallint.h"
-#include "mpz.h"
-#include "objint.h"
-#include "runtime0.h"
-#include "runtime.h"
+#include "py/nlr.h"
+#include "py/smallint.h"
+#include "py/objint.h"
+#include "py/runtime0.h"
+#include "py/runtime.h"
 
 #if MICROPY_PY_BUILTINS_FLOAT
 #include <math.h>
diff --git a/py/objint_mpz.c b/py/objint_mpz.c
index 1dc1def33..554ec9657 100644
--- a/py/objint_mpz.c
+++ b/py/objint_mpz.c
@@ -24,22 +24,16 @@
  * THE SOFTWARE.
  */
 
-#include <stdint.h>
 #include <string.h>
 #include <stdio.h>
 #include <assert.h>
 
-#include "mpconfig.h"
-#include "nlr.h"
-#include "misc.h"
-#include "qstr.h"
-#include "parsenumbase.h"
-#include "obj.h"
-#include "smallint.h"
-#include "mpz.h"
-#include "objint.h"
-#include "runtime0.h"
-#include "runtime.h"
+#include "py/nlr.h"
+#include "py/parsenumbase.h"
+#include "py/smallint.h"
+#include "py/objint.h"
+#include "py/runtime0.h"
+#include "py/runtime.h"
 
 #if MICROPY_PY_BUILTINS_FLOAT
 #include <math.h>
diff --git a/py/objlist.c b/py/objlist.c
index 3e5355719..911ddb98a 100644
--- a/py/objlist.c
+++ b/py/objlist.c
@@ -27,14 +27,10 @@
 #include <string.h>
 #include <assert.h>
 
-#include "mpconfig.h"
-#include "nlr.h"
-#include "misc.h"
-#include "qstr.h"
-#include "obj.h"
-#include "runtime0.h"
-#include "runtime.h"
-#include "objlist.h"
+#include "py/nlr.h"
+#include "py/objlist.h"
+#include "py/runtime0.h"
+#include "py/runtime.h"
 
 STATIC mp_obj_t mp_obj_new_list_iterator(mp_obj_list_t *list, mp_uint_t cur);
 STATIC mp_obj_list_t *list_new(mp_uint_t n);
diff --git a/py/objlist.h b/py/objlist.h
index 05a4c8d3a..443ede574 100644
--- a/py/objlist.h
+++ b/py/objlist.h
@@ -23,6 +23,10 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  * THE SOFTWARE.
  */
+#ifndef __MICROPY_INCLUDED_PY_OBJLIST_H__
+#define __MICROPY_INCLUDED_PY_OBJLIST_H__
+
+#include "py/obj.h"
 
 typedef struct _mp_obj_list_t {
     mp_obj_base_t base;
@@ -30,3 +34,5 @@ typedef struct _mp_obj_list_t {
     mp_uint_t len;
     mp_obj_t *items;
 } mp_obj_list_t;
+
+#endif // __MICROPY_INCLUDED_PY_OBJLIST_H__
diff --git a/py/objmap.c b/py/objmap.c
index f7d7b01c3..ea62bb512 100644
--- a/py/objmap.c
+++ b/py/objmap.c
@@ -27,12 +27,8 @@
 #include <stdlib.h>
 #include <assert.h>
 
-#include "mpconfig.h"
-#include "nlr.h"
-#include "misc.h"
-#include "qstr.h"
-#include "obj.h"
-#include "runtime.h"
+#include "py/nlr.h"
+#include "py/runtime.h"
 
 typedef struct _mp_obj_map_t {
     mp_obj_base_t base;
diff --git a/py/objmodule.c b/py/objmodule.c
index 5ffb368bf..2e53bf052 100644
--- a/py/objmodule.c
+++ b/py/objmodule.c
@@ -27,14 +27,10 @@
 #include <stdlib.h>
 #include <assert.h>
 
-#include "mpconfig.h"
-#include "nlr.h"
-#include "misc.h"
-#include "qstr.h"
-#include "obj.h"
-#include "objmodule.h"
-#include "runtime.h"
-#include "builtin.h"
+#include "py/nlr.h"
+#include "py/objmodule.h"
+#include "py/runtime.h"
+#include "py/builtin.h"
 
 STATIC mp_map_t mp_loaded_modules_map; // TODO: expose as sys.modules
 
diff --git a/py/objmodule.h b/py/objmodule.h
index f4ccedee5..138f942c2 100644
--- a/py/objmodule.h
+++ b/py/objmodule.h
@@ -23,8 +23,14 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  * THE SOFTWARE.
  */
+#ifndef __MICROPY_INCLUDED_PY_OBJMODULE_H__
+#define __MICROPY_INCLUDED_PY_OBJMODULE_H__
+
+#include "py/obj.h"
 
 void mp_module_init(void);
 void mp_module_deinit(void);
 mp_obj_t mp_module_get(qstr module_name);
 void mp_module_register(qstr qstr, mp_obj_t module);
+
+#endif // __MICROPY_INCLUDED_PY_OBJMODULE_H__
diff --git a/py/objnamedtuple.c b/py/objnamedtuple.c
index c0510081c..320467eed 100644
--- a/py/objnamedtuple.c
+++ b/py/objnamedtuple.c
@@ -27,13 +27,9 @@
 
 #include <string.h>
 
-#include "mpconfig.h"
-#include "misc.h"
-#include "nlr.h"
-#include "qstr.h"
-#include "obj.h"
-#include "objtuple.h"
-#include "runtime.h"
+#include "py/nlr.h"
+#include "py/objtuple.h"
+#include "py/runtime.h"
 
 #if MICROPY_PY_COLLECTIONS
 
diff --git a/py/objnone.c b/py/objnone.c
index 01536dcb3..387fb58cb 100644
--- a/py/objnone.c
+++ b/py/objnone.c
@@ -26,12 +26,9 @@
 
 #include <stdlib.h>
 
-#include "mpconfig.h"
-#include "nlr.h"
-#include "misc.h"
-#include "qstr.h"
-#include "obj.h"
-#include "runtime0.h"
+#include "py/nlr.h"
+#include "py/obj.h"
+#include "py/runtime0.h"
 
 typedef struct _mp_obj_none_t {
     mp_obj_base_t base;
diff --git a/py/objobject.c b/py/objobject.c
index 551ccf76e..5bbe02b32 100644
--- a/py/objobject.c
+++ b/py/objobject.c
@@ -26,12 +26,9 @@
 
 #include <stdlib.h>
 
-#include "mpconfig.h"
-#include "nlr.h"
-#include "misc.h"
-#include "qstr.h"
-#include "obj.h"
-#include "runtime0.h"
+#include "py/nlr.h"
+#include "py/obj.h"
+#include "py/runtime0.h"
 
 mp_obj_t instance_make_new(mp_obj_t self_in, mp_uint_t n_args, mp_uint_t n_kw, const mp_obj_t *args);
 
diff --git a/py/objproperty.c b/py/objproperty.c
index c83ca2dbb..75cc1458e 100644
--- a/py/objproperty.c
+++ b/py/objproperty.c
@@ -27,12 +27,8 @@
 #include <stdlib.h>
 #include <assert.h>
 
-#include "mpconfig.h"
-#include "nlr.h"
-#include "misc.h"
-#include "qstr.h"
-#include "obj.h"
-#include "runtime.h"
+#include "py/nlr.h"
+#include "py/runtime.h"
 
 #if MICROPY_PY_BUILTINS_PROPERTY
 
diff --git a/py/objrange.c b/py/objrange.c
index 702413f2a..2a8388b17 100644
--- a/py/objrange.c
+++ b/py/objrange.c
@@ -26,13 +26,9 @@
 
 #include <stdlib.h>
 
-#include "mpconfig.h"
-#include "nlr.h"
-#include "misc.h"
-#include "qstr.h"
-#include "obj.h"
-#include "runtime0.h"
-#include "runtime.h"
+#include "py/nlr.h"
+#include "py/runtime0.h"
+#include "py/runtime.h"
 
 /******************************************************************************/
 /* range iterator                                                             */
diff --git a/py/objreversed.c b/py/objreversed.c
index aa73f3771..b61495861 100644
--- a/py/objreversed.c
+++ b/py/objreversed.c
@@ -27,12 +27,8 @@
 #include <stdlib.h>
 #include <assert.h>
 
-#include "mpconfig.h"
-#include "nlr.h"
-#include "misc.h"
-#include "qstr.h"
-#include "obj.h"
-#include "runtime.h"
+#include "py/nlr.h"
+#include "py/runtime.h"
 
 typedef struct _mp_obj_reversed_t {
     mp_obj_base_t base;
diff --git a/py/objset.c b/py/objset.c
index 1069cd5ea..54009a1f5 100644
--- a/py/objset.c
+++ b/py/objset.c
@@ -28,14 +28,10 @@
 #include <string.h>
 #include <assert.h>
 
-#include "mpconfig.h"
-#include "nlr.h"
-#include "misc.h"
-#include "qstr.h"
-#include "obj.h"
-#include "runtime.h"
-#include "runtime0.h"
-#include "builtin.h"
+#include "py/nlr.h"
+#include "py/runtime.h"
+#include "py/runtime0.h"
+#include "py/builtin.h"
 
 #if MICROPY_PY_BUILTINS_SET
 
diff --git a/py/objslice.c b/py/objslice.c
index c99b9d08d..3f090dc23 100644
--- a/py/objslice.c
+++ b/py/objslice.c
@@ -27,12 +27,9 @@
 #include <stdlib.h>
 #include <assert.h>
 
-#include "mpconfig.h"
-#include "nlr.h"
-#include "misc.h"
-#include "qstr.h"
-#include "obj.h"
-#include "runtime0.h"
+#include "py/nlr.h"
+#include "py/obj.h"
+#include "py/runtime0.h"
 
 /******************************************************************************/
 /* ellipsis object, a singleton                                               */
diff --git a/py/objstr.c b/py/objstr.c
index 3d9fd6f5e..5976e36e7 100644
--- a/py/objstr.c
+++ b/py/objstr.c
@@ -25,21 +25,16 @@
  * THE SOFTWARE.
  */
 
-#include <stdbool.h>
 #include <string.h>
 #include <assert.h>
 
-#include "mpconfig.h"
-#include "nlr.h"
-#include "misc.h"
-#include "unicode.h"
-#include "qstr.h"
-#include "obj.h"
-#include "runtime0.h"
-#include "runtime.h"
-#include "pfenv.h"
-#include "objstr.h"
-#include "objlist.h"
+#include "py/nlr.h"
+#include "py/unicode.h"
+#include "py/objstr.h"
+#include "py/objlist.h"
+#include "py/runtime0.h"
+#include "py/runtime.h"
+#include "py/pfenv.h"
 
 STATIC mp_obj_t str_modulo_format(mp_obj_t pattern, mp_uint_t n_args, const mp_obj_t *args, mp_obj_t dict);
 
diff --git a/py/objstr.h b/py/objstr.h
index 9bc060085..8894c267e 100644
--- a/py/objstr.h
+++ b/py/objstr.h
@@ -23,6 +23,10 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  * THE SOFTWARE.
  */
+#ifndef __MICROPY_INCLUDED_PY_OBJSTR_H__
+#define __MICROPY_INCLUDED_PY_OBJSTR_H__
+
+#include "py/obj.h"
 
 typedef struct _mp_obj_str_t {
     mp_obj_base_t base;
@@ -85,3 +89,5 @@ MP_DECLARE_CONST_FUN_OBJ(str_isalpha_obj);
 MP_DECLARE_CONST_FUN_OBJ(str_isdigit_obj);
 MP_DECLARE_CONST_FUN_OBJ(str_isupper_obj);
 MP_DECLARE_CONST_FUN_OBJ(str_islower_obj);
+
+#endif // __MICROPY_INCLUDED_PY_OBJSTR_H__
diff --git a/py/objstringio.c b/py/objstringio.c
index e5abc0526..eca8522ee 100644
--- a/py/objstringio.c
+++ b/py/objstringio.c
@@ -28,14 +28,10 @@
 #include <stdio.h>
 #include <string.h>
 
-#include "mpconfig.h"
-#include "nlr.h"
-#include "misc.h"
-#include "qstr.h"
-#include "obj.h"
-#include "runtime.h"
-#include "stream.h"
-#include "objstr.h"
+#include "py/nlr.h"
+#include "py/objstr.h"
+#include "py/runtime.h"
+#include "py/stream.h"
 
 #if MICROPY_PY_IO
 
diff --git a/py/objstrunicode.c b/py/objstrunicode.c
index 2c8d02491..fd3678722 100644
--- a/py/objstrunicode.c
+++ b/py/objstrunicode.c
@@ -25,20 +25,15 @@
  * THE SOFTWARE.
  */
 
-#include <stdbool.h>
 #include <string.h>
 #include <assert.h>
 
-#include "mpconfig.h"
-#include "nlr.h"
-#include "misc.h"
-#include "qstr.h"
-#include "obj.h"
-#include "runtime0.h"
-#include "runtime.h"
-#include "pfenv.h"
-#include "objstr.h"
-#include "objlist.h"
+#include "py/nlr.h"
+#include "py/objstr.h"
+#include "py/objlist.h"
+#include "py/runtime0.h"
+#include "py/runtime.h"
+#include "py/pfenv.h"
 
 #if MICROPY_PY_BUILTINS_STR_UNICODE
 
diff --git a/py/objtuple.c b/py/objtuple.c
index 2793e4838..1f2eeb380 100644
--- a/py/objtuple.c
+++ b/py/objtuple.c
@@ -27,14 +27,10 @@
 #include <string.h>
 #include <assert.h>
 
-#include "mpconfig.h"
-#include "nlr.h"
-#include "misc.h"
-#include "qstr.h"
-#include "obj.h"
-#include "runtime0.h"
-#include "runtime.h"
-#include "objtuple.h"
+#include "py/nlr.h"
+#include "py/objtuple.h"
+#include "py/runtime0.h"
+#include "py/runtime.h"
 
 STATIC mp_obj_t mp_obj_new_tuple_iterator(mp_obj_tuple_t *tuple, mp_uint_t cur);
 
diff --git a/py/objtuple.h b/py/objtuple.h
index 43b3826bf..4cac48755 100644
--- a/py/objtuple.h
+++ b/py/objtuple.h
@@ -23,6 +23,10 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  * THE SOFTWARE.
  */
+#ifndef __MICROPY_INCLUDED_PY_OBJTUPLE_H__
+#define __MICROPY_INCLUDED_PY_OBJTUPLE_H__
+
+#include "py/obj.h"
 
 typedef struct _mp_obj_tuple_t {
     mp_obj_base_t base;
@@ -35,3 +39,5 @@ mp_obj_t mp_obj_tuple_unary_op(mp_uint_t op, mp_obj_t self_in);
 mp_obj_t mp_obj_tuple_binary_op(mp_uint_t op, mp_obj_t lhs, mp_obj_t rhs);
 mp_obj_t mp_obj_tuple_subscr(mp_obj_t base, mp_obj_t index, mp_obj_t value);
 mp_obj_t mp_obj_tuple_getiter(mp_obj_t o_in);
+
+#endif // __MICROPY_INCLUDED_PY_OBJTUPLE_H__
diff --git a/py/objtype.c b/py/objtype.c
index 2970e9276..b5890c472 100644
--- a/py/objtype.c
+++ b/py/objtype.c
@@ -30,14 +30,10 @@
 #include <string.h>
 #include <assert.h>
 
-#include "mpconfig.h"
-#include "nlr.h"
-#include "misc.h"
-#include "qstr.h"
-#include "obj.h"
-#include "runtime0.h"
-#include "runtime.h"
-#include "objtype.h"
+#include "py/nlr.h"
+#include "py/objtype.h"
+#include "py/runtime0.h"
+#include "py/runtime.h"
 
 #if 0 // print debugging info
 #define DEBUG_PRINT (1)
diff --git a/py/objtype.h b/py/objtype.h
index dd2e44a79..8adbbc33b 100644
--- a/py/objtype.h
+++ b/py/objtype.h
@@ -23,6 +23,10 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  * THE SOFTWARE.
  */
+#ifndef __MICROPY_INCLUDED_PY_OBJTYPE_H__
+#define __MICROPY_INCLUDED_PY_OBJTYPE_H__
+
+#include "py/obj.h"
 
 // instance object
 // creating an instance of a class makes one of these objects
@@ -36,3 +40,5 @@ typedef struct _mp_obj_instance_t {
 // these need to be exposed so mp_obj_is_callable can work correctly
 bool mp_obj_instance_is_callable(mp_obj_t self_in);
 mp_obj_t mp_obj_instance_call(mp_obj_t self_in, mp_uint_t n_args, mp_uint_t n_kw, const mp_obj_t *args);
+
+#endif // __MICROPY_INCLUDED_PY_OBJTYPE_H__
diff --git a/py/objzip.c b/py/objzip.c
index 738131f92..e1bf92737 100644
--- a/py/objzip.c
+++ b/py/objzip.c
@@ -27,12 +27,8 @@
 #include <stdlib.h>
 #include <assert.h>
 
-#include "mpconfig.h"
-#include "misc.h"
-#include "qstr.h"
-#include "obj.h"
-#include "objtuple.h"
-#include "runtime.h"
+#include "py/objtuple.h"
+#include "py/runtime.h"
 
 typedef struct _mp_obj_zip_t {
     mp_obj_base_t base;
diff --git a/py/opmethods.c b/py/opmethods.c
index ea930c28a..80a953fb8 100644
--- a/py/opmethods.c
+++ b/py/opmethods.c
@@ -24,14 +24,8 @@
  * THE SOFTWARE.
  */
 
-#include "mpconfig.h"
-#include "nlr.h"
-#include "misc.h"
-#include "qstr.h"
-#include "obj.h"
-#include "runtime.h"
-#include "runtime0.h"
-#include "builtin.h"
+#include "py/runtime0.h"
+#include "py/builtin.h"
 
 STATIC mp_obj_t op_getitem(mp_obj_t self_in, mp_obj_t key_in) {
     mp_obj_type_t *type = mp_obj_get_type(self_in);
diff --git a/py/parse.c b/py/parse.c
index ae1fe65e7..c7c85e035 100644
--- a/py/parse.c
+++ b/py/parse.c
@@ -30,13 +30,10 @@
 #include <assert.h>
 #include <string.h>
 
-#include "mpconfig.h"
-#include "misc.h"
-#include "qstr.h"
-#include "lexer.h"
-#include "parsenumbase.h"
-#include "parse.h"
-#include "smallint.h"
+#include "py/lexer.h"
+#include "py/parse.h"
+#include "py/parsenum.h"
+#include "py/smallint.h"
 
 #define RULE_ACT_ARG_MASK       (0x0f)
 #define RULE_ACT_KIND_MASK      (0x30)
@@ -69,7 +66,7 @@ typedef struct _rule_t {
 
 enum {
 #define DEF_RULE(rule, comp, kind, ...) RULE_##rule,
-#include "grammar.h"
+#include "py/grammar.h"
 #undef DEF_RULE
     RULE_maximum_number_of,
     RULE_string, // special node for non-interned string
@@ -91,7 +88,7 @@ enum {
 #else
 #define DEF_RULE(rule, comp, kind, ...) static const rule_t rule_##rule = { RULE_##rule, kind, { __VA_ARGS__ } };
 #endif
-#include "grammar.h"
+#include "py/grammar.h"
 #undef or
 #undef and
 #undef list
@@ -105,7 +102,7 @@ enum {
 
 STATIC const rule_t *rules[] = {
 #define DEF_RULE(rule, comp, kind, ...) &rule_##rule,
-#include "grammar.h"
+#include "py/grammar.h"
 #undef DEF_RULE
 };
 
diff --git a/py/parse.h b/py/parse.h
index 400622318..4e7f2b9d1 100644
--- a/py/parse.h
+++ b/py/parse.h
@@ -26,6 +26,10 @@
 #ifndef __MICROPY_INCLUDED_PY_PARSE_H__
 #define __MICROPY_INCLUDED_PY_PARSE_H__
 
+#include <stdint.h>
+
+#include "py/mpconfig.h"
+
 struct _mp_lexer_t;
 
 // a mp_parse_node_t is:
diff --git a/py/parsehelper.c b/py/parsehelper.c
index f30471067..904268109 100644
--- a/py/parsehelper.c
+++ b/py/parsehelper.c
@@ -26,16 +26,9 @@
 
 // these functions are separate from parse.c to keep parser independent of mp_obj_t
 
-#include <stdint.h>
 #include <stdio.h>
 
-#include "mpconfig.h"
-#include "misc.h"
-#include "qstr.h"
-#include "lexer.h"
-#include "parse.h"
-#include "obj.h"
-#include "parsehelper.h"
+#include "py/parsehelper.h"
 
 #define STR_MEMORY "parser could not allocate enough memory"
 #define STR_UNEXPECTED_INDENT "unexpected indent"
diff --git a/py/parsehelper.h b/py/parsehelper.h
index 4a95f22fa..1763809ba 100644
--- a/py/parsehelper.h
+++ b/py/parsehelper.h
@@ -28,6 +28,7 @@
 
 #include "py/lexer.h"
 #include "py/parse.h"
+#include "py/obj.h"
 
 void mp_parse_show_exception(mp_lexer_t *lex, mp_parse_error_kind_t parse_error_kind);
 mp_obj_t mp_parse_make_exception(mp_lexer_t *lex, mp_parse_error_kind_t parse_error_kind);
diff --git a/py/parsenum.c b/py/parsenum.c
index bb88eb729..4706fef81 100644
--- a/py/parsenum.c
+++ b/py/parsenum.c
@@ -27,15 +27,9 @@
 #include <stdbool.h>
 #include <stdlib.h>
 
-#include "mpconfig.h"
-#include "misc.h"
-#include "qstr.h"
-#include "nlr.h"
-#include "obj.h"
-#include "parsenumbase.h"
-#include "parsenum.h"
-#include "smallint.h"
-#include "runtime.h"
+#include "py/nlr.h"
+#include "py/parsenum.h"
+#include "py/smallint.h"
 
 #if MICROPY_PY_BUILTINS_FLOAT
 #include <math.h>
diff --git a/py/parsenum.h b/py/parsenum.h
index 5164d5001..a769bdd83 100644
--- a/py/parsenum.h
+++ b/py/parsenum.h
@@ -23,6 +23,14 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  * THE SOFTWARE.
  */
+#ifndef __MICROPY_INCLUDED_PY_PARSENUM_H__
+#define __MICROPY_INCLUDED_PY_PARSENUM_H__
 
+#include "py/mpconfig.h"
+#include "py/obj.h"
+
+mp_uint_t mp_parse_num_base(const char *str, mp_uint_t len, mp_uint_t *base);
 mp_obj_t mp_parse_num_integer(const char *restrict str, mp_uint_t len, mp_uint_t base);
 mp_obj_t mp_parse_num_decimal(const char *str, mp_uint_t len, bool allow_imag, bool force_complex);
+
+#endif // __MICROPY_INCLUDED_PY_PARSENUM_H__
diff --git a/py/parsenumbase.c b/py/parsenumbase.c
index f552c5e37..5574b3b9b 100644
--- a/py/parsenumbase.c
+++ b/py/parsenumbase.c
@@ -24,9 +24,7 @@
  * THE SOFTWARE.
  */
 
-#include "mpconfig.h"
-#include "misc.h"
-#include "parsenumbase.h"
+#include "py/parsenum.h"
 
 // find real radix base, and strip preceding '0x', '0o' and '0b'
 // puts base in *base, and returns number of bytes to skip the prefix
diff --git a/py/parsenumbase.h b/py/parsenumbase.h
index 177f14451..f8953ec83 100644
--- a/py/parsenumbase.h
+++ b/py/parsenumbase.h
@@ -23,5 +23,11 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  * THE SOFTWARE.
  */
+#ifndef __MICROPY_INCLUDED_PY_PARSENUM_H__
+#define __MICROPY_INCLUDED_PY_PARSENUM_H__
+
+#include "py/mpconfig.h"
 
 mp_uint_t mp_parse_num_base(const char *str, mp_uint_t len, mp_uint_t *base);
+
+#endif // __MICROPY_INCLUDED_PY_PARSENUM_H__
diff --git a/py/pfenv.c b/py/pfenv.c
index 965636aea..698f3b16c 100644
--- a/py/pfenv.c
+++ b/py/pfenv.c
@@ -27,20 +27,15 @@
 #include <stdint.h>
 #include <string.h>
 
-#include "mpconfig.h"
-#include "misc.h"
-#include "qstr.h"
-#include "obj.h"
-#include "mpz.h"
-#include "objint.h"
-#include "pfenv.h"
+#include "py/objint.h"
+#include "py/pfenv.h"
 
 #if MICROPY_FLOAT_IMPL == MICROPY_FLOAT_IMPL_DOUBLE
 #include <stdio.h>
 #endif
 
 #if MICROPY_PY_BUILTINS_FLOAT
-#include "formatfloat.h"
+#include "py/formatfloat.h"
 #endif
 
 static const char pad_spaces[] = "                ";
@@ -331,7 +326,7 @@ int pfenv_print_float(const pfenv_t *pfenv, mp_float_t f, char fmt, int flags, c
     }
     int len;
 #if MICROPY_FLOAT_IMPL == MICROPY_FLOAT_IMPL_FLOAT
-    len = format_float(f, buf, sizeof(buf), fmt, prec, sign);
+    len = mp_format_float(f, buf, sizeof(buf), fmt, prec, sign);
 #elif MICROPY_FLOAT_IMPL == MICROPY_FLOAT_IMPL_DOUBLE
     char fmt_buf[6];
     char *fmt_s = fmt_buf;
diff --git a/py/pfenv.h b/py/pfenv.h
index 98c1885f3..074c0012f 100644
--- a/py/pfenv.h
+++ b/py/pfenv.h
@@ -23,6 +23,10 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  * THE SOFTWARE.
  */
+#ifndef __MICROPY_INCLUDED_PY_PFENV_H__
+#define __MICROPY_INCLUDED_PY_PFENV_H__
+
+#include "py/obj.h"
 
 #define PF_FLAG_LEFT_ADJUST       (0x001)
 #define PF_FLAG_SHOW_SIGN         (0x002)
@@ -55,3 +59,5 @@ int pfenv_printf(const pfenv_t *pfenv, const char *fmt, ...);
 
 // Wrapper for system printf
 void printf_wrapper(void *env, const char *fmt, ...);
+
+#endif // __MICROPY_INCLUDED_PY_PFENV_H__
diff --git a/py/pfenv_printf.c b/py/pfenv_printf.c
index c0e826a5d..39bf321ce 100644
--- a/py/pfenv_printf.c
+++ b/py/pfenv_printf.c
@@ -25,19 +25,13 @@
  */
 
 #include <assert.h>
-#include <stdio.h>
-#include <stdint.h>
 #include <string.h>
 #include <stdarg.h>
 
-#include "mpconfig.h"
-#include "misc.h"
-#include "qstr.h"
-#include "obj.h"
-#include "pfenv.h"
+#include "py/pfenv.h"
 
 #if MICROPY_PY_BUILTINS_FLOAT
-#include "formatfloat.h"
+#include "py/formatfloat.h"
 #endif
 
 int pfenv_vprintf(const pfenv_t *pfenv, const char *fmt, va_list args) {
diff --git a/py/qstr.c b/py/qstr.c
index e08de2eba..1bca8a10d 100644
--- a/py/qstr.c
+++ b/py/qstr.c
@@ -26,12 +26,9 @@
 
 #include <assert.h>
 #include <string.h>
-#include <stdint.h>
 
-#include "mpconfig.h"
-#include "misc.h"
-#include "qstr.h"
-#include "gc.h"
+#include "py/qstr.h"
+#include "py/gc.h"
 
 // NOTE: we are using linear arrays to store and search for qstr's (unique strings, interned strings)
 // ultimately we will replace this with a static hash table of some kind
diff --git a/py/qstrdefs.h b/py/qstrdefs.h
index e91d36070..b8eacc68c 100644
--- a/py/qstrdefs.h
+++ b/py/qstrdefs.h
@@ -24,7 +24,8 @@
  * THE SOFTWARE.
  */
 
-#include "mpconfig.h"
+#include "py/mpconfig.h"
+
 // All the qstr definitions in this file are available as constants.
 // That is, they are in ROM and you can reference them simply as MP_QSTR_xxxx.
 
diff --git a/py/repl.c b/py/repl.c
index 6bd880d92..c6b3e60ae 100644
--- a/py/repl.c
+++ b/py/repl.c
@@ -24,9 +24,7 @@
  * THE SOFTWARE.
  */
 
-#include "mpconfig.h"
-#include "misc.h"
-#include "repl.h"
+#include "py/repl.h"
 
 #if MICROPY_HELPER_REPL
 
diff --git a/py/repl.h b/py/repl.h
index 92688f9f9..db9256017 100644
--- a/py/repl.h
+++ b/py/repl.h
@@ -23,7 +23,14 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  * THE SOFTWARE.
  */
+#ifndef __MICROPY_INCLUDED_PY_REPL_H__
+#define __MICROPY_INCLUDED_PY_REPL_H__
+
+#include "py/mpconfig.h"
+#include "py/misc.h"
 
 #if MICROPY_HELPER_REPL
 bool mp_repl_continue_with_input(const char *input);
 #endif
+
+#endif // __MICROPY_INCLUDED_PY_REPL_H__
diff --git a/py/runtime.c b/py/runtime.c
index 505c8e31a..c4c73dfe4 100644
--- a/py/runtime.c
+++ b/py/runtime.c
@@ -24,33 +24,24 @@
  * THE SOFTWARE.
  */
 
-#include <stdint.h>
 #include <stdio.h>
 #include <string.h>
 #include <assert.h>
 
-#include "mpconfig.h"
-#include "nlr.h"
-#include "misc.h"
-#include "qstr.h"
-#include "obj.h"
-#include "objtuple.h"
-#include "objlist.h"
-#include "objmodule.h"
-#include "parsenum.h"
-#include "runtime0.h"
-#include "runtime.h"
-#include "emitglue.h"
-#include "builtin.h"
-#include "bc.h"
-#include "smallint.h"
-#include "objgenerator.h"
-#include "lexer.h"
-#include "parse.h"
-#include "parsehelper.h"
-#include "compile.h"
-#include "stackctrl.h"
-#include "gc.h"
+#include "py/nlr.h"
+#include "py/parsehelper.h"
+#include "py/parsenum.h"
+#include "py/compile.h"
+#include "py/objtuple.h"
+#include "py/objlist.h"
+#include "py/objmodule.h"
+#include "py/objgenerator.h"
+#include "py/smallint.h"
+#include "py/runtime0.h"
+#include "py/runtime.h"
+#include "py/builtin.h"
+#include "py/stackctrl.h"
+#include "py/gc.h"
 
 #if 0 // print debugging info
 #define DEBUG_PRINT (1)
diff --git a/py/scope.c b/py/scope.c
index 05606ffcc..4739ac323 100644
--- a/py/scope.c
+++ b/py/scope.c
@@ -24,17 +24,9 @@
  * THE SOFTWARE.
  */
 
-#include <stdbool.h>
-#include <stdint.h>
 #include <assert.h>
 
-#include "mpconfig.h"
-#include "misc.h"
-#include "qstr.h"
-#include "obj.h"
-#include "parse.h"
-#include "emitglue.h"
-#include "scope.h"
+#include "py/scope.h"
 
 scope_t *scope_new(scope_kind_t kind, mp_parse_node_t pn, qstr source_file, mp_uint_t emit_options) {
     scope_t *scope = m_new0(scope_t, 1);
diff --git a/py/scope.h b/py/scope.h
index 903a32a79..6d74b17d2 100644
--- a/py/scope.h
+++ b/py/scope.h
@@ -23,6 +23,11 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  * THE SOFTWARE.
  */
+#ifndef __MICROPY_INCLUDED_PY_SCOPE_H__
+#define __MICROPY_INCLUDED_PY_SCOPE_H__
+
+#include "py/parse.h"
+#include "py/emitglue.h"
 
 enum {
     ID_INFO_KIND_GLOBAL_IMPLICIT,
@@ -77,3 +82,5 @@ id_info_t *scope_find_global(scope_t *scope, qstr qstr);
 id_info_t *scope_find_local_in_parent(scope_t *scope, qstr qstr);
 void scope_close_over_in_parents(scope_t *scope, qstr qstr);
 void scope_print_info(scope_t *s);
+
+#endif // __MICROPY_INCLUDED_PY_SCOPE_H__
diff --git a/py/sequence.c b/py/sequence.c
index 8cc7519be..0e76ccc02 100644
--- a/py/sequence.c
+++ b/py/sequence.c
@@ -25,17 +25,12 @@
  * THE SOFTWARE.
  */
 
-#include <assert.h>
-#include <stdbool.h>
 #include <string.h>
 
-#include "mpconfig.h"
-#include "nlr.h"
-#include "misc.h"
-#include "qstr.h"
-#include "obj.h"
-#include "runtime0.h"
-#include "runtime.h"
+#include "py/nlr.h"
+#include "py/obj.h"
+#include "py/runtime0.h"
+#include "py/runtime.h"
 
 // Helpers for sequence types
 
diff --git a/py/showbc.c b/py/showbc.c
index 4a765499c..e2151c5a5 100644
--- a/py/showbc.c
+++ b/py/showbc.c
@@ -27,13 +27,9 @@
 #include <stdio.h>
 #include <assert.h>
 
-#include "mpconfig.h"
-#include "misc.h"
-#include "qstr.h"
-#include "obj.h"
-#include "runtime.h"
-#include "bc0.h"
-#include "bc.h"
+#include "py/bc0.h"
+#include "py/bc.h"
+
 extern const qstr mp_binary_op_method_name[];
 
 #if MICROPY_DEBUG_PRINTERS
diff --git a/py/smallint.c b/py/smallint.c
index 3a06c40a9..4c42ee0cc 100644
--- a/py/smallint.c
+++ b/py/smallint.c
@@ -24,11 +24,7 @@
  * THE SOFTWARE.
  */
 
-#include "mpconfig.h"
-#include "misc.h"
-#include "qstr.h"
-#include "obj.h"
-#include "smallint.h"
+#include "py/smallint.h"
 
 bool mp_small_int_mul_overflow(mp_int_t x, mp_int_t y) {
     // Check for multiply overflow; see CERT INT32-C
diff --git a/py/smallint.h b/py/smallint.h
index 26a12874e..980be42f3 100644
--- a/py/smallint.h
+++ b/py/smallint.h
@@ -23,6 +23,11 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  * THE SOFTWARE.
  */
+#ifndef __MICROPY_INCLUDED_PY_SMALLINT_H__
+#define __MICROPY_INCLUDED_PY_SMALLINT_H__
+
+#include "py/mpconfig.h"
+#include "py/misc.h"
 
 // Functions for small integer arithmetic
 
@@ -34,3 +39,5 @@
 bool mp_small_int_mul_overflow(mp_int_t x, mp_int_t y);
 mp_int_t mp_small_int_modulo(mp_int_t dividend, mp_int_t divisor);
 mp_int_t mp_small_int_floor_divide(mp_int_t num, mp_int_t denom);
+
+#endif // __MICROPY_INCLUDED_PY_SMALLINT_H__
diff --git a/py/stackctrl.c b/py/stackctrl.c
index 0ba43c28c..31336ec69 100644
--- a/py/stackctrl.c
+++ b/py/stackctrl.c
@@ -24,13 +24,9 @@
  * THE SOFTWARE.
  */
 
-#include "mpconfig.h"
-#include "misc.h"
-#include "nlr.h"
-#include "qstr.h"
-#include "obj.h"
-#include "runtime.h"
-#include "stackctrl.h"
+#include "py/nlr.h"
+#include "py/obj.h"
+#include "py/stackctrl.h"
 
 // Stack top at the start of program
 char *stack_top;
diff --git a/py/stackctrl.h b/py/stackctrl.h
index 4ed67774f..bd18f2142 100644
--- a/py/stackctrl.h
+++ b/py/stackctrl.h
@@ -23,6 +23,10 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  * THE SOFTWARE.
  */
+#ifndef __MICROPY_INCLUDED_PY_STACKCTRL_H__
+#define __MICROPY_INCLUDED_PY_STACKCTRL_H__
+
+#include "py/mpconfig.h"
 
 void mp_stack_ctrl_init(void);
 mp_uint_t mp_stack_usage(void);
@@ -39,3 +43,5 @@ void mp_stack_check(void);
 #define MP_STACK_CHECK()
 
 #endif
+
+#endif // __MICROPY_INCLUDED_PY_STACKCTRL_H__
diff --git a/py/stream.c b/py/stream.c
index db7e5657f..c57b7981a 100644
--- a/py/stream.c
+++ b/py/stream.c
@@ -27,14 +27,10 @@
 
 #include <string.h>
 
-#include "mpconfig.h"
-#include "nlr.h"
-#include "misc.h"
-#include "qstr.h"
-#include "obj.h"
-#include "objstr.h"
-#include "runtime.h"
-#include "stream.h"
+#include "py/nlr.h"
+#include "py/objstr.h"
+#include "py/stream.h"
+
 #if MICROPY_STREAMS_NON_BLOCK
 #include <errno.h>
 #if defined(__MINGW32__) && !defined(__MINGW64_VERSION_MAJOR)
diff --git a/py/stream.h b/py/stream.h
index df7168535..f9c77aac6 100644
--- a/py/stream.h
+++ b/py/stream.h
@@ -23,6 +23,10 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  * THE SOFTWARE.
  */
+#ifndef __MICROPY_INCLUDED_PY_STREAM_H__
+#define __MICROPY_INCLUDED_PY_STREAM_H__
+
+#include "py/obj.h"
 
 MP_DECLARE_CONST_FUN_OBJ(mp_stream_read_obj);
 MP_DECLARE_CONST_FUN_OBJ(mp_stream_readinto_obj);
@@ -36,3 +40,5 @@ MP_DECLARE_CONST_FUN_OBJ(mp_stream_seek_obj);
 mp_obj_t mp_stream_unbuffered_iter(mp_obj_t self);
 
 mp_obj_t mp_stream_write(mp_obj_t self_in, const void *buf, mp_uint_t len);
+
+#endif // __MICROPY_INCLUDED_PY_STREAM_H__
diff --git a/py/unicode.c b/py/unicode.c
index 3951c2f8b..a83e3ac06 100644
--- a/py/unicode.c
+++ b/py/unicode.c
@@ -26,9 +26,7 @@
 
 #include <stdint.h>
 
-#include "mpconfig.h"
-#include "misc.h"
-#include "unicode.h"
+#include "py/unicode.h"
 
 // attribute flags
 #define FL_PRINT (0x01)
diff --git a/py/unicode.h b/py/unicode.h
index 283a7d044..89c28ed0e 100644
--- a/py/unicode.h
+++ b/py/unicode.h
@@ -1 +1,34 @@
+/*
+ * This file is part of the Micro Python project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2014 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
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+#ifndef __MICROPY_INCLUDED_PY_UNICODE_H__
+#define __MICROPY_INCLUDED_PY_UNICODE_H__
+
+#include "py/mpconfig.h"
+#include "py/misc.h"
+
 mp_uint_t utf8_ptr_to_index(const byte *s, const byte *ptr);
+
+#endif // __MICROPY_INCLUDED_PY_UNICODE_H__
diff --git a/py/vm.c b/py/vm.c
index b82a1eda5..b0f778352 100644
--- a/py/vm.c
+++ b/py/vm.c
@@ -29,16 +29,11 @@
 #include <string.h>
 #include <assert.h>
 
-#include "mpconfig.h"
-#include "nlr.h"
-#include "misc.h"
-#include "qstr.h"
-#include "obj.h"
-#include "emitglue.h"
-#include "runtime.h"
-#include "bc0.h"
-#include "bc.h"
-#include "objgenerator.h"
+#include "py/nlr.h"
+#include "py/emitglue.h"
+#include "py/runtime.h"
+#include "py/bc0.h"
+#include "py/bc.h"
 
 #if 0
 #define TRACE(ip) printf("sp=" INT_FMT " ", sp - code_state->sp); mp_bytecode_print2(ip, 1);
@@ -110,7 +105,7 @@ mp_vm_return_kind_t mp_execute_bytecode(mp_code_state *code_state, volatile mp_o
 #define MARK_EXC_IP_GLOBAL() { code_state->ip = ip; } /* stores ip pointing to last opcode */
 #endif
 #if MICROPY_OPT_COMPUTED_GOTO
-    #include "vmentrytable.h"
+    #include "py/vmentrytable.h"
     #define DISPATCH() do { \
         TRACE(ip); \
         MARK_EXC_IP_GLOBAL(); \
diff --git a/py/vmentrytable.h b/py/vmentrytable.h
index d3de97588..2926c0d7c 100644
--- a/py/vmentrytable.h
+++ b/py/vmentrytable.h
@@ -28,7 +28,7 @@
 #pragma clang diagnostic push
 #pragma clang diagnostic ignored "-Winitializer-overrides"
 #endif // __clang__
- 
+
 static void* entry_table[256] = {
     [0 ... 255] = &&entry_default,
     [MP_BC_LOAD_CONST_FALSE] = &&entry_MP_BC_LOAD_CONST_FALSE,
diff --git a/py/vstr.c b/py/vstr.c
index 03b03d0a3..e87aef9e4 100644
--- a/py/vstr.c
+++ b/py/vstr.c
@@ -24,13 +24,13 @@
  * THE SOFTWARE.
  */
 
-#include <stdbool.h>
 #include <stdio.h>
 #include <stdarg.h>
 #include <string.h>
 #include <assert.h>
-#include "mpconfig.h"
-#include "misc.h"
+
+#include "py/mpconfig.h"
+#include "py/misc.h"
 
 // returned value is always at least 1 greater than argument
 #define ROUND_ALLOC(a) (((a) & ((~0) - 7)) + 8)
diff --git a/py/warning.c b/py/warning.c
index c7461c0f5..4cce17766 100644
--- a/py/warning.c
+++ b/py/warning.c
@@ -23,17 +23,12 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  * THE SOFTWARE.
  */
-#include <stdint.h>
+
 #include <stdarg.h>
 #include <stdio.h>
 
-#include "mpconfig.h"
-#include "misc.h"
-#include "qstr.h"
-#include "obj.h"
-#include "compile.h"
-#include "scope.h"
-#include "emit.h"
+#include "py/obj.h"
+#include "py/emit.h"
 
 #if MICROPY_WARNINGS
 
diff --git a/unix-cpy/main.c b/unix-cpy/main.c
index 81f39ed27..002e26af8 100644
--- a/unix-cpy/main.c
+++ b/unix-cpy/main.c
@@ -34,7 +34,6 @@
 #include "misc.h"
 #include "qstr.h"
 #include "lexer.h"
-#include "lexerunix.h"
 #include "parse.h"
 #include "obj.h"
 #include "parsehelper.h"
diff --git a/unix/modsocket.c b/unix/modsocket.c
index f844d3b35..402695d65 100644
--- a/unix/modsocket.c
+++ b/unix/modsocket.c
@@ -44,7 +44,6 @@
 #include "qstr.h"
 #include "obj.h"
 #include "objtuple.h"
-#include "objarray.h"
 #include "objstr.h"
 #include "runtime.h"
 #include "stream.h"
-- 
GitLab