diff --git a/src/flow3r/badgelink/mod.rs b/src/flow3r/badgelink/mod.rs
index 8e57ae510988e55a48f40a80cad127809a77920e..ed5b031e5fec0e223f87ee626d6e300b2aeb987d 100644
--- a/src/flow3r/badgelink/mod.rs
+++ b/src/flow3r/badgelink/mod.rs
@@ -1,4 +1,42 @@
+use hal::{i2c::I2C, peripherals::I2C0};
+use port_expander::{Max7321, dev::max7321::Driver};
+use shared_bus::{I2cProxy, XtensaMutex, NullMutex};
+
 pub mod badgenet;
-mod switch;
 
-pub struct BadgeLink;
+pub struct BadgeLink {
+    port_expander: Max7321<NullMutex<Driver<I2cProxy<'static, XtensaMutex<I2C<'static, I2C0>>>>>>
+}
+
+impl BadgeLink {
+    pub fn new(i2c: I2cProxy<'static, XtensaMutex<I2C<'static, I2C0>>>) -> Self {
+        let mut port_expander = port_expander::Max7321::new(i2c, true, true, true, false);
+        Self {
+            port_expander
+        }
+    }
+
+    pub fn left_audio(&mut self) {
+        let mut pes = self.port_expander.split();
+        pes.p3.set_low();
+        pes.p4.set_low();
+    }
+
+    pub fn left_badgelink(&mut self) {
+        let mut pes = self.port_expander.split();
+        pes.p3.set_high();
+        pes.p4.set_high();
+    }
+
+    pub fn right_audio(&mut self) {
+        let mut pes = self.port_expander.split();
+        pes.p5.set_low();
+        pes.p6.set_low();
+    }
+
+    pub fn right_badgelink(&mut self) {
+        let mut pes = self.port_expander.split();
+        pes.p5.set_high();
+        pes.p6.set_high();
+    }
+}
diff --git a/src/flow3r/badgelink/switch.rs b/src/flow3r/badgelink/switch.rs
deleted file mode 100644
index 8b137891791fe96927ad78e64b0aad7bded08bdc..0000000000000000000000000000000000000000
--- a/src/flow3r/badgelink/switch.rs
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/src/flow3r/mod.rs b/src/flow3r/mod.rs
index 4153e163d110da14c1cbdd4fae048ba5d111b05e..a252d08e1a834b9cf509ed7530686ce16df4c25e 100644
--- a/src/flow3r/mod.rs
+++ b/src/flow3r/mod.rs
@@ -1,3 +1,4 @@
+use self::badgelink::BadgeLink;
 use self::display::Display;
 use self::leds::Leds;
 
@@ -7,16 +8,16 @@ pub mod display;
 pub mod imu;
 pub mod input;
 pub mod leds;
-pub mod peripherals;
 pub mod sdcard;
 
 pub struct Flow3r {
     pub display: Display,
     pub leds: Leds,
+    pub badgelink: BadgeLink,
 }
 
 impl Flow3r {
-    pub fn new(display: Display, leds: Leds) -> Self {
-        Self { display, leds }
+    pub fn new(display: Display, leds: Leds, badgelink: BadgeLink) -> Self {
+        Self { display, leds, badgelink }
     }
 }
diff --git a/src/flow3r/peripherals/charging.rs b/src/flow3r/peripherals/charging.rs
deleted file mode 100644
index f0aeb299a49a82b0edd3ffe6246412ded95a9f50..0000000000000000000000000000000000000000
--- a/src/flow3r/peripherals/charging.rs
+++ /dev/null
@@ -1,4 +0,0 @@
-#[embassy_executor::task]
-pub async fn charging_status_manager() -> ! {
-    loop {}
-}
diff --git a/src/flow3r/peripherals/mod.rs b/src/flow3r/peripherals/mod.rs
deleted file mode 100644
index 78fed0f073a7fc746dc795ddfafe7e7360353ebc..0000000000000000000000000000000000000000
--- a/src/flow3r/peripherals/mod.rs
+++ /dev/null
@@ -1 +0,0 @@
-mod charging;
diff --git a/src/runtime.rs b/src/runtime.rs
index 3eec15f05031c95af657bd9bef5ef9d17ddb0408..bc802f1d50e15ea576fd5eda3333d2c1cf5688fd 100644
--- a/src/runtime.rs
+++ b/src/runtime.rs
@@ -21,7 +21,7 @@ use crate::flow3r::{
     display::{display_refresh, Display},
     input::input_controller,
     leds::init_leds,
-    Flow3r,
+    Flow3r, badgelink::BadgeLink,
 };
 use crate::main;
 
@@ -161,7 +161,9 @@ async fn init_runtime() {
 
     let rng = RNG.init(Rng::new(peripherals.RNG));
 
-    let flow3r = Flow3r::new(display, leds);
+    let badgelink = BadgeLink::new(i2c_busmanager.acquire_i2c());
+
+    let flow3r = Flow3r::new(display, leds, badgelink);
 
     let spawner = Spawner::for_current_executor().await;
     spawner