diff --git a/bootloader/meson.build b/bootloader/meson.build
new file mode 100644
index 0000000000000000000000000000000000000000..04a4f73c15a936ae700155a07d281bfebc2a068d
--- /dev/null
+++ b/bootloader/meson.build
@@ -0,0 +1,19 @@
+name = 'bootloader'
+
+executable(
+  name + '.elf',
+  'main.c',
+  'mscmem.c',
+  'bootloader-usb.c',
+  'crc16-ccitt.c',
+  dependencies: [
+    libcard10,
+    max32665_startup_boot,
+    libff13,
+    maxusb,
+  ],
+  link_whole: [max32665_startup_boot_lib, board_card10_lib],
+  link_args: [
+    '-Wl,-Map=' + meson.current_build_dir() + '/' + name + '.map',
+  ],
+)
diff --git a/lib/card10/meson.build b/lib/card10/meson.build
index 07c9e3e3fcaad99a147d3660fee5799cd48f86f5..8e6ce61f03e0853b705fd3e0870e95db3649b97e 100644
--- a/lib/card10/meson.build
+++ b/lib/card10/meson.build
@@ -31,3 +31,31 @@ libcard10 = declare_dependency(
   link_with: lib,
   dependencies: deps,
 )
+
+##########################################################
+
+includes = include_directories(
+  './',
+)
+
+sources = files(
+  'mx25lba.c',
+)
+
+deps = [
+    board_card10,
+    periphdriver,
+]
+
+lib = static_library(
+  'mx25lba',
+  sources,
+  include_directories: includes,
+  dependencies: deps,
+)
+
+mx25lba = declare_dependency(
+  include_directories: includes,
+  link_with: lib,
+  dependencies: deps,
+)
diff --git a/lib/card10/mscmem.h b/lib/card10/mscmem.h
new file mode 100644
index 0000000000000000000000000000000000000000..9d4a6e943ecf5614c16e2ea4626d19baf34a23ef
--- /dev/null
+++ b/lib/card10/mscmem.h
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * Copyright (C) 2017 Maxim Integrated Products, Inc., All Rights Reserved.
+ *
+ * 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 MAXIM INTEGRATED 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.
+ *
+ * Except as contained in this notice, the name of Maxim Integrated
+ * Products, Inc. shall not be used except as stated in the Maxim Integrated
+ * Products, Inc. Branding Policy.
+ *
+ * The mere transfer of this software does not imply any licenses
+ * of trade secrets, proprietary technology, copyrights, patents,
+ * trademarks, maskwork rights, or any other form of intellectual
+ * property whatsoever. Maxim Integrated Products, Inc. retains all
+ * ownership rights.
+ *
+ * Description: Communications Device Class ACM (Serial Port) over USB
+ * $Id: descriptors.h 31172 2017-10-05 19:05:57Z zach.metzinger $
+ *
+ *******************************************************************************
+ */
+
+/**
+ * @file    mscmem.h
+ * @brief   Memory routines used by the USB Mass Storage Class example.
+ *          See the msc_mem_t structure in msc.h for function details.
+ */
+
+#ifndef __MSC_MEM_H__
+#define __MSC_MEM_H__
+
+#include <stdint.h>
+
+int mscmem_init(void);
+int mscmem_start(void);
+int mscmem_stop(void);
+uint32_t mscmem_size(void);
+int mscmem_read(uint32_t lba, uint8_t* buffer);
+int mscmem_write(uint32_t lba, uint8_t* buffer);
+int mscmem_ready(void);
+
+#endif  /* __MSC_MEM_H__ */
diff --git a/lib/ff13/meson.build b/lib/ff13/meson.build
new file mode 100644
index 0000000000000000000000000000000000000000..48a2634991bfaee9e3f3eee91409eba5dd8a7b48
--- /dev/null
+++ b/lib/ff13/meson.build
@@ -0,0 +1,23 @@
+includes = include_directories(
+  './Source/',
+)
+
+sources = files(
+  './Source/diskio.c',
+  './Source/ff.c',
+  './Source/ffsystem.c',
+  './Source/ffunicode.c',
+)
+
+lib = static_library(
+  'ff13',
+  sources,
+  include_directories: includes,
+  dependencies: [periphdriver, mx25lba],
+)
+
+libff13 = declare_dependency(
+  include_directories: includes,
+  link_with: lib,
+  dependencies: [periphdriver, mx25lba],
+)
diff --git a/lib/meson.build b/lib/meson.build
index e2f7c313470b22b1f46247970113ac2c29c968bf..80fd654a828e4e01c14ccf9548df96491fe47cc1 100644
--- a/lib/meson.build
+++ b/lib/meson.build
@@ -7,3 +7,4 @@ subdir('./vendor/Maxim/MAX77650/')
 subdir('./gfx/')
 
 subdir('./card10/')
