diff --git a/ports/card10/.gdbinit b/ports/card10/.gdbinit
index 9ef317caf7f849741a4aa99b4e73ebc1036e5335..b838d9f4ba0b7d4a8142192ee01badfcd96d1049 100644
--- a/ports/card10/.gdbinit
+++ b/ports/card10/.gdbinit
@@ -1,2 +1,5 @@
 file build/firmware.elf
 target remote localhost:3333
+define reset
+    mon mww 0x40000004 0x80000000
+end
diff --git a/ports/card10/Makefile b/ports/card10/Makefile
index 4120a35f1d4dcab720a68849f526ad0000178081..c77001c7910c618866bf7910cc4c50f1243490c1 100644
--- a/ports/card10/Makefile
+++ b/ports/card10/Makefile
@@ -18,6 +18,7 @@ INC += -I$(SDK_LOCATION)/Libraries/CMSIS/Device/Maxim/MAX32665/Include
 INC += -I$(SDK_LOCATION)/Libraries/CMSIS/Include
 INC += -I$(SDK_LOCATION)/Libraries/Boards/card10/Include
 INC += -I$(SDK_LOCATION)/Libraries/Boards/Include
+INC += -I$(SDK_LOCATION)/../lib/card10/
 
 # CFLAGS_CORTEX_M4 = -mthumb -mtune=cortex-m4 -mabi=aapcs-linux -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -fsingle-precision-constant -Wdouble-promotion
 # CFLAGS = $(INC) -Wall -Werror -std=c99 -nostdlib $(CFLAGS_CORTEX_M4) $(COPT)
@@ -44,13 +45,19 @@ LIBS =
 SRC_C = \
 	main.c \
 	uart_core.c \
+	buzzer.c \
+	modutime.c \
+	systick.c \
 	lib/utils/printf.c \
 	lib/utils/stdout_helpers.c \
 	lib/utils/pyexec.c \
 	lib/libc/string0.c \
 	lib/mp-readline/readline.c \
 
-OBJ = $(PY_CORE_O) $(addprefix $(BUILD)/, $(SRC_C:.c=.o))
+OBJ = $(PY_O) $(addprefix $(BUILD)/, $(SRC_C:.c=.o))
+
+SRC_QSTR += buzzer.c modutime.c
+USER_C_MODULES += buzzer.c modutime.c
 
 # SDK compilation hack
 
