diff --git a/README.md b/README.md
index 49eb69d418e3057130b48de5fe1fba44ca74f560..0237727625d037714c90fe896da86996b5eb2025 100644
--- a/README.md
+++ b/README.md
@@ -51,7 +51,7 @@ To build a 64bit Qemu image:
 
     freedombone-image -t qemu-x86_64 -s 8G
 
-Other supported boards are cubieboard2, cubietruck, olinuxino-lime, olinuxino-lime2 and olinuxino-micro.
+Other supported boards are cubieboard2, cubietruck, olinuxino-lime, olinuxino-lime2, olinuxino-micro and odroid-c2.
 
 If the image build fails with an error such as "/Error reading from server. Remote end closed connection/" then you can specify a debian package mirror repository manually with:
 
diff --git a/man/freedombone-image.1.gz b/man/freedombone-image.1.gz
index 497cc86f9736ef4d2fa00b0966c3fd0562576c82..0b97ff4d04713765baca84ba4bbd140761b6d98d 100644
Binary files a/man/freedombone-image.1.gz and b/man/freedombone-image.1.gz differ
diff --git a/src/freedombone-image-hardware-setup b/src/freedombone-image-hardware-setup
index 1d6b82a0e6e3709a062aa9ebb759270eaacb0c72..f22d7fc900d87db1f448cf9ce117257ef01b2384 100755
--- a/src/freedombone-image-hardware-setup
+++ b/src/freedombone-image-hardware-setup
@@ -32,27 +32,27 @@ export TEXTDOMAIN=${PROJECT_NAME}-image-hardware-setup
 export TEXTDOMAINDIR="/usr/share/locale"
 
 enable_serial_console() {
-    # By default, spawn a console on the serial port
-    device="$1"
-    echo $"Adding a getty on the serial port"
-    echo "T0:12345:respawn:/sbin/getty -L $device 115200 vt100" >> /etc/inittab
+	# By default, spawn a console on the serial port
+	device="$1"
+	echo $"Adding a getty on the serial port"
+	echo "T0:12345:respawn:/sbin/getty -L $device 115200 vt100" >> /etc/inittab
 }
 
 beaglebone_setup_boot() {
-    # Setup uEnv.txt
-    if grep -q btrfs /etc/fstab ; then
-        fstype=btrfs
-    else
-        fstype=ext4
-    fi
-    kernelVersion=$(ls /usr/lib/*/am335x-boneblack.dtb | head -1 | cut -d/ -f4)
-    version=$(echo $kernelVersion | sed 's/linux-image-\(.*\)/\1/')
-    initRd=initrd.img-$version
-    vmlinuz=vmlinuz-$version
-
-    # uEnv.txt for Beaglebone
-    # based on https://github.com/beagleboard/image-builder/blob/master/target/boot/beagleboard.org.txt
-    cat >> /boot/uEnv.txt <<EOF
+	# Setup uEnv.txt
+	if grep -q btrfs /etc/fstab ; then
+		fstype=btrfs
+	else
+		fstype=ext4
+	fi
+	kernelVersion=$(ls /usr/lib/*/am335x-boneblack.dtb | head -1 | cut -d/ -f4)
+	version=$(echo $kernelVersion | sed 's/linux-image-\(.*\)/\1/')
+	initRd=initrd.img-$version
+	vmlinuz=vmlinuz-$version
+
+	# uEnv.txt for Beaglebone
+	# based on https://github.com/beagleboard/image-builder/blob/master/target/boot/beagleboard.org.txt
+	cat >> /boot/uEnv.txt <<EOF
 mmcroot=/dev/mmcblk0p2 ro
 mmcrootfstype=$fstype rootwait fixrtc
 mmcrootflags=subvol=@
@@ -79,17 +79,17 @@ mmcargs=setenv bootargs console=tty0 console=\${console} root=\${mmcroot} rootfs
 uenvcmd=run loadfiles; run mmcargs; bootz \${loadaddr} \${initrd_addr}:\${initrd_size} \${fdtaddr}
 EOF
 
-    mkdir -p /boot/dtbs
-    cp /usr/lib/linux-image-*-armmp/* /boot/dtbs
+	mkdir -p /boot/dtbs
+	cp /usr/lib/linux-image-*-armmp/* /boot/dtbs
 }
 
 beaglebone_flash() {
-    # allow flash-kernel to work without valid /proc contents
-    # ** this doesn't *really* work, since there are too many checks
-    #    that fail in an emulated environment!  We'll have to do it by
-    #    hand below anyway...
-    export FK_MACHINE="TI AM335x BeagleBone"
-    apt-get install -y flash-kernel
+	# allow flash-kernel to work without valid /proc contents
+	# ** this doesn't *really* work, since there are too many checks
+	#    that fail in an emulated environment!  We'll have to do it by
+	#    hand below anyway...
+	export FK_MACHINE="TI AM335x BeagleBone"
+	apt-get install -y flash-kernel
 }
 
 beaglebone_repack_kernel() {
@@ -105,50 +105,99 @@ beaglebone_repack_kernel() {
 # on the kernel command line is completely ignored!  repack the initrd
 # to remove this evil...
 
-    echo "info: repacking beaglebone kernel and initrd"
+	echo "info: repacking beaglebone kernel and initrd"
 
-    kernelVersion=$(ls /usr/lib/*/am335x-boneblack.dtb | head -1 | cut -d/ -f4)
-    version=$(echo $kernelVersion | sed 's/linux-image-\(.*\)/\1/')
-    initRd=initrd.img-$version
-    vmlinuz=vmlinuz-$version
+	kernelVersion=$(ls /usr/lib/*/am335x-boneblack.dtb | head -1 | cut -d/ -f4)
+	version=$(echo $kernelVersion | sed 's/linux-image-\(.*\)/\1/')
+	initRd=initrd.img-$version
+	vmlinuz=vmlinuz-$version
 
-    mkdir /tmp/initrd-repack
+	mkdir /tmp/initrd-repack
 
-    (cd /tmp/initrd-repack ; \
-    zcat /boot/$initRd | cpio -i ; \
-    rm -f conf/param.conf ; \
-    find . | cpio --quiet -o -H newc | \
-    gzip -9 > /boot/$initRd )
+	(cd /tmp/initrd-repack ; \
+	zcat /boot/$initRd | cpio -i ; \
+	rm -f conf/param.conf ; \
+	find . | cpio --quiet -o -H newc | \
+	gzip -9 > /boot/$initRd )
 
-    rm -rf /tmp/initrd-repack
+	rm -rf /tmp/initrd-repack
 
-    (cd /boot ; \
-    cp /usr/lib/$kernelVersion/am335x-boneblack.dtb dtb ; \
-    cat $vmlinuz dtb >> temp-kernel ; \
-    mkimage -A arm -O linux -T kernel -n "Debian kernel ${version}" \
-    -C none -a 0x80200000 -e 0x80200000 -d temp-kernel uImage ; \
-    rm -f temp-kernel ; \
-    mkimage -A arm -O linux -T ramdisk -C gzip -a 0x81000000 -e 0x81000000 \
-    -n "Debian ramdisk ${version}" \
-    -d $initRd uInitrd )
+	(cd /boot ; \
+	cp /usr/lib/$kernelVersion/am335x-boneblack.dtb dtb ; \
+	cat $vmlinuz dtb >> temp-kernel ; \
+	mkimage -A arm -O linux -T kernel -n "Debian kernel ${version}" \
+	-C none -a 0x80200000 -e 0x80200000 -d temp-kernel uImage ; \
+	rm -f temp-kernel ; \
+	mkimage -A arm -O linux -T ramdisk -C gzip -a 0x81000000 -e 0x81000000 \
+	-n "Debian ramdisk ${version}" \
+	-d $initRd uInitrd )
+}
+
+odroidc2_setup_boot() {
+	dtb="$1"
+
+	# Setup uEnv.txt
+	if grep -q btrfs /etc/fstab ; then
+		fstype=btrfs
+	else
+		fstype=ext4
+	fi
+	kernelVersion=$(ls /usr/lib/*/${dtb}.dtb | head -1 | cut -d/ -f4)
+	version=$(echo $kernelVersion | sed 's/linux-image-\(.*\)/\1/')
+	initRd=initrd.img-$version
+	vmlinuz=vmlinuz-$version
+
+	# based on http://odroid.com/dokuwiki/doku.php?id=en:c2_building_u-boot
+	cat >> /boot/uEnv.txt <<EOF
+mmcroot=/dev/mmcblk0p2 ro
+mmcrootfstype=$fstype rootwait fixrtc
+mmcrootflags=subvol=@
+
+console=ttyO0,115200n8
+
+kernel_file=$vmlinuz
+initrd_file=$initRd
+
+loadaddr=0x11000000
+initrd_addr=0x13000000
+fdtaddr=0x1000000
+
+initrd_high=0xffffffff
+fdt_high=0xffffffff
+
+loadkernel=load mmc \${mmcdev}:\${mmcpart} \${loadaddr} \${kernel_file}
+loadinitrd=load mmc \${mmcdev}:\${mmcpart} \${initrd_addr} \${initrd_file}; setenv initrd_size \${filesize}
+loadfdt=load mmc \${mmcdev}:\${mmcpart} \${fdtaddr} /dtbs/\${fdtfile}
+
+m="1080p60hz"
+m_bpp="32"
+
+loadfiles=run loadkernel; run loadinitrd; run loadfdt
+mmcargs=setenv bootargs rootwait rw console=tty0 console=\${console} root=\${mmcroot} rootfstype=\${mmcrootfstype} rootflags=\${mmcrootflags} no_console_suspend hdmimode=${m} m_bpp=${m_bpp} fsck.fix=yes
+
+uenvcmd=run loadfiles; run mmcargs; booti \${loadaddr} \${initrd_addr}:\${initrd_size} \${fdtaddr}
+EOF
+
+	mkdir -p /boot/dtbs
+	cp /usr/lib/linux-image-*-armmp/* /boot/dtbs
 }
 
 a20_setup_boot() {
-    dtb="$1"
-
-    # Setup boot.cmd
-    if grep -q btrfs /etc/fstab ; then
-    fstype=btrfs
-    else
-    fstype=ext4
-    fi
-    kernelVersion=$(ls /usr/lib/*/$dtb | head -1 | cut -d/ -f4)
-    version=$(echo $kernelVersion | sed 's/linux-image-\(.*\)/\1/')
-    initRd=initrd.img-$version
-    vmlinuz=vmlinuz-$version
-
-    # Create boot.cmd
-    cat >> /boot/boot.cmd <<EOF
+	dtb="$1"
+
+	# Setup boot.cmd
+	if grep -q btrfs /etc/fstab ; then
+	fstype=btrfs
+	else
+	fstype=ext4
+	fi
+	kernelVersion=$(ls /usr/lib/*/$dtb | head -1 | cut -d/ -f4)
+	version=$(echo $kernelVersion | sed 's/linux-image-\(.*\)/\1/')
+	initRd=initrd.img-$version
+	vmlinuz=vmlinuz-$version
+
+	# Create boot.cmd
+	cat >> /boot/boot.cmd <<EOF
 setenv mmcdev 0
 setenv mmcpart 1
 
@@ -179,42 +228,46 @@ setenv mmcargs setenv bootargs console=\${console} root=\${mmcroot} rootfstype=\
 run loadfiles; run mmcargs; bootz \${loadaddr} \${initrd_addr}:\${initrd_size} \${fdtaddr}
 EOF
 
-    # boot.scr for Allwinner A20 based device
-    mkimage -C none -A arm -T script -d /boot/boot.cmd /boot/boot.scr
+	# boot.scr for Allwinner A20 based device
+	mkimage -C none -A arm -T script -d /boot/boot.cmd /boot/boot.scr
 
-    # Copy all DTBs
-    mkdir -p /boot/dtbs
-    cp /usr/lib/$kernelVersion/* /boot/dtbs
+	# Copy all DTBs
+	mkdir -p /boot/dtbs
+	cp /usr/lib/$kernelVersion/* /boot/dtbs
 
-    # extra boot modules
-    echo "rtc_sunxi" >> /etc/initramfs-tools/modules
+	# extra boot modules
+	echo "rtc_sunxi" >> /etc/initramfs-tools/modules
 }
 
 case "$MACHINE" in
-    beaglebone)
-    beaglebone_setup_boot
-    beaglebone_flash
-    beaglebone_repack_kernel
-    enable_serial_console ttyO0
-    ;;
-    cubietruck)
-    a20_setup_boot sun7i-a20-cubietruck.dtb
-    enable_serial_console ttyS0
-    ;;
-    a20-olinuxino-lime)
-    a20_setup_boot sun7i-a20-olinuxino-lime.dtb
-    enable_serial_console ttyS0
-    ;;
-    a20-olinuxino-lime2)
-    a20_setup_boot sun7i-a20-olinuxino-lime2.dtb
-    enable_serial_console ttyS0
-    ;;
-    a20-olinuxino-micro)
-    a20_setup_boot sun7i-a20-olinuxino-micro.dtb
-    enable_serial_console ttyS0
-    ;;
-    cubieboard2)
-    a20_setup_boot sun7i-a20-cubieboard2.dtb
-    enable_serial_console ttyS0
-    ;;
+	beaglebone)
+	beaglebone_setup_boot
+	beaglebone_flash
+	beaglebone_repack_kernel
+	enable_serial_console ttyO0
+	;;
+	odroid-c2)
+	odroidc2_setup_boot meson64_odroidc2
+	enable_serial_console ttyO0
+	;;
+	cubietruck)
+	a20_setup_boot sun7i-a20-cubietruck.dtb
+	enable_serial_console ttyS0
+	;;
+	a20-olinuxino-lime)
+	a20_setup_boot sun7i-a20-olinuxino-lime.dtb
+	enable_serial_console ttyS0
+	;;
+	a20-olinuxino-lime2)
+	a20_setup_boot sun7i-a20-olinuxino-lime2.dtb
+	enable_serial_console ttyS0
+	;;
+	a20-olinuxino-micro)
+	a20_setup_boot sun7i-a20-olinuxino-micro.dtb
+	enable_serial_console ttyS0
+	;;
+	cubieboard2)
+	a20_setup_boot sun7i-a20-cubieboard2.dtb
+	enable_serial_console ttyS0
+	;;
 esac
diff --git a/src/freedombone-image-make b/src/freedombone-image-make
index 25ab91aa406e4f681473e3a59b1626fdfe744a9b..c614237a1d9d64363ee8bdacc939c67680068df5 100755
--- a/src/freedombone-image-make
+++ b/src/freedombone-image-make
@@ -83,6 +83,9 @@ logrotate module-init-tools netbase rsyslog udev debian-archive-keyring"
 # Packages needed on the beaglebone
 beaglebone_pkgs="linux-image-armmp u-boot-tools u-boot"
 
+# Packages needed on the Odroid C2 devices:
+odroidc2_pkgs="linux-image-armmp-lpae u-boot-tools u-boot"
+
 # Packages needed on the Allwinner A20 devices:
 a20_pkgs="linux-image-armmp-lpae u-boot-tools u-boot u-boot-sunxi"
 
@@ -103,6 +106,19 @@ case "$MACHINE" in
  --no-extlinux \
  --foreign /usr/bin/qemu-arm-static \
  --roottype btrfs \
+"
+		;;
+    odroid-c2)
+		extra_pkgs="$odroidc2_pkgs"
+		extra_opts="\
+ --variant minbase \
+ --bootoffset=2mib \
+ --bootsize 128M \
+ --boottype ext2 \
+ --no-kernel \
+ --no-extlinux \
+ --foreign /usr/bin/qemu-arm-static \
+ --roottype btrfs \
 "
 		;;
     cubietruck | a20-olinuxino-lime | a20-olinuxino-lime2 | a20-olinuxino-micro | cubieboard2)
diff --git a/src/freedombone-image-makefile b/src/freedombone-image-makefile
index 0d7610272efb28663818d385bd6f9c3953ff4dac..c66839aba46d5c8f0ab3ee15bcbf4ed6de7a1fab 100755
--- a/src/freedombone-image-makefile
+++ b/src/freedombone-image-makefile
@@ -89,6 +89,17 @@ beaglebone: prep
 	$(SIGN)
 	@echo "Build complete."
 
+# build Odroid C2 SD card image
+odroid-c2: prep
+	$(eval ARCHITECTURE = aarch64)
+	$(eval MACHINE = odroid-c2)
+	$(MAKE_IMAGE)
+	@rm -f $(ARCHIVE)
+	$(XZ) $(IMAGE)
+	@echo ""
+	$(SIGN)
+	@echo "Build complete."
+
 # build Cubieboard2 SD card image
 cubieboard2: prep
 	$(eval ARCHITECTURE = armhf)