diff --git a/bootstrap.sh b/bootstrap.sh
index f8fb29bfb7dd948006697347a19ac061986af66f..836edfb8423614d50d906e32e77c1c8cbb5c67c4 100755
--- a/bootstrap.sh
+++ b/bootstrap.sh
@@ -5,6 +5,7 @@ cd "$(dirname "$0")"
 test -d build/ && rm -r build/
 
 # Get external libs (MicroPython, tiny-AES-c, SHA256)
+git submodule deinit --all
 git submodule update --init ./lib
 meson --cross-file card10-cross.ini build/ "$@"
 
diff --git a/lib/micropython/meson.build b/lib/micropython/meson.build
index f85af62c96aa1c3a14c32f6c99c3ec9bb6690a4e..7c3e3478c700abc8ec5b390c63933dd55764f138 100644
--- a/lib/micropython/meson.build
+++ b/lib/micropython/meson.build
@@ -50,7 +50,7 @@ micropython_gen_frozen = [
 # Sources
 micropython_includes = include_directories(
   './micropython/',
-  './micropython/lib/utils',
+  './micropython/shared/runtime/',
   './micropython/extmod/',
 )
 
@@ -175,10 +175,10 @@ micropython_sources = files(
 )
 
 micropython_additional_sources = files(
-  'micropython/lib/utils/stdout_helpers.c',
-  'micropython/lib/utils/pyexec.c',
-  'micropython/lib/mp-readline/readline.c',
-  'micropython/lib/timeutils/timeutils.c'
+  'micropython/shared/runtime/stdout_helpers.c',
+  'micropython/shared/runtime/pyexec.c',
+  'micropython/shared/readline/readline.c',
+  'micropython/shared/timeutils/timeutils.c'
 )
 
 micropython_extmod_sources = files(
diff --git a/pycardium/main.c b/pycardium/main.c
index 947f072c119d36c8c77e453bc7f7da6c8619ca05..516b234545de6dedbe5b9ba0687ffc326934c3e7 100644
--- a/pycardium/main.c
+++ b/pycardium/main.c
@@ -6,8 +6,8 @@
 
 #include "max32665.h"
 
-#include "lib/utils/pyexec.h"
-#include "lib/mp-readline/readline.h"
+#include "shared/runtime/pyexec.h"
+#include "shared/readline/readline.h"
 #include "py/gc.h"
 #include "py/runtime.h"
 #include "py/stackctrl.h"
diff --git a/pycardium/modules/modbluetooth_card10.c b/pycardium/modules/modbluetooth_card10.c
index 932930d8b959c78a0f4bc04ae42f2688de6a71d3..79893bf145aa72f63a9d79bc4a48f22040523666 100644
--- a/pycardium/modules/modbluetooth_card10.c
+++ b/pycardium/modules/modbluetooth_card10.c
@@ -679,7 +679,10 @@ int mp_bluetooth_gatts_read(
 }
 // Write a value to the local gatts db (ready to be queried by a central).
 int mp_bluetooth_gatts_write(
-	uint16_t value_handle, const uint8_t *value, size_t value_len
+	uint16_t value_handle,
+	const uint8_t *value,
+	size_t value_len,
+	bool send_update
 ) {
 	// TODO: which return value to choose?
 	mp_bluetooth_gatts_db_write(GATTS_DB, value_handle, value, value_len);
diff --git a/pycardium/modules/utime.c b/pycardium/modules/utime.c
index 1ca16df77c3a66fb8f117d31988ed44b3faac77c..64811a6bf7ec7c032eb12d8d5a6afb8cce5fc3c9 100644
--- a/pycardium/modules/utime.c
+++ b/pycardium/modules/utime.c
@@ -14,7 +14,7 @@
 #include <stdlib.h>
 
 // Needs to be after the stdint include ...
-#include "lib/timeutils/timeutils.h"
+#include "shared/timeutils/timeutils.h"
 
 /* MicroPython has its epoch at 2000-01-01. Our RTC is in UTC */
 #define EPOCH_OFFSET 946684800UL
diff --git a/pycardium/mphalport.c b/pycardium/mphalport.c
index ede86aba6f202cf5697190d25d182d0068d63b98..038fb5dfaaa4cb6c3a30e09801a69ed7d15d145b 100644
--- a/pycardium/mphalport.c
+++ b/pycardium/mphalport.c
@@ -128,14 +128,7 @@ intptr_t _sbrk(int incr)
 
 void epic_isr_ctrl_c(void)
 {
-	/* Taken from lib/micropython/micropython/lib/utils/interrupt_char.c */
-	MP_STATE_VM(mp_pending_exception) =
-		MP_OBJ_FROM_PTR(&MP_STATE_VM(mp_kbd_exception));
-#if MICROPY_ENABLE_SCHEDULER
-	if (MP_STATE_VM(sched_state) == MP_SCHED_IDLE) {
-		MP_STATE_VM(sched_state) = MP_SCHED_PENDING;
-	}
-#endif
+	mp_sched_keyboard_interrupt();
 }
 
 void mp_hal_set_interrupt_char(char c)