diff --git a/.github/workflows/boards_build.yml b/.github/workflows/boards_build.yml
index 0a8fbebb7e1886443fc9a6e67ef36d4f53adca0d..50a29d5a3b4faf98802b82445e9b61f965aad08e 100644
--- a/.github/workflows/boards_build.yml
+++ b/.github/workflows/boards_build.yml
@@ -27,15 +27,11 @@ jobs:
       - name: Set up OpenSK
         run: ./setup.sh
 
+      - name: Building board nrf52840dk
+        run: ./deploy.py --board=nrf52840dk --no-app --programmer=none
+      - name: Building board nrf52840_dongle
+        run: ./deploy.py --board=nrf52840_dongle --no-app --programmer=none
       - name: Building board nrf52840_dongle_dfu
         run: ./deploy.py --board=nrf52840_dongle_dfu --no-app --programmer=none
       - name: Building board nrf52840_mdk_dfu
         run: ./deploy.py --board=nrf52840_mdk_dfu --no-app --programmer=none
-
-      - name: Create a long build directory
-        run: mkdir this-is-a-long-build-directory-0123456789abcdefghijklmnopqrstuvwxyz && mv third_party this-is-a-long-build-directory-0123456789abcdefghijklmnopqrstuvwxyz/
-
-      - name: Building board nrf52840dk
-        run: make -C this-is-a-long-build-directory-0123456789abcdefghijklmnopqrstuvwxyz/third_party/tock/boards/nordic/nrf52840dk
-      - name: Building board nrf52840_dongle
-        run: make -C this-is-a-long-build-directory-0123456789abcdefghijklmnopqrstuvwxyz/third_party/tock/boards/nordic/nrf52840_dongle
diff --git a/boards/nordic/nrf52840_dongle_dfu/Cargo.toml b/boards/nordic/nrf52840_dongle_dfu/Cargo.toml
new file mode 100644
index 0000000000000000000000000000000000000000..35eab8a848640da82ba78e50fafe0acd46264304
--- /dev/null
+++ b/boards/nordic/nrf52840_dongle_dfu/Cargo.toml
@@ -0,0 +1,18 @@
+[package]
+name = "nrf52840_dongle_dfu"
+version = "0.1.0"
+authors = ["Tock Project Developers <tock-dev@googlegroups.com>"]
+build = "build.rs"
+edition = "2018"
+
+[[bin]]
+path = "../nrf52840_dongle/src/main.rs"
+name = "nrf52840_dongle_dfu"
+
+[dependencies]
+components = { path = "../../components" }
+cortexm4 = { path = "../../../arch/cortex-m4" }
+capsules = { path = "../../../capsules" }
+kernel = { path = "../../../kernel" }
+nrf52840 = { path = "../../../chips/nrf52840" }
+nrf52dk_base = { path = "../nrf52dk_base" }
diff --git a/boards/nrf52840_dongle_dfu/Makefile b/boards/nordic/nrf52840_dongle_dfu/Makefile
similarity index 81%
rename from boards/nrf52840_dongle_dfu/Makefile
rename to boards/nordic/nrf52840_dongle_dfu/Makefile
index 723ba0af1570d50a7e1257bce4aa3d39108e4bf5..58771b3a640ae3cc9edc1f6e0764aeb619da57f7 100644
--- a/boards/nrf52840_dongle_dfu/Makefile
+++ b/boards/nordic/nrf52840_dongle_dfu/Makefile
@@ -4,7 +4,7 @@ TOCK_ARCH=cortex-m4
 TARGET=thumbv7em-none-eabi
 PLATFORM=nrf52840_dongle_dfu
 
-include ../../third_party/tock/boards/Makefile.common
+include ../../Makefile.common
 
 TOCKLOADER=tockloader
 
@@ -20,10 +20,10 @@ TOCKLOADER_JTAG_FLAGS = --jlink --arch $(TOCK_ARCH) --board $(PLATFORM) --page-s
 
 # Upload the kernel over JTAG
 .PHONY: flash
-flash: target/$(TARGET)/release/$(PLATFORM).bin
+flash: $(TOCK_ROOT_DIRECTORY)target/$(TARGET)/release/$(PLATFORM).bin
 	$(TOCKLOADER) $(TOCKLOADER_GENERAL_FLAGS) flash --address $(KERNEL_ADDRESS) $(TOCKLOADER_JTAG_FLAGS) $<
 
 # Upload the kernel over serial/bootloader
 .PHONY: program
