diff --git a/usermodule/mp_badge_link.c b/usermodule/mp_badge_link.c
index df059215838feae2b4b9ca348cf29e70ac3886eb..cb1bfc8e8ed4dfbd709a8e0200e116999076cce5 100644
--- a/usermodule/mp_badge_link.c
+++ b/usermodule/mp_badge_link.c
@@ -18,41 +18,62 @@
 //
 // See mypystubs/badge_link.pyi for more information.
 
-typedef struct _badgelink_jack_t {
-    mp_obj_base_t base;
-    bool left;
-
-    // Lazy initialized on first access.
-    mp_obj_t pin_tip;
-    mp_obj_t pin_ring;
-} badgelink_jack_t;
-
-const mp_obj_type_t badgelink_jack_type;
-
 typedef struct _badgelink_jack_pin_t {
     mp_obj_base_t base;
 
     bool left;
     bool tip;
 
+    // Lazy initialized on first access.
     mp_obj_t pin;
 } badgelink_jack_pin_t;
 
 const mp_obj_type_t badgelink_jack_pin_type;
 
+typedef struct _badgelink_jack_t {
+    mp_obj_base_t base;
+    bool left;
+
+    badgelink_jack_pin_t tip;
+    badgelink_jack_pin_t ring;
+} badgelink_jack_t;
+
+const mp_obj_type_t badgelink_jack_type;
+
+
 STATIC badgelink_jack_t left = {
     .base = {&badgelink_jack_type},
     .left = true,
 
-    .pin_tip = mp_const_none,
-    .pin_ring = mp_const_none,
+    .tip = {
+        .base = {&badgelink_jack_pin_type},
+        .left = true,
+        .tip = true,
+        .pin = mp_const_none,
+    },
+    .ring = {
+        .base = {&badgelink_jack_pin_type},
+        .left = true,
+        .tip = false,
+        .pin = mp_const_none,
+    },
 };
 STATIC badgelink_jack_t right = {
     .base = {&badgelink_jack_type},
     .left = false,
 
-    .pin_tip = mp_const_none,
-    .pin_ring = mp_const_none,
+    .tip = {
+        .base = {&badgelink_jack_pin_type},
+        .left = false,
+        .tip = true,
+        .pin = mp_const_none,
+    },
+    .ring = {
+        .base = {&badgelink_jack_pin_type},
+        .left = false,
+        .tip = false,
+        .pin = mp_const_none,
+    },
 };
 
 STATIC void badgelink_jack_pin_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) {
@@ -83,30 +104,24 @@ STATIC void badgelink_jack_print(const mp_print_t *print, mp_obj_t self_in, mp_p
 // From machine_pin.c. Used to make a machine.Pin below.
 mp_obj_t mp_pin_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args);
 
-STATIC mp_obj_t badgelink_jack_pin_make_new(bool left, bool tip) {
-    badgelink_jack_pin_t *self = m_new_obj(badgelink_jack_pin_t);
-    self->base.type = &badgelink_jack_pin_type;
-    self->left = left;
-    self->tip = tip;
-
-    uint32_t unum = left
-        ? (tip
-            ? flow3r_bsp_spio_programmable_pins.badgelink_left_tip
-            : flow3r_bsp_spio_programmable_pins.badgelink_left_ring)
-        : (tip
-            ? flow3r_bsp_spio_programmable_pins.badgelink_right_tip
-            : flow3r_bsp_spio_programmable_pins.badgelink_right_ring);
-    mp_obj_t num = mp_obj_new_int_from_uint(unum);
-    self->pin = mp_pin_make_new(NULL, 1, 0, &num);
-
-    return MP_OBJ_FROM_PTR(self);
-}
-
 STATIC void badgelink_jack_pin_attr(mp_obj_t self_in, qstr attr, mp_obj_t *dest) {
     badgelink_jack_pin_t *self = MP_OBJ_TO_PTR(self_in);
     if (dest[0] != MP_OBJ_NULL) {
         return;
     }
+    if (self->pin == mp_const_none) {
+        bool left = self->left;
+        bool tip = self->tip;
+        uint32_t unum = left
+            ? (tip
+                ? flow3r_bsp_spio_programmable_pins.badgelink_left_tip
+                : flow3r_bsp_spio_programmable_pins.badgelink_left_ring)
+            : (tip
+                ? flow3r_bsp_spio_programmable_pins.badgelink_right_tip
+                : flow3r_bsp_spio_programmable_pins.badgelink_right_ring);
+        mp_obj_t num = mp_obj_new_int_from_uint(unum);
+        self->pin = mp_pin_make_new(NULL, 1, 0, &num);
+    }
     switch (attr) {
     case MP_QSTR_pin: dest[0] = self->pin; break;
     default:
@@ -119,15 +134,9 @@ STATIC void badgelink_jack_attr(mp_obj_t self_in, qstr attr, mp_obj_t *dest) {
     if (dest[0] != MP_OBJ_NULL) {
         return;
     }
-    if (self->pin_tip == mp_const_none) {
-        self->pin_tip = badgelink_jack_pin_make_new(self->left, true);
-    }
-    if (self->pin_ring == mp_const_none) {
-        self->pin_ring = badgelink_jack_pin_make_new(self->left, false);
-    }
     switch (attr) {
-    case MP_QSTR_tip: dest[0] = self->pin_tip; break;
-    case MP_QSTR_ring: dest[0] = self->pin_ring; break;
+    case MP_QSTR_tip: dest[0] = MP_OBJ_FROM_PTR(&self->tip); break;
+    case MP_QSTR_ring: dest[0] = MP_OBJ_FROM_PTR(&self->ring); break;
     default:
         dest[1] = MP_OBJ_SENTINEL;
     }
@@ -137,7 +146,7 @@ STATIC uint8_t pin_mask_for_jack(mp_obj_t self_in) {
     const mp_obj_type_t *ty = mp_obj_get_type(self_in);
 
     uint8_t pin_mask = 0;
-	bool left = false;
+    bool left = false;
     bool tip = false;
     bool ring = false;
     if (ty == &badgelink_jack_pin_type) {