diff --git a/.gitignore b/.gitignore
index 5bc8cd8dd..83b214276 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,6 +1,7 @@
 **/target/*
 **/.gdb_history
 **/kernel8.img
+**/.idea
 
 node_modules
 .bundle
diff --git a/01_wait_forever/Makefile b/01_wait_forever/Makefile
index 51c128f7c..302ddce20 100644
--- a/01_wait_forever/Makefile
+++ b/01_wait_forever/Makefile
@@ -35,7 +35,7 @@ else ifeq ($(BSP),rpi4)
     TARGET            = aarch64-unknown-none-softfloat
     KERNEL_BIN        = kernel8.img
     QEMU_BINARY       = qemu-system-aarch64
-    QEMU_MACHINE_TYPE =
+    QEMU_MACHINE_TYPE = raspi4
     QEMU_RELEASE_ARGS = -d in_asm -display none
     OBJDUMP_BINARY    = aarch64-none-elf-objdump
     NM_BINARY         = aarch64-none-elf-nm
diff --git a/02_runtime_init/Makefile b/02_runtime_init/Makefile
index 893564e2d..4bfd97abf 100644
--- a/02_runtime_init/Makefile
+++ b/02_runtime_init/Makefile
@@ -35,7 +35,7 @@ else ifeq ($(BSP),rpi4)
     TARGET            = aarch64-unknown-none-softfloat
     KERNEL_BIN        = kernel8.img
     QEMU_BINARY       = qemu-system-aarch64
-    QEMU_MACHINE_TYPE =
+    QEMU_MACHINE_TYPE = raspi4
     QEMU_RELEASE_ARGS = -d in_asm -display none
     OBJDUMP_BINARY    = aarch64-none-elf-objdump
     NM_BINARY         = aarch64-none-elf-nm
diff --git a/03_hacky_hello_world/Makefile b/03_hacky_hello_world/Makefile
index ce5aff099..01d486685 100644
--- a/03_hacky_hello_world/Makefile
+++ b/03_hacky_hello_world/Makefile
@@ -35,7 +35,7 @@ else ifeq ($(BSP),rpi4)
     TARGET            = aarch64-unknown-none-softfloat
     KERNEL_BIN        = kernel8.img
     QEMU_BINARY       = qemu-system-aarch64
-    QEMU_MACHINE_TYPE =
+    QEMU_MACHINE_TYPE = raspi4
     QEMU_RELEASE_ARGS = -serial stdio -display none
     OBJDUMP_BINARY    = aarch64-none-elf-objdump
     NM_BINARY         = aarch64-none-elf-nm
diff --git a/03_hacky_hello_world/README.md b/03_hacky_hello_world/README.md
index 07bf45032..94573b988 100644
--- a/03_hacky_hello_world/README.md
+++ b/03_hacky_hello_world/README.md
@@ -65,7 +65,7 @@ diff -uNr 02_runtime_init/Makefile 03_hacky_hello_world/Makefile
 @@ -36,7 +36,7 @@
      KERNEL_BIN        = kernel8.img
      QEMU_BINARY       = qemu-system-aarch64
-     QEMU_MACHINE_TYPE =
+     QEMU_MACHINE_TYPE = raspi4
 -    QEMU_RELEASE_ARGS = -d in_asm -display none
 +    QEMU_RELEASE_ARGS = -serial stdio -display none
      OBJDUMP_BINARY    = aarch64-none-elf-objdump
diff --git a/03_hacky_hello_world/src/panic_wait.rs b/03_hacky_hello_world/src/panic_wait.rs
index 5bb0896e4..d4ec8f8d5 100644
--- a/03_hacky_hello_world/src/panic_wait.rs
+++ b/03_hacky_hello_world/src/panic_wait.rs
@@ -51,13 +51,14 @@ fn panic(info: &PanicInfo) -> ! {
     };
 
     println!(
-        "Kernel panic!\n\n\
-        Panic location:\n      File '{}', line {}, column {}\n\n\
-        {}",
+        "Kernel panic!\n\
+         {space}Panic message:\n{space}{space}{}\n\
+         {space}Panic location:\n{space}{space}File '{}', line {}, column {}",
+        info.message().unwrap_or(&format_args!("")),
         location,
         line,
         column,
-        info.message().unwrap_or(&format_args!("")),
+        space = "    ",
     );
 
     cpu::wait_forever()