-program: target/$(TARGET)/release/$(PLATFORM).hex
+program: $(TOCK_ROOT_DIRECTORY)target/$(TARGET)/release/$(PLATFORM).hex
 	$(error Cannot program nRF52 Dongle over USB. Use \`make flash\` and JTAG)
diff --git a/boards/nordic/nrf52840_dongle_dfu/build.rs b/boards/nordic/nrf52840_dongle_dfu/build.rs
new file mode 100644
index 0000000000000000000000000000000000000000..1fdd4924f0a125f565133842a274c5e2067ce21f
--- /dev/null
+++ b/boards/nordic/nrf52840_dongle_dfu/build.rs
@@ -0,0 +1,4 @@
+fn main() {
+    println!("cargo:rerun-if-changed=layout.ld");
+    println!("cargo:rerun-if-changed=../../kernel_layout.ld");
+}
diff --git a/boards/nrf52840_mdk_dfu/layout.ld b/boards/nordic/nrf52840_dongle_dfu/layout.ld
similarity index 76%
rename from boards/nrf52840_mdk_dfu/layout.ld
rename to boards/nordic/nrf52840_dongle_dfu/layout.ld
index 834133c00b8d0adb87c9e8eb355ed0b2e91c0582..41ae608ac5d17b9ff7334f769472e1b9c458f466 100644
--- a/boards/nrf52840_mdk_dfu/layout.ld
+++ b/boards/nordic/nrf52840_dongle_dfu/layout.ld
@@ -7,4 +7,4 @@ MEMORY
 
 MPU_MIN_ALIGN = 8K;
 
-INCLUDE ../../third_party/tock/boards/kernel_layout.ld
+INCLUDE ../../kernel_layout.ld
diff --git a/boards/nordic/nrf52840_mdk_dfu/Cargo.toml b/boards/nordic/nrf52840_mdk_dfu/Cargo.toml
new file mode 100644
index 0000000000000000000000000000000000000000..c0cb7af33a7349efc49cdcd6304ad56b5756f9d3
--- /dev/null
+++ b/boards/nordic/nrf52840_mdk_dfu/Cargo.toml
@@ -0,0 +1,14 @@
+[package]
+name = "nrf52840_mdk_dfu"
+version = "0.1.0"
+authors = ["Yihui Xiong <yihui.xiong@hotmail.com>"]
+build = "build.rs"
+edition = "2018"
+
+[dependencies]
+components = { path = "../../components" }
+cortexm4 = { path = "../../../arch/cortex-m4" }
+capsules = { path = "../../../capsules" }
+kernel = { path = "../../../kernel" }
+nrf52840 = { path = "../../../chips/nrf52840" }
+nrf52dk_base = { path = "../nrf52dk_base" }
diff --git a/boards/nrf52840_mdk_dfu/Makefile b/boards/nordic/nrf52840_mdk_dfu/Makefile
similarity index 74%
rename from boards/nrf52840_mdk_dfu/Makefile
rename to boards/nordic/nrf52840_mdk_dfu/Makefile
index e915141d9174e55cb67deccc607d9dc1ae49300a..a179ffb4b2c9eb870392037c5fff971f5b8c44fb 100644
--- a/boards/nrf52840_mdk_dfu/Makefile
+++ b/boards/nordic/nrf52840_mdk_dfu/Makefile
@@ -4,7 +4,7 @@ TOCK_ARCH=cortex-m4
 TARGET=thumbv7em-none-eabi
 PLATFORM=nrf52840_mdk_dfu
 
-include ../../third_party/tock/boards/Makefile.common
+include ../../Makefile.common
 
 TOCKLOADER=tockloader
 
@@ -20,10 +20,10 @@ TOCKLOADER_JTAG_FLAGS = --jlink --arch $(TOCK_ARCH) --board $(PLATFORM) --page-s
 
 # Upload the kernel over JTAG
 .PHONY: flash
-flash: target/$(TARGET)/release/$(PLATFORM).bin
+flash: $(TOCK_ROOT_DIRECTORY)target/$(TARGET)/release/$(PLATFORM).bin
 	$(TOCKLOADER) $(TOCKLOADER_GENERAL_FLAGS) flash --address $(KERNEL_ADDRESS) $(TOCKLOADER_JTAG_FLAGS) $<
 
 # Upload the kernel over serial/bootloader
 .PHONY: program
-program: target/$(TARGET)/release/$(PLATFORM).hex
-	$(error Cannot program nRF52 Dongle over USB. Use \`make flash\` and JTAG)
+program: $(TOCK_ROOT_DIRECTORY)target/$(TARGET)/release/$(PLATFORM).hex
+	$(error Cannot program nRF52840-MDK over USB. Use \`make flash\` and JTAG)
diff --git a/boards/nordic/nrf52840_mdk_dfu/build.rs b/boards/nordic/nrf52840_mdk_dfu/build.rs
new file mode 100644
index 0000000000000000000000000000000000000000..1fdd4924f0a125f565133842a274c5e2067ce21f
--- /dev/null
+++ b/boards/nordic/nrf52840_mdk_dfu/build.rs
@@ -0,0 +1,4 @@
+fn main() {
+    println!("cargo:rerun-if-changed=layout.ld");
+    println!("cargo:rerun-if-changed=../../kernel_layout.ld");
+}
diff --git a/boards/nrf52840_dongle_dfu/layout.ld b/boards/nordic/nrf52840_mdk_dfu/layout.ld
similarity index 76%
rename from boards/nrf52840_dongle_dfu/layout.ld
rename to boards/nordic/nrf52840_mdk_dfu/layout.ld
index 834133c00b8d0adb87c9e8eb355ed0b2e91c0582..41ae608ac5d17b9ff7334f769472e1b9c458f466 100644
--- a/boards/nrf52840_dongle_dfu/layout.ld
+++ b/boards/nordic/nrf52840_mdk_dfu/layout.ld
@@ -7,4 +7,4 @@ MEMORY
 
 MPU_MIN_ALIGN = 8K;
 
-INCLUDE ../../third_party/tock/boards/kernel_layout.ld
+INCLUDE ../../kernel_layout.ld
diff --git a/boards/nrf52840_mdk_dfu/src/io.rs b/boards/nordic/nrf52840_mdk_dfu/src/io.rs
similarity index 100%
rename from boards/nrf52840_mdk_dfu/src/io.rs
rename to boards/nordic/nrf52840_mdk_dfu/src/io.rs
diff --git a/boards/nrf52840_mdk_dfu/src/main.rs b/boards/nordic/nrf52840_mdk_dfu/src/main.rs
similarity index 100%
rename from boards/nrf52840_mdk_dfu/src/main.rs
rename to boards/nordic/nrf52840_mdk_dfu/src/main.rs
diff --git a/boards/nrf52840_dongle_dfu/Cargo.toml b/boards/nrf52840_dongle_dfu/Cargo.toml
deleted file mode 100644
index 6944eb33fc308caba08ec539d5d6af5783d4e3be..0000000000000000000000000000000000000000
--- a/boards/nrf52840_dongle_dfu/Cargo.toml
+++ /dev/null
@@ -1,30 +0,0 @@
-[package]
-name = "nrf52840_dongle_dfu"
-version = "0.1.0"
-authors = ["Tock Project Developers <tock-dev@googlegroups.com>"]
-build = "build.rs"
-edition = "2018"
-
-[profile.dev]
-panic = "abort"
-lto = false
-opt-level = "z"
-debug = true
-
-[profile.release]
-panic = "abort"
-lto = true
-opt-level = "z"
-debug = true
-
-[[bin]]
-path = "../../third_party/tock/boards/nordic/nrf52840_dongle/src/main.rs"
-name = "nrf52840_dongle_dfu"
-
-[dependencies]
-components = { path = "../../third_party/tock/boards/components" }
-cortexm4 = { path = "../../third_party/tock/arch/cortex-m4" }
-capsules = { path = "../../third_party/tock/capsules" }
-kernel = { path = "../../third_party/tock/kernel" }
-nrf52840 = { path = "../../third_party/tock/chips/nrf52840" }
-nrf52dk_base = { path = "../../third_party/tock/boards/nordic/nrf52dk_base" }
diff --git a/boards/nrf52840_dongle_dfu/build.rs b/boards/nrf52840_dongle_dfu/build.rs
deleted file mode 100644
index 2631dccb75f21f432f5186b17215367490e2d3f2..0000000000000000000000000000000000000000
--- a/boards/nrf52840_dongle_dfu/build.rs
+++ /dev/null
@@ -1,4 +0,0 @@
-fn main() {
-    println!("cargo:rerun-if-changed=layout.ld");
-    println!("cargo:rerun-if-changed=../../third_party/tock/boards/kernel_layout.ld");
-}
diff --git a/boards/nrf52840_mdk_dfu/Cargo.toml b/boards/nrf52840_mdk_dfu/Cargo.toml
deleted file mode 100644
index 1047869ba67c2d46b0af09d0ec7dd214a051fa43..0000000000000000000000000000000000000000
--- a/boards/nrf52840_mdk_dfu/Cargo.toml
+++ /dev/null
@@ -1,26 +0,0 @@
-[package]
-name = "nrf52840_mdk_dfu"
-version = "0.1.0"
-authors = ["Yihui Xiong <yihui.xiong@hotmail.com>"]
-build = "build.rs"
-edition = "2018"
-
-[profile.dev]
-panic = "abort"
-lto = false
-opt-level = "z"
-debug = true
-
-[profile.release]
-panic = "abort"
-lto = true
-opt-level = "z"
-debug = true
-
-[dependencies]
-components = { path = "../../third_party/tock/boards/components" }
-cortexm4 = { path = "../../third_party/tock/arch/cortex-m4" }
-capsules = { path = "../../third_party/tock/capsules" }
-kernel = { path = "../../third_party/tock/kernel" }
-nrf52840 = { path = "../../third_party/tock/chips/nrf52840" }
-nrf52dk_base = { path = "../../third_party/tock/boards/nordic/nrf52dk_base" }
diff --git a/boards/nrf52840_mdk_dfu/build.rs b/boards/nrf52840_mdk_dfu/build.rs
deleted file mode 100644
index 2631dccb75f21f432f5186b17215367490e2d3f2..0000000000000000000000000000000000000000
--- a/boards/nrf52840_mdk_dfu/build.rs
+++ /dev/null
@@ -1,4 +0,0 @@
-fn main() {
-    println!("cargo:rerun-if-changed=layout.ld");
-    println!("cargo:rerun-if-changed=../../third_party/tock/boards/kernel_layout.ld");
-}
diff --git a/deploy.py b/deploy.py
index ddbd2e55cd0999324d591a7fcdb522e62169b966..3026c7abd81a12634b54871c3aeb3442192fb8be 100755
--- a/deploy.py
+++ b/deploy.py
@@ -115,7 +115,7 @@ SUPPORTED_BOARDS = {
         ),
     "nrf52840_dongle_dfu":
         OpenSKBoard(
-            path="boards/nrf52840_dongle_dfu",
+            path="third_party/tock/boards/nordic/nrf52840_dongle_dfu",
             arch="thumbv7em-none-eabi",
             page_size=4096,
             kernel_address=0x1000,
@@ -132,7 +132,7 @@ SUPPORTED_BOARDS = {
         ),
     "nrf52840_mdk_dfu":
         OpenSKBoard(
-            path="boards/nrf52840_mdk_dfu",
+            path="third_party/tock/boards/nordic/nrf52840_mdk_dfu",
             arch="thumbv7em-none-eabi",
             page_size=4096,
             kernel_address=0x1000,
@@ -304,7 +304,7 @@ class OpenSKInstaller:
   def build_tockos(self):
     info("Building Tock OS for board {}".format(self.args.board))
     props = SUPPORTED_BOARDS[self.args.board]
-    out_directory = os.path.join(props.path, "target", props.arch, "release")
+    out_directory = os.path.join("third_party", "tock", "target", props.arch, "release")
     os.makedirs(out_directory, exist_ok=True)
     self.checked_command_output(["make"], cwd=props.path)
 
@@ -418,7 +418,7 @@ class OpenSKInstaller:
 
   def install_tock_os(self):
     board_props = SUPPORTED_BOARDS[self.args.board]
-    kernel_file = os.path.join(board_props.path, "target", board_props.arch,
+    kernel_file = os.path.join("third_party", "tock", "target", board_props.arch,
                                "release", "{}.bin".format(self.args.board))
     info("Flashing file {}.".format(kernel_file))
     with open(kernel_file, "rb") as f:
@@ -481,7 +481,7 @@ class OpenSKInstaller:
 
     if self.args.tockos:
       # Process kernel
-      kernel_path = os.path.join(board_props.path, "target", board_props.arch,
+      kernel_path = os.path.join("third_party", "tock", "target", board_props.arch,
                                  "release", "{}.bin".format(self.args.board))
       with open(kernel_path, "rb") as kernel:
         kern_hex = intelhex.IntelHex()
diff --git a/patches/tock/04-additional-boards.patch b/patches/tock/04-additional-boards.patch
new file mode 100644
index 0000000000000000000000000000000000000000..88cd1c3db38e11462467ecfdb7216b8a5ad12871
--- /dev/null
+++ b/patches/tock/04-additional-boards.patch
@@ -0,0 +1,13 @@
+diff --git a/Cargo.toml b/Cargo.toml
+index 18f4a10d..db88dc1d 100644
+--- a/Cargo.toml
++++ b/Cargo.toml
+@@ -13,6 +13,8 @@ members = [
+     "boards/launchxl",
+     "boards/nordic/nrf52840dk",
+     "boards/nordic/nrf52840_dongle",
++    "boards/nordic/nrf52840_dongle_dfu",
++    "boards/nordic/nrf52840_mdk_dfu",
+     "boards/nordic/nrf52dk",
+     "boards/nucleo_f429zi",
+     "boards/nucleo_f446re",
diff --git a/patches/tock/04-nrf52-bootloader.patch b/patches/tock/04-nrf52-bootloader.patch
deleted file mode 100644
index 02f57be6552ce9ca2b09c1c98475015db6c08494..0000000000000000000000000000000000000000
--- a/patches/tock/04-nrf52-bootloader.patch
+++ /dev/null
@@ -1,21 +0,0 @@
-diff --git a/chips/nrf52/src/crt1.rs b/chips/nrf52/src/crt1.rs
-index 9703aac..281ceeb 100644
---- a/chips/nrf52/src/crt1.rs
-+++ b/chips/nrf52/src/crt1.rs
-@@ -1,4 +1,4 @@
--use cortexm4::{generic_isr, hard_fault_handler, nvic, svc_handler, systick_handler};
-+use cortexm4::{generic_isr, hard_fault_handler, nvic, scb, svc_handler, systick_handler};
- use tock_rt0;
- 
- /*
-@@ -168,5 +168,9 @@ pub unsafe extern "C" fn init() {
-     tock_rt0::init_data(&mut _etext, &mut _srelocate, &mut _erelocate);
-     tock_rt0::zero_bss(&mut _szero, &mut _ezero);
- 
-+    // Ensure that we are compatible with a bootloader.
-+    // For this we need to offset our vector table
-+    scb::set_vector_table_offset(BASE_VECTORS.as_ptr() as *const ());
-+
-     nvic::enable_all();
- }
-
diff --git a/run_desktop_tests.sh b/run_desktop_tests.sh
index e38735315eb892bf2b5e74b225afffa3400b055d..36bde36da10d929257197db4316cc2aa11f96b2b 100755
--- a/run_desktop_tests.sh
+++ b/run_desktop_tests.sh
@@ -50,8 +50,16 @@ make -C third_party/tock/boards/nordic/nrf52840dk
 make -C third_party/tock/boards/nordic/nrf52840_dongle
 
 echo "Checking that other boards build properly..."
-make -C boards/nrf52840_dongle_dfu
-make -C boards/nrf52840_mdk_dfu
+make -C third_party/tock/boards/nordic/nrf52840_dongle_dfu
+make -C third_party/tock/boards/nordic/nrf52840_mdk_dfu
+
+echo "Checking deployment of supported boards..."
+./deploy.py --board=nrf52840dk --no-app --programmer=none
+./deploy.py --board=nrf52840_dongle --no-app --programmer=none
+
+echo "Checking deployment of other boards..."
+./deploy.py --board=nrf52840_dongle_dfu --no-app --programmer=none
+./deploy.py --board=nrf52840_mdk_dfu --no-app --programmer=none
 
 if [ -z "${TRAVIS_OS_NAME}" -o "${TRAVIS_OS_NAME}" = "linux" ]
 then
diff --git a/setup.sh b/setup.sh
index 1c6fe37cfc1fb467cf04d7e759e08784b97949a7..c4297adc9ccae692ed06aa5e588285e7a1046129 100755
--- a/setup.sh
+++ b/setup.sh
@@ -46,6 +46,11 @@ EOF
   exit 1
 }
 
+# Copy additional boards to the kernel.
+echo -n '[-] Copying additional boards to Tock... '
+cp -r boards/* third_party/tock/boards
+echo $done_text
+
 # Apply patches to kernel. Do that in a sub-shell
 (
   cd third_party/tock/ && \
diff --git a/third_party/tock b/third_party/tock
index 3139864d391ab654bfb9c27ca8dcd3e4e9a2d58e..ba44dd690f2db52ab9c928975f85c34c1c6f5bea 160000
--- a/third_party/tock
+++ b/third_party/tock
@@ -1 +1 @@
-Subproject commit 3139864d391ab654bfb9c27ca8dcd3e4e9a2d58e
+Subproject commit ba44dd690f2db52ab9c928975f85c34c1c6f5bea