diff --git a/build_sdk.py b/build_sdk.py
index d8e3f07a..7f2be1b9 100644
--- a/build_sdk.py
+++ b/build_sdk.py
@@ -81,6 +81,19 @@ class ConfigInfo:
             "hello": Path("example/zcu102/hello")
         }
     ),
+    BoardInfo(
+        name="maaxboard",
+        gcc_cpu="cortex-a53",
+        loader_link_address=0x40480000,
+        kernel_options={
+            "KernelPlatform": "maaxboard",
+            "KernelIsMCS": True,
+            "KernelArmExportPCNTUser": True,
+        },
+        examples={
+            "hello": Path("example/maaxboard/hello")
+        }
+    ),
     # BoardInfo(
     #     name="imx8mm",
     #     gcc_cpu="cortex-a53",
diff --git a/docs/manual.md b/docs/manual.md
index 6501799a..0391c282 100644
--- a/docs/manual.md
+++ b/docs/manual.md
@@ -514,6 +514,14 @@ The `id` should be passed to the `microkit_notify` and `microkit_ppcall` functio
 
 This chapter describes the board support packages that are available in the SDK.
 
+## MaaXBoard
+
+The MaaXBoard is a low-cost ARM SBC based on the NXP i.MX8MQ system-on-chip.
+
+Microkit produces a raw binary file, so when using U-Boot you must execute the image using:
+
+    => go 0x40480000
+
 ## TQMa8XQP 1GB
 
 The TQMa8XQP is a system-on-module designed by TQ-Systems GmbH.
diff --git a/example/maaxboard/hello/Makefile b/example/maaxboard/hello/Makefile
new file mode 100644
index 00000000..b78ab030
--- /dev/null
+++ b/example/maaxboard/hello/Makefile
@@ -0,0 +1,55 @@
+#
+# Copyright 2021, Breakaway Consulting Pty. Ltd.
+#
+# SPDX-License-Identifier: BSD-2-Clause
+#
+ifeq ($(strip $(BUILD_DIR)),)
+$(error BUILD_DIR must be specified)
+endif
+
+ifeq ($(strip $(MICROKIT_SDK)),)
+$(error MICROKIT_SDK must be specified)
+endif
+
+ifeq ($(strip $(MICROKIT_BOARD)),)
+$(error MICROKIT_BOARD must be specified)
+endif
+
+ifeq ($(strip $(MICROKIT_CONFIG)),)
+$(error MICROKIT_CONFIG must be specified)
+endif
+
+TOOLCHAIN := aarch64-none-elf
+
+CPU := cortex-a53
+
+CC := $(TOOLCHAIN)-gcc
+LD := $(TOOLCHAIN)-ld
+AS := $(TOOLCHAIN)-as
+MICROKIT_TOOL ?= $(MICROKIT_SDK)/bin/microkit
+
+HELLO_OBJS := hello.o
+
+BOARD_DIR := $(MICROKIT_SDK)/board/$(MICROKIT_BOARD)/$(MICROKIT_CONFIG)
+
+IMAGES := hello.elf
+CFLAGS := -mcpu=$(CPU) -mstrict-align -nostdlib -ffreestanding -g3 -O3 -Wall  -Wno-unused-function -Werror -I$(BOARD_DIR)/include
+LDFLAGS := -L$(BOARD_DIR)/lib
+LIBS := -lmicrokit -Tmicrokit.ld
+
+IMAGE_FILE = $(BUILD_DIR)/loader.img
+REPORT_FILE = $(BUILD_DIR)/report.txt
+
+all: $(IMAGE_FILE)
+
+$(BUILD_DIR)/%.o: %.c Makefile
+	$(CC) -c $(CFLAGS) $< -o $@
+
+$(BUILD_DIR)/%.o: %.s Makefile
+	$(AS) -g3 -mcpu=$(CPU) $< -o $@
+
+$(BUILD_DIR)/hello.elf: $(addprefix $(BUILD_DIR)/, $(HELLO_OBJS))
+	$(LD) $(LDFLAGS) $^ $(LIBS) -o $@
+
+$(IMAGE_FILE) $(REPORT_FILE): $(addprefix $(BUILD_DIR)/, $(IMAGES)) hello.system
+	$(MICROKIT_TOOL) hello.system --search-path $(BUILD_DIR) --board $(MICROKIT_BOARD) --config $(MICROKIT_CONFIG) -o $(IMAGE_FILE) -r $(REPORT_FILE)
diff --git a/example/maaxboard/hello/hello.c b/example/maaxboard/hello/hello.c
new file mode 100644
index 00000000..9519a6cb
--- /dev/null
+++ b/example/maaxboard/hello/hello.c
@@ -0,0 +1,18 @@
+/*
+ * Copyright 2021, Breakaway Consulting Pty. Ltd.
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+#include <stdint.h>
+#include <microkit.h>
+
+void
+init(void)
+{
+    microkit_dbg_puts("hello, world\n");
+}
+
+void
+notified(microkit_channel ch)
+{
+}
\ No newline at end of file
diff --git a/example/maaxboard/hello/hello.system b/example/maaxboard/hello/hello.system
new file mode 100644
index 00000000..146da4ba
--- /dev/null
+++ b/example/maaxboard/hello/hello.system
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2021, Breakaway Consulting Pty. Ltd.
+
+ SPDX-License-Identifier: BSD-2-Clause
+-->
+<system>
+    <protection_domain name="hello" priority="254">
+        <program_image path="hello.elf" />
+    </protection_domain>
+</system>
\ No newline at end of file
diff --git a/loader/src/loader.c b/loader/src/loader.c
index 09840993..3459edfe 100644
--- a/loader/src/loader.c
+++ b/loader/src/loader.c
@@ -143,6 +143,25 @@ putc(uint8_t ch)
 {
     *((volatile uint32_t *)(0x00FF000030)) = ch;
 }
+#elif defined(BOARD_maaxboard)
+#define UART_BASE 0x30860000
+#define STAT 0x98
+#define TRANSMIT 0x40
+#define STAT_TDRE (1 << 14)
+
+static void
+putc(uint8_t ch)
+{
+    if (ch == '\n') {
+        // ensure FIFO has space
+        while (!(*UART_REG(STAT) & STAT_TDRE)) { }
+        *UART_REG(TRANSMIT) = '\r';
+    }
+
+    // ensure FIFO has space
+    while (!(*UART_REG(STAT) & STAT_TDRE)) { }
+    *UART_REG(TRANSMIT) = ch;
+}
 #else
 #error Board not defined
 #endif