@@ -82,7 +89,7 @@ SDK_BOARD_SRC = $(wildcard $(SDK_LOCATION)/Libraries/Boards/Source/*.c)
 SDK_BOARD_OBJ = $(foreach src, $(SDK_BOARD_SRC), \
 	$(patsubst $(SDK_LOCATION)/Libraries/Boards/Source/%.c, $(BUILD)/sdk/board/%.o, $(src))\
 )
-BOARD_ADDITIONAL = board.o startup_max32665.o heap.o system_max32665.o
+BOARD_ADDITIONAL = board.o startup_max32665.o heap.o system_max32665.o leds.o
 SDK_BOARD_OBJ += $(foreach obj, $(BOARD_ADDITIONAL), $(BUILD)/sdk/board/$(obj))
 
 .PHONY: board
@@ -91,6 +98,10 @@ board: $(BUILD)/sdk/board $(SDK_BOARD_OBJ)
 $(BUILD)/sdk/board:
 	@mkdir -p $(BUILD)/sdk/board
 
+$(BUILD)/sdk/board/leds.o: $(SDK_LOCATION)/../lib/card10/leds.c
+	$(ECHO) "CC $<"
+	$(Q)$(CC) $(CFLAGS) -c -MD -o $@ $<
+
 $(BUILD)/sdk/board/board.o: $(SDK_LOCATION)/Libraries/Boards/card10/Source/board.c
 	$(ECHO) "CC $<"
 	$(Q)$(CC) $(CFLAGS) -c -MD -o $@ $<
diff --git a/ports/card10/buzzer.c b/ports/card10/buzzer.c
new file mode 100644
index 0000000000000000000000000000000000000000..e2c8fcaecbcaf0570121921b86c41c6dd6aea3e7
--- /dev/null
+++ b/ports/card10/buzzer.c
@@ -0,0 +1,44 @@
+#include "py/obj.h"
+#include "py/runtime.h"
+#include "py/builtin.h"
+#include <stdio.h>
+#include "gpio.h"
+
+static const gpio_cfg_t motor_pin = {
+	PORT_0, PIN_8, GPIO_FUNC_OUT, GPIO_PAD_NONE
+};
+
+STATIC mp_obj_t buzzer_set(mp_obj_t state_obj)
+{
+	if (state_obj == mp_const_true) {
+		printf("Buzzer ON!\n");
+		GPIO_OutSet(&motor_pin);
+	} else if (state_obj == mp_const_false){
+		printf("Buzzer OFF!\n");
+		GPIO_OutClr(&motor_pin);
+	} else {
+		mp_raise_TypeError("expected bool");
+	}
+	return mp_const_none;
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(buzzer_set_obj, buzzer_set);
+
+// Define all properties of the example module.
+// Table entries are key/value pairs of the attribute name (a string)
+// and the MicroPython object reference.
+// All identifiers and strings are written as MP_QSTR_xxx and will be
+// optimized to word-sized integers by the build system (interned strings).
+STATIC const mp_rom_map_elem_t buzzer_module_globals_table[] = {
+	{ MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_buzzer) },
+	{ MP_ROM_QSTR(MP_QSTR_set), MP_ROM_PTR(&buzzer_set_obj) },
+};
+STATIC MP_DEFINE_CONST_DICT(buzzer_module_globals, buzzer_module_globals_table);
+
+// Define module object.
+const mp_obj_module_t buzzer_module = {
+	.base = { &mp_type_module },
+	.globals = (mp_obj_dict_t*)&buzzer_module_globals,
+};
+
+// Register the module to make it available in Python
+MP_REGISTER_MODULE(MP_QSTR_buzzer, buzzer_module, MODULE_BUZZER_ENABLED);
diff --git a/ports/card10/main.c b/ports/card10/main.c
index 4c94897efc90e0332153c1ef1970d25b8dad8b3a..c8573382436f63a85dcc7604b4a110d859c769ed 100644
--- a/ports/card10/main.c
+++ b/ports/card10/main.c
@@ -8,6 +8,7 @@
 #include "py/gc.h"
 #include "py/mperrno.h"
 #include "lib/utils/pyexec.h"
+#include "leds.h"
 
 static char *stack_top;
 
@@ -20,6 +21,7 @@ int mp_hal_stdin_rx_chr(void);
 int main(int argc, char **argv) {
     int stack_dummy;
     stack_top = (char*)&stack_dummy;
+    leds_init();
 
     #if MICROPY_ENABLE_GC
     gc_init(heap, heap + sizeof(heap));
diff --git a/ports/card10/modutime.c b/ports/card10/modutime.c
new file mode 100644
index 0000000000000000000000000000000000000000..98aca15aa1dc12af058019e82a966ce92196f789
--- /dev/null
+++ b/ports/card10/modutime.c
@@ -0,0 +1,30 @@
+#include <stdio.h>
+#include <string.h>
+
+#include "py/runtime.h"
+#include "py/smallint.h"
+#include "py/obj.h"
+#include "lib/timeutils/timeutils.h"
+#include "extmod/utime_mphal.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) },
+    { 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) },
+};
+
+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/ports/card10/mpconfigport.h b/ports/card10/mpconfigport.h
index 680f8a6d56a27633ff9aff692fe0b740b3b940b3..39a2bdcbbb5859aee248ce6dc4475fe72d00ac66 100644
--- a/ports/card10/mpconfigport.h
+++ b/ports/card10/mpconfigport.h
@@ -58,6 +58,9 @@
 #define MICROPY_CPYTHON_COMPAT      (0)
 #define MICROPY_LONGINT_IMPL        (MICROPY_LONGINT_IMPL_LONGLONG)
 #define MICROPY_FLOAT_IMPL          (MICROPY_FLOAT_IMPL_FLOAT)
+#define MICROPY_PY_UTIME_MP_HAL     (1)
+#define MODULE_BUZZER_ENABLED       (1)
+#define MODULE_UTIME_ENABLED        (1)
 
 // type definitions for the specific machine
 
diff --git a/ports/card10/systick.c b/ports/card10/systick.c
new file mode 100644
index 0000000000000000000000000000000000000000..147bc0322ea43778c4b54e702501979cb2c78fd1
--- /dev/null
+++ b/ports/card10/systick.c
@@ -0,0 +1,17 @@
+#include "py/mpconfig.h"
+
+void mp_hal_delay_ms(mp_uint_t ms) {
+	mxc_delay (ms * 1000); // TODO check return value
+}
+
+void mp_hal_delay_us(mp_uint_t us) {
+	mxc_delay (us); // TODO check return value
+}
+
+mp_uint_t mp_hal_ticks_ms(void) {}
+
+mp_uint_t mp_hal_ticks_us(void) {}
+
+mp_uint_t mp_hal_ticks_cpu(void) {}
+
+