diff --git a/epicardium/epicardium.h b/epicardium/epicardium.h
index ee5900f2142569845b2b3303115a33197902c814..e74ee0dd2a89e494cfd3f4649267f255e97b70d4 100644
--- a/epicardium/epicardium.h
+++ b/epicardium/epicardium.h
@@ -12,4 +12,7 @@ API(API_UART_WRITE, void epic_uart_write_str(char*str, intptr_t length));
 #define API_UART_READ  0x2
 API(API_UART_READ, char epic_uart_read_chr(void));
 
+#define API_LEDS_SET  0x3
+API(API_LEDS_SET, void epic_leds_set(int led, uint8_t r, uint8_t g, uint8_t b));
+
 #endif /* _EPICARDIUM_H */
diff --git a/epicardium/main.c b/epicardium/main.c
index 627d876345f860f78a87b15e810fe1cff6496f2c..96656afd7a6a65bde33101a14ae4dffdff650493 100644
--- a/epicardium/main.c
+++ b/epicardium/main.c
@@ -15,6 +15,12 @@ char epic_uart_read_chr(void)
 	return UART_ReadByte(ConsoleUart);
 }
 
+void epic_leds_set(int led, uint8_t r, uint8_t g, uint8_t b)
+{
+	leds_set(led, r, g, b);
+	leds_update();
+}
+
 int main(void)
 {
 	card10_init();
diff --git a/pycardium/meson.build b/pycardium/meson.build
index de4d35be675fff87f3276424068a6fb609d91e0c..c2421e6a081facfad1af747a0cb3257498a569dd 100644
--- a/pycardium/meson.build
+++ b/pycardium/meson.build
@@ -1,6 +1,8 @@
 name = 'pycardium'
 
 modsrc = files(
+  'modules/utime.c',
+  'modules/leds.c',
 )
 
 #################################
@@ -24,7 +26,7 @@ qstr_h = custom_target(
   'qstrdefs.generated.h',
   output: 'qstrdefs.generated.h',
   input: [
-    # 'modules/qstrdefs.h',
+    'modules/qstrdefs.h',
     'mpconfigport.h',
     micropython_sources,
   ],
@@ -54,8 +56,8 @@ executable(
   mp_headers,
   include_directories: micropython_includes,
   dependencies: [max32665_startup_core1, board_card10, periphdriver, api_caller],
-  link_whole: [max32665_startup_core1_lib, board_card10_lib],
   link_with: upy,
+  link_whole: [max32665_startup_core1_lib, board_card10_lib],
   link_args: [
     '-Wl,-Map=' + meson.current_build_dir() + '/' + name + '.map',
   ],
diff --git a/pycardium/modules/leds.c b/pycardium/modules/leds.c
new file mode 100644
index 0000000000000000000000000000000000000000..6010d2131a5293ee969c4c34e87f0b2209f6605b
--- /dev/null
+++ b/pycardium/modules/leds.c
@@ -0,0 +1,29 @@
+#include "py/obj.h"
+#include "epicardium.h"
+
+static mp_obj_t mp_leds_set(size_t n_args, const mp_obj_t *args)
+{
+	int led   = mp_obj_get_int(args[0]);
+	uint8_t r = mp_obj_get_int(args[1]);
+	uint8_t g = mp_obj_get_int(args[2]);
+	uint8_t b = mp_obj_get_int(args[3]);
+
+	epic_leds_set(led, r, g, b);
+
+	return mp_const_none;
+}
+static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(leds_set_obj, 4, 4, mp_leds_set);
+
+static const mp_rom_map_elem_t leds_module_globals_table[] = {
+	{MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_leds)},
+	{MP_ROM_QSTR(MP_QSTR_set), MP_ROM_PTR(&leds_set_obj)},
+};
+static MP_DEFINE_CONST_DICT(leds_module_globals, leds_module_globals_table);
+
+const mp_obj_module_t leds_module = {
+	.base = { &mp_type_module },
+	.globals = (mp_obj_dict_t*)&leds_module_globals,
+};
+
+/* Register the module to make it available in Python */
+MP_REGISTER_MODULE(MP_QSTR_leds, leds_module, MODULE_LEDS_ENABLED);
diff --git a/pycardium/modules/qstrdefs.h b/pycardium/modules/qstrdefs.h
new file mode 100644
index 0000000000000000000000000000000000000000..a6fbb5dfe5e5e1cb92cc116ee733faf87281fa59
--- /dev/null
+++ b/pycardium/modules/qstrdefs.h
@@ -0,0 +1,15 @@
+#include "py/mpconfig.h"
+
+/* leds */
+Q(leds)
+
+/* utime */
+Q(utime)
+Q(sleep)
+Q(sleep_ms)
+Q(sleep_us)
+Q(ticks_ms)
+Q(ticks_us)
+Q(ticks_cpu)
+Q(ticks_add)
+Q(ticks_diff)
diff --git a/pycardium/modules/utime.c b/pycardium/modules/utime.c
new file mode 100644
index 0000000000000000000000000000000000000000..7cf3d93fb909075ed71698650e314a910cc0b207
--- /dev/null
+++ b/pycardium/modules/utime.c
@@ -0,0 +1,28 @@
+#include "py/mpconfig.h"
+#include "extmod/utime_mphal.h"
+
+#include "mxc_delay.h"
+
+static const mp_rom_map_elem_t time_module_globals_table[] = {
+	{MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_utime)},
+	{MP_ROM_QSTR(MP_QSTR_sleep), MP_ROM_PTR(&mp_utime_sleep_obj)},
+	{MP_ROM_QSTR(MP_QSTR_sleep_ms), MP_ROM_PTR(&mp_utime_sleep_ms_obj)},
+	{MP_ROM_QSTR(MP_QSTR_sleep_us), MP_ROM_PTR(&mp_utime_sleep_us_obj)},
+#if 0
+	/* TODO: Implement those */
+	{MP_ROM_QSTR(MP_QSTR_ticks_ms), MP_ROM_PTR(&mp_utime_ticks_ms_obj)},
+	{MP_ROM_QSTR(MP_QSTR_ticks_us), MP_ROM_PTR(&mp_utime_ticks_us_obj)},
+	{MP_ROM_QSTR(MP_QSTR_ticks_cpu), MP_ROM_PTR(&mp_utime_ticks_cpu_obj)},
+	{MP_ROM_QSTR(MP_QSTR_ticks_add), MP_ROM_PTR(&mp_utime_ticks_add_obj)},
+	{MP_ROM_QSTR(MP_QSTR_ticks_diff), MP_ROM_PTR(&mp_utime_ticks_diff_obj)},
+#endif
+};
+static MP_DEFINE_CONST_DICT(time_module_globals, time_module_globals_table);
+
+const mp_obj_module_t mp_module_utime = {
+	.base = { &mp_type_module },
+	.globals = (mp_obj_dict_t*)&time_module_globals,
+};
+
+/* Register the module to make it available in Python */
+MP_REGISTER_MODULE(MP_QSTR_utime, mp_module_utime, MODULE_UTIME_ENABLED);
diff --git a/pycardium/mpconfigport.h b/pycardium/mpconfigport.h
index 3418da7188333e186894902dd597fa76c69fd84f..0b8cba3abe45cb3676c0e9064f4ef87beccd75e9 100644
--- a/pycardium/mpconfigport.h
+++ b/pycardium/mpconfigport.h
@@ -17,6 +17,11 @@
 #define MICROPY_LONGINT_IMPL                (MICROPY_LONGINT_IMPL_LONGLONG)
 #define MICROPY_PY_BUILTINS_HELP            (1)
 #define MICROPY_PY_BUILTINS_HELP_MODULES    (1)
+#define MICROPY_PY_UTIME_MP_HAL             (1)
+
+/* Modules */
+#define MODULE_UTIME_ENABLED                (1)
+#define MODULE_LEDS_ENABLED                 (1)
 
 /*
  * This port is intended to be 32-bit, but unfortunately, int32_t for
diff --git a/pycardium/mphalport.c b/pycardium/mphalport.c
index 26521235cd2e98cd7c0309b02cef57b8b48a0524..336ccce2b4e0b290936fd4d031dbd9f4895b9772 100644
--- a/pycardium/mphalport.c
+++ b/pycardium/mphalport.c
@@ -24,6 +24,20 @@ void mp_hal_stdout_tx_strn(const char *str, mp_uint_t len)
 	epic_uart_write_str(str, len);
 }
 
+/******************************************************************************
+ * Time & Delay
+ */
+
+void mp_hal_delay_ms(mp_uint_t ms)
+{
+	mxc_delay(ms * 1000);
+}
+
+void mp_hal_delay_us(mp_uint_t us)
+{
+	mxc_delay(us);
+}
+
 /******************************************************************************
  * Fatal Errors
  */