diff --git a/04_safe_globals/Makefile b/04_safe_globals/Makefile
index ce5aff099..01d486685 100644
--- a/04_safe_globals/Makefile
+++ b/04_safe_globals/Makefile
@@ -35,7 +35,7 @@ else ifeq ($(BSP),rpi4)
     TARGET            = aarch64-unknown-none-softfloat
     KERNEL_BIN        = kernel8.img
     QEMU_BINARY       = qemu-system-aarch64
-    QEMU_MACHINE_TYPE =
+    QEMU_MACHINE_TYPE = raspi4
     QEMU_RELEASE_ARGS = -serial stdio -display none
     OBJDUMP_BINARY    = aarch64-none-elf-objdump
     NM_BINARY         = aarch64-none-elf-nm
diff --git a/05_drivers_gpio_uart/Makefile b/05_drivers_gpio_uart/Makefile
index f5135d1ed..38184361d 100644
--- a/05_drivers_gpio_uart/Makefile
+++ b/05_drivers_gpio_uart/Makefile
@@ -38,7 +38,7 @@ else ifeq ($(BSP),rpi4)
     TARGET            = aarch64-unknown-none-softfloat
     KERNEL_BIN        = kernel8.img
     QEMU_BINARY       = qemu-system-aarch64
-    QEMU_MACHINE_TYPE =
+    QEMU_MACHINE_TYPE = raspi4
     QEMU_RELEASE_ARGS = -serial stdio -display none
     OBJDUMP_BINARY    = aarch64-none-elf-objdump
     NM_BINARY         = aarch64-none-elf-nm
diff --git a/07_timestamps/Makefile b/07_timestamps/Makefile
index b13f0dfb7..eba5ca3f8 100644
--- a/07_timestamps/Makefile
+++ b/07_timestamps/Makefile
@@ -38,7 +38,7 @@ else ifeq ($(BSP),rpi4)
     TARGET            = aarch64-unknown-none-softfloat
     KERNEL_BIN        = kernel8.img
     QEMU_BINARY       = qemu-system-aarch64
-    QEMU_MACHINE_TYPE =
+    QEMU_MACHINE_TYPE = raspi4
     QEMU_RELEASE_ARGS = -serial stdio -display none
     OBJDUMP_BINARY    = aarch64-none-elf-objdump
     NM_BINARY         = aarch64-none-elf-nm
diff --git a/08_hw_debug_JTAG/Makefile b/08_hw_debug_JTAG/Makefile
index 9549f0920..f496efb57 100644
--- a/08_hw_debug_JTAG/Makefile
+++ b/08_hw_debug_JTAG/Makefile
@@ -40,7 +40,7 @@ else ifeq ($(BSP),rpi4)
     TARGET            = aarch64-unknown-none-softfloat
     KERNEL_BIN        = kernel8.img
     QEMU_BINARY       = qemu-system-aarch64
-    QEMU_MACHINE_TYPE =
+    QEMU_MACHINE_TYPE = raspi4
     QEMU_RELEASE_ARGS = -serial stdio -display none
     OBJDUMP_BINARY    = aarch64-none-elf-objdump
     NM_BINARY         = aarch64-none-elf-nm
diff --git a/09_privilege_level/Makefile b/09_privilege_level/Makefile
index 9549f0920..f496efb57 100644
--- a/09_privilege_level/Makefile
+++ b/09_privilege_level/Makefile
@@ -40,7 +40,7 @@ else ifeq ($(BSP),rpi4)
     TARGET            = aarch64-unknown-none-softfloat
     KERNEL_BIN        = kernel8.img
     QEMU_BINARY       = qemu-system-aarch64
-    QEMU_MACHINE_TYPE =
+    QEMU_MACHINE_TYPE = raspi4
     QEMU_RELEASE_ARGS = -serial stdio -display none
     OBJDUMP_BINARY    = aarch64-none-elf-objdump
     NM_BINARY         = aarch64-none-elf-nm
diff --git a/10_virtual_mem_part1_identity_mapping/Makefile b/10_virtual_mem_part1_identity_mapping/Makefile
index 9549f0920..f496efb57 100644
--- a/10_virtual_mem_part1_identity_mapping/Makefile
+++ b/10_virtual_mem_part1_identity_mapping/Makefile
@@ -40,7 +40,7 @@ else ifeq ($(BSP),rpi4)
     TARGET            = aarch64-unknown-none-softfloat
     KERNEL_BIN        = kernel8.img
     QEMU_BINARY       = qemu-system-aarch64