+subdir('./ff13/')
diff --git a/lib/sdk/Libraries/CMSIS/Device/Maxim/MAX32665/meson.build b/lib/sdk/Libraries/CMSIS/Device/Maxim/MAX32665/meson.build
index 9f9b1f64f2e74448f68a8b009f9474ecd1d6ae41..4fef47d4ef088c6eb51c93e7634c03d1efd6601c 100644
--- a/lib/sdk/Libraries/CMSIS/Device/Maxim/MAX32665/meson.build
+++ b/lib/sdk/Libraries/CMSIS/Device/Maxim/MAX32665/meson.build
@@ -66,3 +66,17 @@ max32665_startup_core1 = declare_dependency(
     '--entry', 'Reset_Handler',
   ],
 )
+
+#############################################################
+# For the bootloader
+#############################################################
+
+# We can just reuse the same lib here
+max32665_startup_boot_lib = max32665_startup_lib
+
+max32665_startup_boot = declare_dependency(
+  link_args: [
+    '-T', meson.current_source_dir() + 'Source/GCC/max32665_boot.ld',
+    '--entry', 'Reset_Handler',
+  ],
+)
diff --git a/lib/sdk/Libraries/MAXUSB/meson.build b/lib/sdk/Libraries/MAXUSB/meson.build
new file mode 100644
index 0000000000000000000000000000000000000000..6df655d6978c03a658b2f6a4c6d86fc937c35e26
--- /dev/null
+++ b/lib/sdk/Libraries/MAXUSB/meson.build
@@ -0,0 +1,33 @@
+includes = include_directories(
+  'include/core/musbhsfc',
+  'include/core',
+  'include/devclass',
+  'include/enumerate',
+  'include/util',
+  'include/dbg_log',
+)
+
+sources = files(
+  'src/core/musbhsfc/usb.c',
+  'src/core/usb_event.c',
+  'src/dbg_log/dbg_log.c',
+  'src/devclass/cdc_acm.c',
+  'src/devclass/hid_kbd.c',
+  'src/devclass/hid_raw.c',
+  'src/devclass/msc.c',
+  'src/enumerate/enumerate.c',
+  'src/util/fifo.c',
+)
+
+lib = static_library(
+  'maxusb',
+  sources,
+  include_directories: includes,
+  dependencies: periphdriver,
+)
+
+maxusb = declare_dependency(
+  include_directories: includes,
+  link_with: lib,
+  dependencies: periphdriver,
+)
diff --git a/lib/sdk/meson.build b/lib/sdk/meson.build
index b78dc88f303266b52edfd30f8c255c0d3aca2d68..e71031e577d7942f506dd1deae8124dec3dcb15c 100644
--- a/lib/sdk/meson.build
+++ b/lib/sdk/meson.build
@@ -4,3 +4,5 @@ subdir('./Libraries/CMSIS/Device/Maxim/MAX32665/')
 subdir('./Libraries/Boards/card10/')
 
 subdir('./Libraries/FreeRTOS/')
+
+subdir('./Libraries/MAXUSB/')
diff --git a/meson.build b/meson.build
index 0cb5a984fa08e582ef5ae817d5bac343a04e7213..a00a065b303ca33ade35acd054a64851eaeda23f 100644
--- a/meson.build
+++ b/meson.build
@@ -30,4 +30,5 @@ add_global_link_arguments(
 python3 = import('python').find_installation('python3')
 
 subdir('lib/')
+subdir('bootloader/')
 subdir('hw-tests/')