diff --git a/py/builtin.h b/py/builtin.h
index 5d79d2835e1c3a02eea9f4665f45f889a05d6948..349f49682e2a2f575411b50e04121bad3fe0f06f 100644
--- a/py/builtin.h
+++ b/py/builtin.h
@@ -113,6 +113,7 @@ extern const mp_obj_module_t mp_module_lwip;
 extern const mp_obj_module_t mp_module_websocket;
 extern const mp_obj_module_t mp_module_webrepl;
 extern const mp_obj_module_t mp_module_framebuf;
+extern const mp_obj_module_t mp_module_btree;
 
 // extmod functions
 MP_DECLARE_CONST_FUN_OBJ(pyb_mount_obj);
diff --git a/py/objmodule.c b/py/objmodule.c
index c7cb64448897d464f15f071815838285a6198ee7..6d4b47958c965e6c34054d9501c1e66d3bf9a0fb 100644
--- a/py/objmodule.c
+++ b/py/objmodule.c
@@ -205,6 +205,9 @@ STATIC const mp_rom_map_elem_t mp_builtin_module_table[] = {
 #if MICROPY_PY_FRAMEBUF
     { MP_ROM_QSTR(MP_QSTR_framebuf), MP_ROM_PTR(&mp_module_framebuf) },
 #endif
+#if MICROPY_PY_BTREE
+    { MP_ROM_QSTR(MP_QSTR_btree), MP_ROM_PTR(&mp_module_btree) },
+#endif
 
     // extra builtin modules as defined by a port
     MICROPY_PORT_BUILTIN_MODULES
diff --git a/py/py.mk b/py/py.mk
index 0b2b2246ec5bf8a558ddc85107064e737011b84d..79b876b99436b4b7131ea136162481b9141240e6 100644
--- a/py/py.mk
+++ b/py/py.mk
@@ -16,6 +16,7 @@ endif
 # some code is performance bottleneck and compiled with other optimization options
 CSUPEROPT = -O3
 
+INC += -I../lib
 INC += -I../lib/netutils
 
 ifeq ($(MICROPY_PY_USSL),1)
@@ -63,6 +64,30 @@ SRC_MOD += $(LWIP_DIR)/netif/slipif.c
 endif
 endif
 
+ifeq ($(MICROPY_PY_BTREE),1)
+BTREE_DIR = lib/berkeley-db-1.xx
+CFLAGS_MOD += -D__DBINTERFACE_PRIVATE=1
+INC += -I../$(BTREE_DIR)/PORT/include
+SRC_MOD += extmod/modbtree.c
+SRC_MOD += $(addprefix $(BTREE_DIR)/,\
+btree/bt_close.c \
+btree/bt_conv.c \
+btree/bt_debug.c \
+btree/bt_delete.c \
+btree/bt_get.c \
+btree/bt_open.c \
+btree/bt_overflow.c \
+btree/bt_page.c \
+btree/bt_put.c \
+btree/bt_search.c \
+btree/bt_seq.c \
+btree/bt_split.c \
+btree/bt_utils.c \
+mpool/mpool.c \
+	)
+CFLAGS_MOD += -DMICROPY_PY_BTREE=1
+endif
+
 # py object files
 PY_O_BASENAME = \
 	mpstate.o \