-    QEMU_MACHINE_TYPE =
+    QEMU_MACHINE_TYPE = raspi4
     QEMU_RELEASE_ARGS = -serial stdio -display none
     OBJDUMP_BINARY    = aarch64-none-elf-objdump
     NM_BINARY         = aarch64-none-elf-nm
diff --git a/11_exceptions_part1_groundwork/Makefile b/11_exceptions_part1_groundwork/Makefile
index 9549f0920..f496efb57 100644
--- a/11_exceptions_part1_groundwork/Makefile
+++ b/11_exceptions_part1_groundwork/Makefile
@@ -40,7 +40,7 @@ else ifeq ($(BSP),rpi4)
     TARGET            = aarch64-unknown-none-softfloat
     KERNEL_BIN        = kernel8.img
     QEMU_BINARY       = qemu-system-aarch64
-    QEMU_MACHINE_TYPE =
+    QEMU_MACHINE_TYPE = raspi4
     QEMU_RELEASE_ARGS = -serial stdio -display none
     OBJDUMP_BINARY    = aarch64-none-elf-objdump
     NM_BINARY         = aarch64-none-elf-nm
diff --git a/12_integrated_testing/Makefile b/12_integrated_testing/Makefile
index 4e2efeff3..b1db9235e 100644
--- a/12_integrated_testing/Makefile
+++ b/12_integrated_testing/Makefile
@@ -48,7 +48,7 @@ else ifeq ($(BSP),rpi4)
     TARGET            = aarch64-unknown-none-softfloat
     KERNEL_BIN        = kernel8.img
     QEMU_BINARY       = qemu-system-aarch64
-    QEMU_MACHINE_TYPE =
+    QEMU_MACHINE_TYPE = raspi4
     QEMU_RELEASE_ARGS = -serial stdio -display none
     QEMU_TEST_ARGS    = $(QEMU_RELEASE_ARGS) -semihosting
     OBJDUMP_BINARY    = aarch64-none-elf-objdump
diff --git a/12_integrated_testing/README.md b/12_integrated_testing/README.md
index ae68d2697..e0144aeb7 100644
--- a/12_integrated_testing/README.md
+++ b/12_integrated_testing/README.md
@@ -449,7 +449,7 @@ provided to it by `cargo`, and finally compiles a `docker` command to execute th
 reference, here it is fully resolved for an `RPi3 BSP`:
 
 ```bash
-docker run -t --rm -v /opt/rust-raspberrypi-OS-tutorials/12_integrated_testing:/work/tutorial -w /work/tutorial -v /opt/rust-raspberrypi-OS-tutorials/12_integrated_testing/../common:/work/common rustembedded/osdev-utils:2021.12 ruby ../common/tests/dispatch.rb qemu-system-aarch64 -M raspi3 -serial stdio -display none -semihosting -kernel $TEST_BINARY
+docker run -t --rm -v /opt/rust-raspberrypi-OS-tutorials/12_integrated_testing:/work/tutorial -w /work/tutorial -v /opt/rust-raspberrypi-OS-tutorials/12_integrated_testing/../common:/work/common u007d/osdev-utils-rpi4:2023.09 ruby ../common/tests/dispatch.rb qemu-system-aarch64 -M raspi3 -serial stdio -display none -semihosting -kernel $TEST_BINARY
 ```
 
 This command is quite similar to the one used in the `make test_boot` target that we have since
diff --git a/13_exceptions_part2_peripheral_IRQs/Makefile b/13_exceptions_part2_peripheral_IRQs/Makefile
index 4e2efeff3..b1db9235e 100644
--- a/13_exceptions_part2_peripheral_IRQs/Makefile
+++ b/13_exceptions_part2_peripheral_IRQs/Makefile
@@ -48,7 +48,7 @@ else ifeq ($(BSP),rpi4)
     TARGET            = aarch64-unknown-none-softfloat
     KERNEL_BIN        = kernel8.img
     QEMU_BINARY       = qemu-system-aarch64
-    QEMU_MACHINE_TYPE =
+    QEMU_MACHINE_TYPE = raspi4
     QEMU_RELEASE_ARGS = -serial stdio -display none
     QEMU_TEST_ARGS    = $(QEMU_RELEASE_ARGS) -semihosting
     OBJDUMP_BINARY    = aarch64-none-elf-objdump
