diff --git a/epicardium/main.c b/epicardium/main.c
index fba57b110cd3ea8c322e4061622ec89b27949d08..9f0e725bbeba49d3531f7de474cce98525fa0c8e 100644
--- a/epicardium/main.c
+++ b/epicardium/main.c
@@ -104,6 +104,9 @@ int main(void)
 		abort();
 	}
 
+	/* Watchdog petting */
+	watchdog_clearer_init();
+
 	LOG_DEBUG("startup", "Starting FreeRTOS ...");
 	vTaskStartScheduler();
 
diff --git a/epicardium/modules/hardware.c b/epicardium/modules/hardware.c
index 01d76545607e64c0ea08cf48f1ebb578445e3d7b..f7cca08de3030dd8aaf2fd4f112f7bd7aa7d5487 100644
--- a/epicardium/modules/hardware.c
+++ b/epicardium/modules/hardware.c
@@ -20,6 +20,7 @@
 #include "rtc.h"
 #include "spi.h"
 #include "trng.h"
+#include "wdt.h"
 
 /*
  * Early init is called at the very beginning and is meant for modules which
@@ -28,6 +29,23 @@
  */
 int hardware_early_init(void)
 {
+	/*
+	 * Watchdog timer
+	 */
+	sys_cfg_wdt_t wdt_cfg = NULL;
+	WDT_Init(MXC_WDT0, wdt_cfg);
+
+	if (WDT_GetResetFlag(MXC_WDT0)) {
+		WDT_ClearResetFlag(MXC_WDT0);
+		LOG_INFO("watchdog", "Reset due to watchdog timeout");
+	}
+
+	WDT_Enable(MXC_WDT0, 1);
+	WDT_SetResetPeriod(
+		MXC_WDT0,
+		WDT_PERIOD_2_27); /* Clocked by PCLK at 50MHz, reset at 2^27 ticks = 2.7 seconds */
+	WDT_EnableReset(MXC_WDT0, 1);
+
 	/*
 	 * I2C bus for onboard peripherals (ie. PMIC, BMA400, BHI160, BME680,
 	 * ...)
diff --git a/epicardium/modules/meson.build b/epicardium/modules/meson.build
index dc2318359ecafaae8b78566b4ec87ecf891af44b..73975adceee81bb83894ecdd15784112ce1f3221 100644
--- a/epicardium/modules/meson.build
+++ b/epicardium/modules/meson.build
@@ -18,4 +18,5 @@ module_sources = files(
   'stream.c',
   'trng.c',
   'vibra.c',
+  'watchdog.c',
 )
diff --git a/epicardium/modules/modules.h b/epicardium/modules/modules.h
index a6e2dd90bbb7105165b5444393628cedac914769..8760e691567f4e89e989cfe48d43d4c0d05cb77b 100644
--- a/epicardium/modules/modules.h
+++ b/epicardium/modules/modules.h
@@ -35,6 +35,9 @@ int personal_state_enabled();
 /* ---------- PMIC --------------------------------------------------------- */
 void vPmicTask(void *pvParameters);
 
+/* ---------- Watchdog ----------------------------------------------------- */
+void watchdog_clearer_init();
+
 /* Critical battery voltage */
 #define BATTERY_CRITICAL   3.40f
 
diff --git a/epicardium/modules/watchdog.c b/epicardium/modules/watchdog.c
new file mode 100644
index 0000000000000000000000000000000000000000..a538035d685673ff1e3976037211c1e8e766bb3c
--- /dev/null
+++ b/epicardium/modules/watchdog.c
@@ -0,0 +1,28 @@
+#include "modules/log.h"
+#include "modules/modules.h"
+
+#include "timers.h"
+#include "mxc_sys.h"
+#include "wdt.h"
+
+static TimerHandle_t clearer_timer;
+static StaticTimer_t clearer_timer_buffer;
+#define CLEAR_PERIOD pdMS_TO_TICKS(2000)
+
+static void watchdog_clearer_callback()
+{
+	WDT_ResetTimer(MXC_WDT0);
+}
+
+void watchdog_clearer_init()
+{
+	clearer_timer = xTimerCreateStatic(
+		"watchdog_clearer_timer",
+		CLEAR_PERIOD,
+		pdTRUE,
+		NULL,
+		watchdog_clearer_callback,
+		&clearer_timer_buffer
+	);
+	xTimerStart(clearer_timer, 0);
+}