diff --git a/epicardium/modules/leds.c b/epicardium/modules/leds.c
index a4e22e5c1e6bfb7e429d64488459395c086ab09f..93b80a993717adaa0d058da554e3d7f6433e2dc5 100644
--- a/epicardium/modules/leds.c
+++ b/epicardium/modules/leds.c
@@ -11,12 +11,16 @@
 
 #define NUM_LEDS 15 /* Take from lib/card10/leds.c */
 
-static void update_if_needed()
+static void do_update()
 {
-	if (personal_state_enabled() == 0) {
-		leds_update_power();
-		leds_update();
+	while (hwlock_acquire(HWLOCK_LED, pdMS_TO_TICKS(1)) < 0) {
+		vTaskDelay(pdMS_TO_TICKS(1));
 	}
+
+	leds_update_power();
+	leds_update();
+
+	hwlock_release(HWLOCK_LED);
 }
 
 void epic_leds_set(int led, uint8_t r, uint8_t g, uint8_t b)
@@ -25,8 +29,7 @@ void epic_leds_set(int led, uint8_t r, uint8_t g, uint8_t b)
 		return;
 
 	leds_prep(led, r, g, b);
-	leds_update_power();
-	leds_update();
+	do_update();
 }
 
 void epic_leds_set_hsv(int led, float h, float s, float v)
@@ -35,7 +38,7 @@ void epic_leds_set_hsv(int led, float h, float s, float v)
 		return;
 
 	leds_prep_hsv(led, h, s, v);
-	update_if_needed();
+	do_update();
 }
 
 void epic_leds_prep(int led, uint8_t r, uint8_t g, uint8_t b)
@@ -63,7 +66,7 @@ void epic_leds_set_all(uint8_t *pattern_ptr, uint8_t len)
 
 		leds_prep(i, pattern[i][0], pattern[i][1], pattern[i][2]);
 	}
-	update_if_needed();
+	do_update();
 }
 
 void epic_leds_set_all_hsv(float *pattern_ptr, uint8_t len)
@@ -75,7 +78,7 @@ void epic_leds_set_all_hsv(float *pattern_ptr, uint8_t len)
 
 		leds_prep_hsv(i, pattern[i][0], pattern[i][1], pattern[i][2]);
 	}
-	update_if_needed();
+	do_update();
 }
 
 void epic_leds_dim_top(uint8_t value)
@@ -105,7 +108,7 @@ void epic_set_flashlight(bool power)
 
 void epic_leds_update(void)
 {
-	update_if_needed();
+	do_update();
 }
 
 void epic_leds_set_powersave(bool eco)
@@ -127,6 +130,5 @@ void epic_leds_clear_all(uint8_t r, uint8_t g, uint8_t b)
 		leds_prep(i, r, g, b);
 	}
 
-	leds_update_power();
-	leds_update();
+	do_update();
 }
diff --git a/epicardium/modules/modules.h b/epicardium/modules/modules.h
index 9b78e48b9b61e6c2b983da1aae3a88511d35892c..3555ab52e7c8ed66707459f2b0b4c90bf123dadd 100644
--- a/epicardium/modules/modules.h
+++ b/epicardium/modules/modules.h
@@ -48,6 +48,7 @@ void hwlock_init(void);
 enum hwlock_periph {
 	HWLOCK_I2C = 0,
 	HWLOCK_ADC,
+    HWLOCK_LED,
 	_HWLOCK_MAX,
 };
 
diff --git a/epicardium/modules/personal_state.c b/epicardium/modules/personal_state.c
index bd02c9211a3771435cbf4c9c905ea6d80e9440ba..cd6c52c7471af09a37560ef4b94644fc0549179c 100644
--- a/epicardium/modules/personal_state.c
+++ b/epicardium/modules/personal_state.c
@@ -31,9 +31,15 @@ int epic_personal_state_set(uint8_t state, bool persistent)
 	personal_state_persistent = persistent;
 
 	if (was_enabled && !_personal_state_enabled) {
+		while (hwlock_acquire(HWLOCK_LED, pdMS_TO_TICKS(1)) < 0) {
+			vTaskDelay(pdMS_TO_TICKS(1));
+		}
+
 		leds_prep(PERSONAL_STATE_LED, 0, 0, 0);
 		leds_update_power();
 		leds_update();
+
+		hwlock_release(HWLOCK_LED);
 	}
 
 	return 0;
@@ -54,6 +60,11 @@ void vLedTask(void *pvParameters)
 	const int led_animation_rate = 1000 / 25; /* 25Hz -> 40ms*/
 	while (1) {
 		if (_personal_state_enabled) {
+			while (hwlock_acquire(HWLOCK_LED, pdMS_TO_TICKS(1)) <
+			       0) {
+				vTaskDelay(pdMS_TO_TICKS(1));
+			}
+
 			led_animation_ticks++;
 			if (personal_state == STATE_NO_CONTACT) {
 				leds_prep(PERSONAL_STATE_LED, 255, 0, 0);
@@ -121,6 +132,8 @@ void vLedTask(void *pvParameters)
 			}
 			leds_update_power();
 			leds_update();
+
+			hwlock_release(HWLOCK_LED);
 		}
 
 		vTaskDelay(led_animation_rate / portTICK_PERIOD_MS);