diff --git a/14_virtual_mem_part2_mmio_remap/Makefile b/14_virtual_mem_part2_mmio_remap/Makefile
index 4e2efeff3..b1db9235e 100644
--- a/14_virtual_mem_part2_mmio_remap/Makefile
+++ b/14_virtual_mem_part2_mmio_remap/Makefile
@@ -48,7 +48,7 @@ else ifeq ($(BSP),rpi4)
     TARGET            = aarch64-unknown-none-softfloat
     KERNEL_BIN        = kernel8.img
     QEMU_BINARY       = qemu-system-aarch64
-    QEMU_MACHINE_TYPE =
+    QEMU_MACHINE_TYPE = raspi4
     QEMU_RELEASE_ARGS = -serial stdio -display none
     QEMU_TEST_ARGS    = $(QEMU_RELEASE_ARGS) -semihosting
     OBJDUMP_BINARY    = aarch64-none-elf-objdump
diff --git a/15_virtual_mem_part3_precomputed_tables/Makefile b/15_virtual_mem_part3_precomputed_tables/Makefile
index bc23270d0..a9024aa79 100644
--- a/15_virtual_mem_part3_precomputed_tables/Makefile
+++ b/15_virtual_mem_part3_precomputed_tables/Makefile
@@ -48,7 +48,7 @@ else ifeq ($(BSP),rpi4)
     TARGET            = aarch64-unknown-none-softfloat
     KERNEL_BIN        = kernel8.img
     QEMU_BINARY       = qemu-system-aarch64
-    QEMU_MACHINE_TYPE =
+    QEMU_MACHINE_TYPE = raspi4
     QEMU_RELEASE_ARGS = -serial stdio -display none
     QEMU_TEST_ARGS    = $(QEMU_RELEASE_ARGS) -semihosting
     OBJDUMP_BINARY    = aarch64-none-elf-objdump
diff --git a/16_virtual_mem_part4_higher_half_kernel/Makefile b/16_virtual_mem_part4_higher_half_kernel/Makefile
index bc23270d0..a9024aa79 100644
--- a/16_virtual_mem_part4_higher_half_kernel/Makefile
+++ b/16_virtual_mem_part4_higher_half_kernel/Makefile
@@ -48,7 +48,7 @@ else ifeq ($(BSP),rpi4)
     TARGET            = aarch64-unknown-none-softfloat
     KERNEL_BIN        = kernel8.img
     QEMU_BINARY       = qemu-system-aarch64
-    QEMU_MACHINE_TYPE =
+    QEMU_MACHINE_TYPE = raspi4
     QEMU_RELEASE_ARGS = -serial stdio -display none
     QEMU_TEST_ARGS    = $(QEMU_RELEASE_ARGS) -semihosting
     OBJDUMP_BINARY    = aarch64-none-elf-objdump
diff --git a/17_kernel_symbols/Makefile b/17_kernel_symbols/Makefile
index 3c33cd66a..df9da46f4 100644
--- a/17_kernel_symbols/Makefile
+++ b/17_kernel_symbols/Makefile
@@ -48,7 +48,7 @@ else ifeq ($(BSP),rpi4)
     TARGET            = aarch64-unknown-none-softfloat
     KERNEL_BIN        = kernel8.img
     QEMU_BINARY       = qemu-system-aarch64
-    QEMU_MACHINE_TYPE =
+    QEMU_MACHINE_TYPE = raspi4
     QEMU_RELEASE_ARGS = -serial stdio -display none
     QEMU_TEST_ARGS    = $(QEMU_RELEASE_ARGS) -semihosting
     OBJDUMP_BINARY    = aarch64-none-elf-objdump
diff --git a/18_backtrace/Makefile b/18_backtrace/Makefile
index 7edf4edf6..63bd58e77 100644
--- a/18_backtrace/Makefile
+++ b/18_backtrace/Makefile
@@ -48,7 +48,7 @@ else ifeq ($(BSP),rpi4)
     TARGET            = aarch64-unknown-none-softfloat
     KERNEL_BIN        = kernel8.img
     QEMU_BINARY       = qemu-system-aarch64
-    QEMU_MACHINE_TYPE =
+    QEMU_MACHINE_TYPE = raspi4
     QEMU_RELEASE_ARGS = -serial stdio -display none
     QEMU_TEST_ARGS    = $(QEMU_RELEASE_ARGS) -semihosting
     OBJDUMP_BINARY    = aarch64-none-elf-objdump
diff --git a/19_kernel_heap/Makefile b/19_kernel_heap/Makefile
index f9704a44c..6d3f13f52 100644
--- a/19_kernel_heap/Makefile
+++ b/19_kernel_heap/Makefile
@@ -53,7 +53,7 @@ else ifeq ($(BSP),rpi4)
     TARGET            = aarch64-unknown-none-softfloat
     KERNEL_BIN        = kernel8.img
     QEMU_BINARY       = qemu-system-aarch64
-    QEMU_MACHINE_TYPE =
+    QEMU_MACHINE_TYPE = raspi4
     QEMU_RELEASE_ARGS = -serial stdio -display none
     QEMU_TEST_ARGS    = $(QEMU_RELEASE_ARGS) -semihosting
     OBJDUMP_BINARY    = aarch64-none-elf-objdump
diff --git a/20_timer_callbacks/Makefile b/20_timer_callbacks/Makefile
index f9704a44c..6d3f13f52 100644
--- a/20_timer_callbacks/Makefile
+++ b/20_timer_callbacks/Makefile
@@ -53,7 +53,7 @@ else ifeq ($(BSP),rpi4)
     TARGET            = aarch64-unknown-none-softfloat
     KERNEL_BIN        = kernel8.img
     QEMU_BINARY       = qemu-system-aarch64
-    QEMU_MACHINE_TYPE =
+    QEMU_MACHINE_TYPE = raspi4
     QEMU_RELEASE_ARGS = -serial stdio -display none
     QEMU_TEST_ARGS    = $(QEMU_RELEASE_ARGS) -semihosting
     OBJDUMP_BINARY    = aarch64-none-elf-objdump
diff --git a/X1_JTAG_boot/Makefile b/X1_JTAG_boot/Makefile
index b13f0dfb7..eba5ca3f8 100644
--- a/X1_JTAG_boot/Makefile
+++ b/X1_JTAG_boot/Makefile
@@ -38,7 +38,7 @@ else ifeq ($(BSP),rpi4)
     TARGET            = aarch64-unknown-none-softfloat
     KERNEL_BIN        = kernel8.img
     QEMU_BINARY       = qemu-system-aarch64
-    QEMU_MACHINE_TYPE =
+    QEMU_MACHINE_TYPE = raspi4
     QEMU_RELEASE_ARGS = -serial stdio -display none
     OBJDUMP_BINARY    = aarch64-none-elf-objdump
     NM_BINARY         = aarch64-none-elf-nm
diff --git a/common/docker.mk b/common/docker.mk
index 61355768f..5a5107a69 100644
--- a/common/docker.mk
+++ b/common/docker.mk
@@ -1 +1 @@
-DOCKER_IMAGE := rustembedded/osdev-utils:2021.12
+DOCKER_IMAGE := u007d/osdev-utils-rpi4:2023.09
diff --git a/docker/rustembedded-osdev-utils/Makefile b/docker/rustembedded-osdev-utils/Makefile
index 57acd9956..29cfbd1f3 100644
--- a/docker/rustembedded-osdev-utils/Makefile
+++ b/docker/rustembedded-osdev-utils/Makefile
@@ -4,14 +4,14 @@
 
 # Reference followed: https://www.docker.com/blog/getting-started-with-docker-for-arm-on-linux
 
-TAG := 2021.12
+TAG := 2023.09
 
 default: build_local
 
 build_local:
 	cp ../../Gemfile .
 	docker build                                           \
-	    --tag rustembedded/osdev-utils:$(TAG)              \
+	    --tag u007d/osdev-utils-rpi4:$(TAG)              \
 	    --build-arg VCS_REF=`git rev-parse --short HEAD` .
 	rm Gemfile
 
@@ -20,6 +20,6 @@ buildx_push:
 	docker buildx build                                    \
 	    --push                                             \
 	    --platform linux/arm64/v8,linux/amd64              \
-	    --tag rustembedded/osdev-utils:$(TAG)              \
+	    --tag u007d/osdev-utils-rpi4:$(TAG)              \
 	    --build-arg VCS_REF=`git rev-parse --short HEAD` .
 	rm Gemfile