diff --git a/src/boards/Groundstation/Automated/Actuators/Actuators.cpp b/src/boards/Groundstation/Automated/Actuators/Actuators.cpp
index 56f491ba559df96abf4a2196337fae84e9595d79..79ce0fc556e9fb267f9a64ceee3d9c6f65a272fd 100644
--- a/src/boards/Groundstation/Automated/Actuators/Actuators.cpp
+++ b/src/boards/Groundstation/Automated/Actuators/Actuators.cpp
@@ -24,8 +24,6 @@
 
 #include <interfaces-impl/hwmapping.h>
 
-#include <utils/ModuleManager/ModuleManager.hpp>
-
 #include "ActuatorsConfig.h"
 
 using namespace miosix;
diff --git a/src/boards/Groundstation/Automated/Actuators/Actuators.h b/src/boards/Groundstation/Automated/Actuators/Actuators.h
index 38e35ff8e10d9c3c0c40ac732c28fe9dc9dbae9b..317bd33ca44fd7dcc32ec9903aa1a2ed50fffbd2 100644
--- a/src/boards/Groundstation/Automated/Actuators/Actuators.h
+++ b/src/boards/Groundstation/Automated/Actuators/Actuators.h
@@ -23,8 +23,7 @@
 
 #include <common/Mavlink.h>
 #include <logger/Logger.h>
-
-#include <utils/ModuleManager/ModuleManager.hpp>
+#include <utils/DependencyManager/DependencyManager.h>
 
 #include "ActuatorsConfig.h"
 #include "ActuatorsData.h"
@@ -55,7 +54,7 @@ enum class ActuationStatus : uint8_t
     EMERGENCY_STOP,  ///< `6`
 };
 
-class Actuators : public Boardcore::Module
+class Actuators : public Boardcore::Injectable
 {
 public:
     Actuators();
diff --git a/src/boards/Groundstation/Automated/Hub.cpp b/src/boards/Groundstation/Automated/Hub.cpp
index c1589926bf4e3c026aa62c1004d7df4bdf602603..c3db6b0be3b32f99a3353d7079d4b6e95959f1bf 100644
--- a/src/boards/Groundstation/Automated/Hub.cpp
+++ b/src/boards/Groundstation/Automated/Hub.cpp
@@ -46,10 +46,9 @@ using namespace miosix;
 void Hub::dispatchOutgoingMsg(const mavlink_message_t& msg)
 {
     // TODO: Dispatch to correct radio using mavlink ids
-    bool send_ok           = false;
-    ModuleManager& modules = ModuleManager::getInstance();
+    bool send_ok = false;
 
-    LyraGS::RadioMain* radio = modules.get<LyraGS::RadioMain>();
+    LyraGS::RadioMain* radio = getModule<LyraGS::RadioMain>();
 
     if (msg.sysid == MAV_SYSID_ARP)
     {
@@ -98,7 +97,7 @@ void Hub::dispatchOutgoingMsg(const mavlink_message_t& msg)
 
                 // The stepper is moved of 'angle' degrees
                 ActuationStatus moved =
-                    modules.get<SMA>()->moveStepperDeg(stepperId, angle);
+                    getModule<SMA>()->moveStepperDeg(stepperId, angle);
                 if (moved == ActuationStatus::OK)
                     sendAck(msg);
                 else
@@ -114,7 +113,7 @@ void Hub::dispatchOutgoingMsg(const mavlink_message_t& msg)
 
                 // The stepper is moved of 'steps' steps
                 ActuationStatus moved =
-                    modules.get<SMA>()->moveStepperSteps(stepperId, steps);
+                    getModule<SMA>()->moveStepperSteps(stepperId, steps);
                 if (moved == ActuationStatus::OK)
                     sendAck(msg);
                 else
@@ -128,7 +127,7 @@ void Hub::dispatchOutgoingMsg(const mavlink_message_t& msg)
                 float multiplier =
                     mavlink_msg_set_stepper_multiplier_tc_get_multiplier(&msg);
 
-                modules.get<SMA>()->setMultipliers(stepperId, multiplier);
+                getModule<SMA>()->setMultipliers(stepperId, multiplier);
                 sendAck(msg);
                 break;
             }
@@ -150,7 +149,7 @@ void Hub::dispatchOutgoingMsg(const mavlink_message_t& msg)
                 gpsData.fix        = 3;
                 gpsData.satellites = 42;
 
-                modules.get<SMA>()->setInitialRocketCoordinates(gpsData);
+                getModule<SMA>()->setInitialRocketCoordinates(gpsData);
                 sendAck(msg);
                 break;
             }
@@ -172,7 +171,7 @@ void Hub::dispatchOutgoingMsg(const mavlink_message_t& msg)
                 gpsData.fix        = 3;
                 gpsData.satellites = 42;
 
-                modules.get<SMA>()->setAntennaCoordinates(gpsData);
+                getModule<SMA>()->setAntennaCoordinates(gpsData);
                 sendAck(msg);
                 break;
             }
@@ -241,7 +240,7 @@ void Hub::dispatchOutgoingMsg(const mavlink_message_t& msg)
 
 void Hub::dispatchIncomingMsg(const mavlink_message_t& msg)
 {
-    Serial* serial = ModuleManager::getInstance().get<Serial>();
+    Groundstation::Serial* serial = getModule<Groundstation::Serial>();
 #if !defined(NO_MAVLINK_ON_SERIAL)
     serial->sendMsg(msg);
 #else
@@ -284,8 +283,7 @@ void Hub::dispatchIncomingMsg(const mavlink_message_t& msg)
         Logger::getInstance().log(gpsState);
     }
 
-    LyraGS::Ethernet* ethernet =
-        ModuleManager::getInstance().get<LyraGS::Ethernet>();
+    LyraGS::EthernetGS* ethernet = getModule<LyraGS::EthernetGS>();
     ethernet->sendMsg(msg);
 }
 
diff --git a/src/boards/Groundstation/Automated/Hub.h b/src/boards/Groundstation/Automated/Hub.h
index 93b658aa93bfc3e422b38899c96e3cfecfd0abe6..4d72f1514dbcb6523184e53131b2fdd2500623b9 100644
--- a/src/boards/Groundstation/Automated/Hub.h
+++ b/src/boards/Groundstation/Automated/Hub.h
@@ -22,13 +22,22 @@
 
 #pragma once
 
+#include <Groundstation/Automated/SMA/SMA.h>
 #include <Groundstation/Common/HubBase.h>
+#include <Groundstation/Common/Ports/Serial.h>
+#include <Groundstation/LyraGS/BoardStatus.h>
+#include <Groundstation/LyraGS/Ports/Ethernet.h>
+#include <Groundstation/LyraGS/Radio/Radio.h>
 #include <algorithms/NAS/NASState.h>
 #include <common/Mavlink.h>
 #include <miosix.h>
 #include <sensors/SensorData.h>
+#include <utils/DependencyManager/DependencyManager.h>
 
-#include <utils/ModuleManager/ModuleManager.hpp>
+namespace LyraGS
+{
+class BoardStatus;
+}
 
 namespace Antennas
 {
@@ -36,11 +45,11 @@ namespace Antennas
 /**
  * @brief Central hub connecting all outgoing and ingoing modules.
  */
-class Hub : public Groundstation::HubBase
+class Hub : public Boardcore::InjectableWithDeps<
+                Boardcore::InjectableBase<Groundstation::HubBase>, SMA,
+                LyraGS::RadioMain, Groundstation::Serial, LyraGS::EthernetGS>
 {
 public:
-    Hub() {}
-
     /**
      * @brief Dispatch to the correct interface and outgoing packet (gs ->
      * rocket).
diff --git a/src/boards/Groundstation/Automated/Leds/Leds.h b/src/boards/Groundstation/Automated/Leds/Leds.h
index 95ad2bd1bfc93551a0f8639535f4f87c050035cc..10dc84efcd3b35b10f0085a2bb4c70136639a6d0 100644
--- a/src/boards/Groundstation/Automated/Leds/Leds.h
+++ b/src/boards/Groundstation/Automated/Leds/Leds.h
@@ -24,10 +24,10 @@
 
 #include <ActiveObject.h>
 #include <scheduler/TaskScheduler.h>
+#include <utils/DependencyManager/DependencyManager.h>
 
 #include <array>
 #include <mutex>
-#include <utils/ModuleManager/ModuleManager.hpp>
 
 constexpr uint32_t LED_BLINK_FAST_PERIOD_MS = 50;
 constexpr uint32_t LED_BLINK_SLOW_PERIOD_MS = 300;
@@ -48,7 +48,7 @@ enum class LedColor : uint8_t
  * @brief Utility to handle blinking leds with non-blocking sleep
  * (useful for state machines states that need to blink leds without blocking)
  */
-class Leds : public Boardcore::Module
+class Leds : public Boardcore::Injectable
 {
 public:
     explicit Leds(Boardcore::TaskScheduler* scheduler);
diff --git a/src/boards/Groundstation/Automated/PinHandler/PinHandler.h b/src/boards/Groundstation/Automated/PinHandler/PinHandler.h
index 9497a5ca752be463feefd4b3ad14711e3735081c..3bb5ef27d101d5638aec35eec9f28bbaffd3d541 100644
--- a/src/boards/Groundstation/Automated/PinHandler/PinHandler.h
+++ b/src/boards/Groundstation/Automated/PinHandler/PinHandler.h
@@ -25,13 +25,12 @@
 #include <Groundstation/Automated/PinHandler/PinData.h>
 #include <diagnostic/PrintLogger.h>
 #include <scheduler/TaskScheduler.h>
+#include <utils/DependencyManager/DependencyManager.h>
 #include <utils/PinObserver/PinObserver.h>
 
-#include <utils/ModuleManager/ModuleManager.hpp>
-
 namespace Antennas
 {
-class PinHandler : public Boardcore::Module
+class PinHandler : public Boardcore::Injectable
 {
 public:
     enum PinList : uint8_t
diff --git a/src/boards/Groundstation/Automated/SMA/SMA.cpp b/src/boards/Groundstation/Automated/SMA/SMA.cpp
index dc96d97c852c50513c1cd1b1190d508e5f5571b9..ad40628486f35bad5fe72920d754b76557b681f5 100644
--- a/src/boards/Groundstation/Automated/SMA/SMA.cpp
+++ b/src/boards/Groundstation/Automated/SMA/SMA.cpp
@@ -31,8 +31,6 @@
 #include <drivers/timer/TimestampTimer.h>
 #include <sensors/Vectornav/VN300/VN300Data.h>
 
-#include <utils/ModuleManager/ModuleManager.hpp>
-
 #include "SMAData.h"
 
 using namespace Boardcore;
@@ -104,8 +102,7 @@ ActuationStatus SMA::moveStepperDeg(StepperList stepperId, float angle)
     }
     else
     {
-        return ModuleManager::getInstance().get<Actuators>()->moveDeg(stepperId,
-                                                                      angle);
+        return getModule<Actuators>()->moveDeg(stepperId, angle);
     }
 }
 
@@ -118,8 +115,7 @@ ActuationStatus SMA::moveStepperSteps(StepperList stepperId, int16_t steps)
     }
     else
     {
-        return ModuleManager::getInstance().get<Actuators>()->move(stepperId,
-                                                                   steps);
+        return getModule<Actuators>()->move(stepperId, steps);
     }
 }
 
@@ -134,8 +130,7 @@ void SMA::setMultipliers(StepperList axis, float multiplier)
     }
     else
     {
-        ModuleManager::getInstance().get<Actuators>()->setMultipliers(
-            axis, multiplier);
+        getModule<Actuators>()->setMultipliers(axis, multiplier);
     }
 }
 
@@ -162,7 +157,7 @@ void SMA::update()
             VN300Data vn300Data;
             GPSData antennaPosition;
 
-            auto* sensors = ModuleManager::getInstance().get<Sensors>();
+            auto* sensors = getModule<Sensors>();
 
             vn300Data = sensors->getVN300LastSample();
             if (vn300Data.fix_gps != 0)
@@ -196,8 +191,7 @@ void SMA::update()
         {
             GPSData rocketCoordinates;
 
-            Hub* hub =
-                static_cast<Hub*>(ModuleManager::getInstance().get<HubBase>());
+            Hub* hub = static_cast<Hub*>(getModule<Groundstation::HubBase>());
 
             rocketCoordinates = hub->getRocketCoordinates();
             if (rocketCoordinates.fix != 0)
@@ -219,8 +213,7 @@ void SMA::update()
         case SMAState::ACTIVE:
         {
             // retrieve the last NAS Rocket state
-            Hub* hub =
-                static_cast<Hub*>(ModuleManager::getInstance().get<HubBase>());
+            Hub* hub = static_cast<Hub*>(getModule<HubBase>());
             if (hub->hasNasSet())
             {
                 NASState nasState = hub->getRocketNasState();
@@ -234,9 +227,7 @@ void SMA::update()
 
             // update the follower with the propagated state
             follower.setLastRocketNasState(predicted.getNasState());
-            VN300Data vn300Data = ModuleManager::getInstance()
-                                      .get<Sensors>()
-                                      ->getVN300LastSample();
+            VN300Data vn300Data = getModule<Sensors>()->getVN300LastSample();
             follower.setLastAntennaAttitude(vn300Data);
             follower.update();  // step the follower
             FollowerState follow = follower.getState();
@@ -248,7 +239,7 @@ void SMA::update()
                 static_cast<Boardcore::AntennaAngles>(target));
 
             // actuate the steppers
-            auto steppers = ModuleManager::getInstance().get<Actuators>();
+            auto steppers = getModule<Actuators>();
             steppers->setSpeed(StepperList::STEPPER_X, follow.horizontalSpeed);
             steppers->setSpeed(StepperList::STEPPER_Y, follow.verticalSpeed);
 
@@ -280,8 +271,7 @@ void SMA::update()
             VN300Data fakeAttitudeData;
 
             // retrieve the last NAS Rocket state
-            Hub* hub =
-                static_cast<Hub*>(ModuleManager::getInstance().get<HubBase>());
+            Hub* hub = static_cast<Hub*>(getModule<HubBase>());
             if (hub->hasNasSet())
             {
                 NASState nasState = hub->getRocketNasState();
@@ -293,7 +283,7 @@ void SMA::update()
             propagator.update();  // step the propagator
             PropagatorState predicted = propagator.getState();
 
-            auto steppers = ModuleManager::getInstance().get<Actuators>();
+            auto steppers = getModule<Actuators>();
 
             // set the attitude as the current position of the steppers
             // FIXME this method of setting the attitude is too dirty
@@ -391,13 +381,13 @@ State SMA::state_feedback(const Event& event)
         case EV_ENTRY:
         {
             logStatus(SMAState::FEEDBACK);
-            ModuleManager::getInstance().get<Leds>()->setOn(LedColor::YELLOW);
+            getModule<Leds>()->setOn(LedColor::YELLOW);
             return HANDLED;
         }
         case EV_EXIT:
         {
-            ModuleManager::getInstance().get<Actuators>()->disarm();
-            ModuleManager::getInstance().get<Leds>()->setOff(LedColor::YELLOW);
+            getModule<Actuators>()->disarm();
+            getModule<Leds>()->setOff(LedColor::YELLOW);
             return HANDLED;
         }
         case EV_EMPTY:
@@ -427,13 +417,13 @@ State SMA::state_no_feedback(const Event& event)
         case EV_ENTRY:
         {
             logStatus(SMAState::NO_FEEDBACK);
-            ModuleManager::getInstance().get<Leds>()->setOn(LedColor::YELLOW);
+            getModule<Leds>()->setOn(LedColor::YELLOW);
             return HANDLED;
         }
         case EV_EXIT:
         {
-            ModuleManager::getInstance().get<Actuators>()->disarm();
-            ModuleManager::getInstance().get<Leds>()->setOff(LedColor::YELLOW);
+            getModule<Actuators>()->disarm();
+            getModule<Leds>()->setOff(LedColor::YELLOW);
             return HANDLED;
         }
         case EV_EMPTY:
@@ -499,10 +489,9 @@ State SMA::state_init_error(const Event& event)
         {
             logStatus(SMAState::INIT_ERROR);
             if (fatalInit)
-                ModuleManager::getInstance().get<Leds>()->setFastBlink(
-                    LedColor::RED);
+                getModule<Leds>()->setFastBlink(LedColor::RED);
             else
-                ModuleManager::getInstance().get<Leds>()->setOn(LedColor::RED);
+                getModule<Leds>()->setOn(LedColor::RED);
             return HANDLED;
         }
         case EV_EXIT:
@@ -539,10 +528,9 @@ State SMA::state_init_done(const Event& event)
         case EV_ENTRY:
         {
             logStatus(SMAState::INIT_DONE);
-            ModuleManager::getInstance().get<Leds>()->setOff(LedColor::RED);
-            ModuleManager::getInstance().get<Leds>()->setOff(LedColor::BLUE);
-            ModuleManager::getInstance().get<Leds>()->setSlowBlink(
-                LedColor::YELLOW);
+            getModule<Leds>()->setOff(LedColor::RED);
+            getModule<Leds>()->setOff(LedColor::BLUE);
+            getModule<Leds>()->setSlowBlink(LedColor::YELLOW);
             return HANDLED;
         }
         case EV_EXIT:
@@ -579,8 +567,8 @@ State SMA::state_insert_info(const Event& event)
         case EV_ENTRY:
         {
             logStatus(SMAState::INSERT_INFO);
-            ModuleManager::getInstance().get<Leds>()->setOff(LedColor::YELLOW);
-            ModuleManager::getInstance().get<Leds>()->setOn(LedColor::RED);
+            getModule<Leds>()->setOff(LedColor::YELLOW);
+            getModule<Leds>()->setOn(LedColor::RED);
             return HANDLED;
         }
         case EV_EXIT:
@@ -613,10 +601,9 @@ State SMA::state_arm_ready(const Event& event)
         case EV_ENTRY:
         {
             logStatus(SMAState::ARM_READY);
-            ModuleManager::getInstance().get<Leds>()->setOff(LedColor::BLUE);
-            ModuleManager::getInstance().get<Leds>()->setOn(LedColor::RED);
-            ModuleManager::getInstance().get<Leds>()->setSlowBlink(
-                LedColor::YELLOW);
+            getModule<Leds>()->setOff(LedColor::BLUE);
+            getModule<Leds>()->setOn(LedColor::RED);
+            getModule<Leds>()->setSlowBlink(LedColor::YELLOW);
             return HANDLED;
         }
         case EV_EXIT:
@@ -649,9 +636,9 @@ State SMA::state_armed(const Event& event)
         case EV_ENTRY:
         {
             logStatus(SMAState::ARMED);
-            ModuleManager::getInstance().get<Actuators>()->arm();
-            ModuleManager::getInstance().get<Leds>()->setOn(LedColor::YELLOW);
-            ModuleManager::getInstance().get<Leds>()->setOff(LedColor::BLUE);
+            getModule<Actuators>()->arm();
+            getModule<Leds>()->setOn(LedColor::YELLOW);
+            getModule<Leds>()->setOff(LedColor::BLUE);
             return HANDLED;
         }
         case EV_EXIT:
@@ -756,8 +743,7 @@ State SMA::state_fix_antennas(const Event& event)
         case EV_ENTRY:
         {
             logStatus(SMAState::FIX_ANTENNAS);
-            ModuleManager::getInstance().get<Leds>()->setSlowBlink(
-                LedColor::BLUE);
+            getModule<Leds>()->setSlowBlink(LedColor::BLUE);
             return HANDLED;
         }
         case EV_EXIT:
@@ -794,13 +780,12 @@ State SMA::state_fix_rocket(const Event& event)
         case EV_ENTRY:
         {
             logStatus(SMAState::FIX_ROCKET);
-            ModuleManager::getInstance().get<Leds>()->setFastBlink(
-                LedColor::BLUE);
+            getModule<Leds>()->setFastBlink(LedColor::BLUE);
             return HANDLED;
         }
         case EV_EXIT:
         {
-            auto* leds = ModuleManager::getInstance().get<Leds>();
+            auto* leds = getModule<Leds>();
             leds->setOff(LedColor::YELLOW);
 
             // init the follower before leaving the state
@@ -845,7 +830,7 @@ State SMA::state_active(const Event& event)
             logStatus(SMAState::ACTIVE);
             follower.begin();
             propagator.begin();
-            ModuleManager::getInstance().get<Leds>()->setOn(LedColor::BLUE);
+            getModule<Leds>()->setOn(LedColor::BLUE);
             return HANDLED;
         }
         case EV_EXIT:
@@ -880,10 +865,10 @@ State SMA::state_armed_nf(const Event& event)
         case EV_ENTRY:
         {
             logStatus(SMAState::ARMED_NF);
-            ModuleManager::getInstance().get<Actuators>()->arm();
-            ModuleManager::getInstance().get<Leds>()->setOff(LedColor::BLUE);
-            ModuleManager::getInstance().get<Leds>()->setOn(LedColor::YELLOW);
-            ModuleManager::getInstance().get<Leds>()->setOn(LedColor::RED);
+            getModule<Actuators>()->arm();
+            getModule<Leds>()->setOff(LedColor::BLUE);
+            getModule<Leds>()->setOn(LedColor::YELLOW);
+            getModule<Leds>()->setOn(LedColor::RED);
             return HANDLED;
         }
         case EV_EXIT:
@@ -952,13 +937,12 @@ State SMA::state_fix_rocket_nf(const Event& event)
         case EV_ENTRY:
         {
             logStatus(SMAState::FIX_ROCKET_NF);
-            ModuleManager::getInstance().get<Leds>()->setFastBlink(
-                LedColor::BLUE);
+            getModule<Leds>()->setFastBlink(LedColor::BLUE);
             return HANDLED;
         }
         case EV_EXIT:
         {
-            auto* leds = ModuleManager::getInstance().get<Leds>();
+            auto* leds = getModule<Leds>();
             leds->setOff(LedColor::YELLOW);
 
             // init the follower before leaving the state
@@ -1003,8 +987,8 @@ State SMA::state_active_nf(const Event& event)
             logStatus(SMAState::ACTIVE_NF);
             follower.begin();
             propagator.begin();
-            ModuleManager::getInstance().get<Leds>()->setOn(LedColor::BLUE);
-            ModuleManager::getInstance().get<Leds>()->setOn(LedColor::RED);
+            getModule<Leds>()->setOn(LedColor::BLUE);
+            getModule<Leds>()->setOn(LedColor::RED);
             return HANDLED;
         }
         case EV_EXIT:
diff --git a/src/boards/Groundstation/Automated/SMA/SMA.h b/src/boards/Groundstation/Automated/SMA/SMA.h
index 0a468df20a91d579cce25e2b52eb0a4f55085bf8..e460036e8d25928d796d197da8d3e5321a4b3029 100644
--- a/src/boards/Groundstation/Automated/SMA/SMA.h
+++ b/src/boards/Groundstation/Automated/SMA/SMA.h
@@ -23,6 +23,9 @@
 #pragma once
 
 #include <Groundstation/Automated/Actuators/Actuators.h>
+#include <Groundstation/Automated/Leds/Leds.h>
+#include <Groundstation/Automated/Sensors/Sensors.h>
+#include <Groundstation/Common/HubBase.h>
 #include <algorithms/Follower/Follower.h>
 #include <algorithms/NAS/NASState.h>
 #include <algorithms/Propagator/Propagator.h>
@@ -30,8 +33,7 @@
 #include <events/HSM.h>
 #include <scheduler/TaskScheduler.h>
 #include <sensors/SensorData.h>
-
-#include <utils/ModuleManager/ModuleManager.hpp>
+#include <utils/DependencyManager/DependencyManager.h>
 
 #include "SMAData.h"
 
@@ -42,7 +44,9 @@ namespace Antennas
  * @brief SMA - State Machine for Arp is the state machine which
  * controls the Autonomous Rocket Pointer system.
  */
-class SMA : public Boardcore::Module, public Boardcore::HSM<SMA>
+class SMA : public Boardcore::InjectableWithDeps<Actuators, Sensors,
+                                                 Groundstation::HubBase, Leds>,
+            public Boardcore::HSM<SMA>
 {
 public:
     explicit SMA(Boardcore::TaskScheduler* scheduler);
diff --git a/src/boards/Groundstation/Automated/Sensors/Sensors.cpp b/src/boards/Groundstation/Automated/Sensors/Sensors.cpp
index 8b1209533d4bc3159c8264de9b772e9f08c44031..35af6ce8a41f27e3afd5758706ad2cc66942e8e7 100644
--- a/src/boards/Groundstation/Automated/Sensors/Sensors.cpp
+++ b/src/boards/Groundstation/Automated/Sensors/Sensors.cpp
@@ -22,8 +22,6 @@
 
 #include "Sensors.h"
 
-#include <utils/ModuleManager/ModuleManager.hpp>
-
 using namespace std;
 using namespace miosix;
 using namespace Boardcore;
@@ -54,7 +52,7 @@ bool Sensors::start()
 bool Sensors::vn300Init()
 {
     vn300 = new Boardcore::VN300(
-        ModuleManager::getInstance().get<LyraGS::Buses>()->usart2, 115200,
+        getModule<LyraGS::Buses>()->usart2, 115200,
         VN300Defs::SampleOptions::ARP,
         VNCommonSerial::CRCOptions::CRC_ENABLE_16);  ///< TODO: see that CRC
                                                      ///< behaves correctly
diff --git a/src/boards/Groundstation/Automated/Sensors/Sensors.h b/src/boards/Groundstation/Automated/Sensors/Sensors.h
index f2e399a9f0cd6ec22c51065c48efbd97d320353a..a293f0a2f60bf3a0f2e2f955973f7129b0006836 100644
--- a/src/boards/Groundstation/Automated/Sensors/Sensors.h
+++ b/src/boards/Groundstation/Automated/Sensors/Sensors.h
@@ -21,7 +21,7 @@
  */
 #pragma once
 
-#include <utils/ModuleManager/ModuleManager.hpp>
+#include <utils/DependencyManager/DependencyManager.h>
 
 #include "Groundstation/LyraGS/Buses.h"
 #include "sensors/SensorManager.h"
@@ -29,7 +29,7 @@
 
 namespace Antennas
 {
-class Sensors : public Boardcore::Module
+class Sensors : public Boardcore::InjectableWithDeps<LyraGS::Buses>
 {
 public:
     Sensors();
diff --git a/src/boards/Groundstation/Common/HubBase.h b/src/boards/Groundstation/Common/HubBase.h
index 78b4143f4fe7af093065a4969f07e612627431d4..ea981ffcd933ea1967df82dd58f12f0cb7096427 100644
--- a/src/boards/Groundstation/Common/HubBase.h
+++ b/src/boards/Groundstation/Common/HubBase.h
@@ -23,8 +23,7 @@
 #pragma once
 
 #include <common/Mavlink.h>
-
-#include <utils/ModuleManager/ModuleManager.hpp>
+#include <utils/DependencyManager/DependencyManager.h>
 
 namespace Groundstation
 {
@@ -32,7 +31,7 @@ namespace Groundstation
 /**
  * @brief Central hub connecting all outgoing and ingoing modules.
  */
-class HubBase : public Boardcore::Module
+class HubBase : public Boardcore::Injectable
 {
 public:
     /**
diff --git a/src/boards/Groundstation/Common/Ports/EthernetBase.cpp b/src/boards/Groundstation/Common/Ports/EthernetBase.cpp
index 2cd5d4c8092ccd6eba128fc21b0865dec54f2adf..2a07d43310fd5c75e95ba7a715f0997def1e5e23 100644
--- a/src/boards/Groundstation/Common/Ports/EthernetBase.cpp
+++ b/src/boards/Groundstation/Common/Ports/EthernetBase.cpp
@@ -120,7 +120,7 @@ bool EthernetBase::start(std::unique_ptr<Boardcore::Wiz5500> wiz5500)
 void EthernetBase::handleMsg(const mavlink_message_t& msg)
 {
     // Dispatch the message through the hub.
-    ModuleManager::getInstance().get<HubBase>()->dispatchOutgoingMsg(msg);
+    getModule<HubBase>()->dispatchOutgoingMsg(msg);
 }
 
 ssize_t EthernetBase::receive(uint8_t* pkt, size_t max_len)
diff --git a/src/boards/Groundstation/Common/Ports/EthernetBase.h b/src/boards/Groundstation/Common/Ports/EthernetBase.h
index 899234879515020ab0cd86861bf56b46c5b1cbc8..c370ae3d0070ec997d50240b830ac1fea0840e48 100644
--- a/src/boards/Groundstation/Common/Ports/EthernetBase.h
+++ b/src/boards/Groundstation/Common/Ports/EthernetBase.h
@@ -23,9 +23,11 @@
 #pragma once
 
 #include <ActiveObject.h>
+#include <Groundstation/Common/HubBase.h>
 #include <common/Mavlink.h>
 #include <drivers/WIZ5500/WIZ5500.h>
 #include <radio/MavlinkDriver/MavlinkDriver.h>
+#include <utils/DependencyManager/DependencyManager.h>
 
 #include <memory>
 
@@ -38,7 +40,8 @@ Boardcore::WizMac genNewRandomMac();
 using EthernetMavDriver =
     Boardcore::MavlinkDriver<1024, 10, MAVLINK_MAX_DIALECT_PAYLOAD_SIZE>;
 
-class EthernetBase : public Boardcore::Transceiver
+class EthernetBase : public Boardcore::Transceiver,
+                     public Boardcore::InjectableWithDeps<HubBase>
 {
 public:
     EthernetBase(){};
diff --git a/src/boards/Groundstation/Common/Ports/Serial.cpp b/src/boards/Groundstation/Common/Ports/Serial.cpp
index 45f4b7712016451e394c9ce4284e5bcb8c6fb4ce..a8716aaeba18190e5825aa57c8cd82f58f6c8b08 100644
--- a/src/boards/Groundstation/Common/Ports/Serial.cpp
+++ b/src/boards/Groundstation/Common/Ports/Serial.cpp
@@ -22,9 +22,6 @@
 
 #include "Serial.h"
 
-#include <Groundstation/Common/HubBase.h>
-#include <filesystem/console/console_device.h>
-
 using namespace miosix;
 using namespace Groundstation;
 using namespace Boardcore;
@@ -55,7 +52,7 @@ void Serial::sendMsg(const mavlink_message_t& msg)
 void Serial::handleMsg(const mavlink_message_t& msg)
 {
     // Dispatch the message through the hub.
-    ModuleManager::getInstance().get<HubBase>()->dispatchOutgoingMsg(msg);
+    getModule<HubBase>()->dispatchOutgoingMsg(msg);
 }
 
 ssize_t Serial::receive(uint8_t* pkt, size_t max_len)
diff --git a/src/boards/Groundstation/Common/Ports/Serial.h b/src/boards/Groundstation/Common/Ports/Serial.h
index ea39b639428dd17b623c6e0899ac2cd6c5e7e630..199bc1ba40d8612d7cc8d7922799ad36ffa73f21 100644
--- a/src/boards/Groundstation/Common/Ports/Serial.h
+++ b/src/boards/Groundstation/Common/Ports/Serial.h
@@ -23,11 +23,13 @@
 #pragma once
 
 #include <ActiveObject.h>
+#include <Groundstation/Common/HubBase.h>
 #include <common/Mavlink.h>
+#include <filesystem/console/console_device.h>
 #include <radio/MavlinkDriver/MavlinkDriver.h>
+#include <utils/DependencyManager/DependencyManager.h>
 
 #include <memory>
-#include <utils/ModuleManager/ModuleManager.hpp>
 
 namespace Groundstation
 {
@@ -38,7 +40,8 @@ using SerialMavDriver =
 /**
  * @brief Class responsible for UART communication.
  */
-class Serial : public Boardcore::Module, public Boardcore::Transceiver
+class Serial : public Boardcore::InjectableWithDeps<HubBase>,
+               public Boardcore::Transceiver
 {
 public:
     Serial() {}
diff --git a/src/boards/Groundstation/Common/Radio/RadioBase.cpp b/src/boards/Groundstation/Common/Radio/RadioBase.cpp
index b30f5a03bd0821a43d1d6b7f9c367826cca1c53f..e6931d701754e2537ee12813bacd1baf4fea17ae 100644
--- a/src/boards/Groundstation/Common/Radio/RadioBase.cpp
+++ b/src/boards/Groundstation/Common/Radio/RadioBase.cpp
@@ -141,7 +141,7 @@ bool RadioBase::send(uint8_t* pkt, size_t len)
 void RadioBase::handleMsg(const mavlink_message_t& msg)
 {
     // Dispatch the message through the hub.
-    ModuleManager::getInstance().get<HubBase>()->dispatchIncomingMsg(msg);
+    getModule<HubBase>()->dispatchIncomingMsg(msg);
 
     if (isEndOfTransmissionPacket(msg))
     {
diff --git a/src/boards/Groundstation/Common/Radio/RadioBase.h b/src/boards/Groundstation/Common/Radio/RadioBase.h
index 3067912106fb345926e74fc8c63039ae43592115..fc8bf2d332b10587e4fe854a21f6bb0d8c79bc3f 100644
--- a/src/boards/Groundstation/Common/Radio/RadioBase.h
+++ b/src/boards/Groundstation/Common/Radio/RadioBase.h
@@ -24,13 +24,14 @@
 
 #include <ActiveObject.h>
 #include <Groundstation/Common/Config/RadioConfig.h>
+#include <Groundstation/Common/HubBase.h>
 #include <common/Mavlink.h>
 #include <common/Radio.h>
 #include <radio/MavlinkDriver/MavlinkDriver.h>
 #include <radio/SX1278/SX1278Fsk.h>
+#include <utils/DependencyManager/DependencyManager.h>
 
 #include <memory>
-#include <utils/ModuleManager/ModuleManager.hpp>
 
 namespace Groundstation
 {
@@ -58,7 +59,9 @@ struct RadioStats
  * @brief Base radio class, used to implement functionality independent of
  * main/payload radios.
  */
-class RadioBase : private Boardcore::ActiveObject, public Boardcore::Transceiver
+class RadioBase : private Boardcore::ActiveObject,
+                  public Boardcore::Transceiver,
+                  public Boardcore::InjectableWithDeps<HubBase>
 {
 public:
     RadioBase() {}
diff --git a/src/boards/Groundstation/LyraGS/Base/Hub.cpp b/src/boards/Groundstation/LyraGS/Base/Hub.cpp
index 38fdaa65e181769bbe9d702ae65306df3aa4a3ed..79f437896f134ad48125bef3b16f6e78ad60f424 100644
--- a/src/boards/Groundstation/LyraGS/Base/Hub.cpp
+++ b/src/boards/Groundstation/LyraGS/Base/Hub.cpp
@@ -26,30 +26,27 @@
 #include <Groundstation/Common/Ports/Serial.h>
 #include <Groundstation/LyraGS/BoardStatus.h>
 #include <Groundstation/LyraGS/Ports/Ethernet.h>
-#include <Groundstation/LyraGS/Radio/Radio.h>
 
 using namespace Groundstation;
 using namespace GroundstationBase;
 using namespace Boardcore;
+using namespace LyraGS;
 
 void Hub::dispatchOutgoingMsg(const mavlink_message_t& msg)
 {
-    LyraGS::BoardStatus* status =
-        ModuleManager::getInstance().get<LyraGS::BoardStatus>();
+    LyraGS::BoardStatus* status = getModule<LyraGS::BoardStatus>();
 
     bool send_ok = false;
 
     if (status->isMainRadioPresent() && msg.sysid == MAV_SYSID_MAIN)
     {
-        LyraGS::RadioMain* radio =
-            ModuleManager::getInstance().get<LyraGS::RadioMain>();
+        LyraGS::RadioMain* radio = getModule<LyraGS::RadioMain>();
         send_ok |= radio->sendMsg(msg);
     }
 
     if (status->isPayloadRadioPresent() && msg.sysid == MAV_SYSID_PAYLOAD)
     {
-        LyraGS::RadioPayload* radio =
-            ModuleManager::getInstance().get<LyraGS::RadioPayload>();
+        LyraGS::RadioPayload* radio = getModule<LyraGS::RadioPayload>();
         send_ok |= radio->sendMsg(msg);
     }
 
@@ -64,16 +61,14 @@ void Hub::dispatchOutgoingMsg(const mavlink_message_t& msg)
 
 void Hub::dispatchIncomingMsg(const mavlink_message_t& msg)
 {
-    LyraGS::BoardStatus* status =
-        ModuleManager::getInstance().get<LyraGS::BoardStatus>();
+    LyraGS::BoardStatus* status = getModule<LyraGS::BoardStatus>();
 
-    Serial* serial = ModuleManager::getInstance().get<Serial>();
+    Serial* serial = getModule<Serial>();
     serial->sendMsg(msg);
 
     if (status->isEthernetPresent())
     {
-        LyraGS::Ethernet* ethernet =
-            ModuleManager::getInstance().get<LyraGS::Ethernet>();
+        LyraGS::EthernetGS* ethernet = getModule<LyraGS::EthernetGS>();
         ethernet->sendMsg(msg);
     }
 }
\ No newline at end of file
diff --git a/src/boards/Groundstation/LyraGS/Base/Hub.h b/src/boards/Groundstation/LyraGS/Base/Hub.h
index 0e8e8335526abbe3456f6f99eac9c8a9c31a3d11..00855c32cfb04b5e49c0b1b9341eea2c9ae51c0d 100644
--- a/src/boards/Groundstation/LyraGS/Base/Hub.h
+++ b/src/boards/Groundstation/LyraGS/Base/Hub.h
@@ -23,17 +23,20 @@
 #pragma once
 
 #include <Groundstation/Common/HubBase.h>
+#include <Groundstation/Common/Ports/Serial.h>
+#include <Groundstation/LyraGS/Ports/Ethernet.h>
 #include <common/Mavlink.h>
-
-#include <utils/ModuleManager/ModuleManager.hpp>
+#include <utils/DependencyManager/DependencyManager.h>
 
 namespace GroundstationBase
 {
-
 /**
  * @brief Central hub connecting all outgoing and ingoing modules.
  */
-class Hub : public Groundstation::HubBase
+class Hub : public Boardcore::InjectableWithDeps<
+                Boardcore::InjectableBase<Groundstation::HubBase>,
+                LyraGS::BoardStatus, LyraGS::RadioMain, LyraGS::RadioPayload,
+                Groundstation::Serial, LyraGS::EthernetGS>
 {
 public:
     /**
diff --git a/src/boards/Groundstation/LyraGS/BoardStatus.cpp b/src/boards/Groundstation/LyraGS/BoardStatus.cpp
index ab709195d483197e60ef23ef3ebd655d52e68e12..b65ce88af2beed8715fa5a217070f6e66152db20 100644
--- a/src/boards/Groundstation/LyraGS/BoardStatus.cpp
+++ b/src/boards/Groundstation/LyraGS/BoardStatus.cpp
@@ -22,16 +22,6 @@
 
 #include "BoardStatus.h"
 
-#include <Groundstation/Automated/Actuators/Actuators.h>
-#include <Groundstation/Automated/SMA/SMA.h>
-#include <Groundstation/Automated/Sensors/Sensors.h>
-#include <Groundstation/Common/Config/GeneralConfig.h>
-#include <Groundstation/Common/HubBase.h>
-#include <Groundstation/LyraGS/Ports/Ethernet.h>
-#include <Groundstation/LyraGS/Radio/Radio.h>
-#include <common/Mavlink.h>
-#include <drivers/timer/TimestampTimer.h>
-
 using namespace Boardcore;
 using namespace Groundstation;
 using namespace LyraGS;
@@ -70,12 +60,11 @@ void BoardStatus::arpRoutine()
     using namespace Antennas;
 
     miosix::Thread::sleep(Groundstation::RADIO_STATUS_PERIOD);
-    ModuleManager &modules = ModuleManager::getInstance();
 
-    auto vn300 = modules.get<Sensors>()->getVN300LastSample();
+    auto vn300 = getModule<Sensors>()->getVN300LastSample();
 
-    Actuators *actuators = modules.get<Actuators>();
-    SMA *sm              = modules.get<SMA>();
+    Actuators *actuators = getModule<Actuators>();
+    SMA *sm              = getModule<SMA>();
 
     AntennaAngles targetAngles = sm->getTargetAngles();
 
@@ -112,7 +101,7 @@ void BoardStatus::arpRoutine()
     {
         tm.main_radio_present = 1;
 
-        auto stats = ModuleManager::getInstance().get<RadioMain>()->getStats();
+        auto stats                    = getModule<RadioMain>()->getStats();
         tm.main_packet_tx_error_count = stats.send_errors;
         tm.main_tx_bitrate = main_tx_bitrate.update(stats.bits_tx_count);
         tm.main_packet_rx_success_count = stats.packet_rx_success_count;
@@ -125,7 +114,7 @@ void BoardStatus::arpRoutine()
 
     if (ethernet_present)
     {
-        auto stats = ModuleManager::getInstance().get<Ethernet>()->getState();
+        auto stats = getModule<EthernetGS>()->getState();
 
         tm.ethernet_present = 1;
         tm.ethernet_status  = (stats.link_up ? 1 : 0) |
@@ -137,7 +126,7 @@ void BoardStatus::arpRoutine()
     mavlink_msg_arp_tm_encode(SysIDs::MAV_SYSID_ARP,
                               Groundstation::GS_COMPONENT_ID, &msg, &tm);
 
-    ModuleManager::getInstance().get<HubBase>()->dispatchIncomingMsg(msg);
+    getModule<HubBase>()->dispatchIncomingMsg(msg);
 }
 
 void BoardStatus::GSRoutine()
@@ -154,7 +143,7 @@ void BoardStatus::GSRoutine()
     {
         tm.main_radio_present = 1;
 
-        auto stats = ModuleManager::getInstance().get<RadioMain>()->getStats();
+        auto stats                    = getModule<RadioMain>()->getStats();
         tm.main_packet_tx_error_count = stats.send_errors;
         tm.main_tx_bitrate = main_tx_bitrate.update(stats.bits_tx_count);
         tm.main_packet_rx_success_count = stats.packet_rx_success_count;
@@ -169,8 +158,7 @@ void BoardStatus::GSRoutine()
     {
         tm.payload_radio_present = 1;
 
-        auto stats =
-            ModuleManager::getInstance().get<RadioPayload>()->getStats();
+        auto stats = getModule<RadioPayload>()->getStats();
         tm.payload_packet_tx_error_count = stats.send_errors;
         tm.payload_tx_bitrate = payload_tx_bitrate.update(stats.bits_tx_count);
         tm.payload_packet_rx_success_count = stats.packet_rx_success_count;
@@ -183,7 +171,8 @@ void BoardStatus::GSRoutine()
 
     if (ethernet_present)
     {
-        auto stats = ModuleManager::getInstance().get<Ethernet>()->getState();
+        auto ethernet = getModule<EthernetGS>();
+        auto stats    = ethernet->getState();
 
         tm.ethernet_present = 1;
         tm.ethernet_status  = (stats.link_up ? 1 : 0) |
@@ -194,7 +183,7 @@ void BoardStatus::GSRoutine()
     mavlink_message_t msg;
     mavlink_msg_arp_tm_encode(GS_SYSTEM_ID, GS_COMPONENT_ID, &msg, &tm);
 
-    ModuleManager::getInstance().get<HubBase>()->dispatchIncomingMsg(msg);
+    getModule<HubBase>()->dispatchIncomingMsg(msg);
 }
 
 void BoardStatus::run()
diff --git a/src/boards/Groundstation/LyraGS/BoardStatus.h b/src/boards/Groundstation/LyraGS/BoardStatus.h
index 10a14c4bf845c2d412812b0210ebf3dd99999083..0396a2b077d47ee4e2d22db0f24ce9e21f03e119 100644
--- a/src/boards/Groundstation/LyraGS/BoardStatus.h
+++ b/src/boards/Groundstation/LyraGS/BoardStatus.h
@@ -23,14 +23,25 @@
 #pragma once
 
 #include <ActiveObject.h>
+#include <Groundstation/Automated/Actuators/Actuators.h>
+#include <Groundstation/Automated/SMA/SMA.h>
+#include <Groundstation/Automated/Sensors/Sensors.h>
+#include <Groundstation/Common/Config/GeneralConfig.h>
 #include <Groundstation/Common/Config/RadioConfig.h>
+#include <Groundstation/Common/HubBase.h>
 #include <Groundstation/Common/Radio/RadioBase.h>
+#include <Groundstation/LyraGS/Ports/Ethernet.h>
+#include <Groundstation/LyraGS/Radio/Radio.h>
+#include <common/Mavlink.h>
+#include <drivers/timer/TimestampTimer.h>
+#include <utils/DependencyManager/DependencyManager.h>
 #include <utils/collections/CircularBuffer.h>
 
-#include <utils/ModuleManager/ModuleManager.hpp>
-
 namespace LyraGS
 {
+class RadioMain;
+class RadioPayload;
+class EthernetGS;
 
 /**
  * @brief Utility to calculate the bitrate
@@ -70,7 +81,11 @@ private:
 /**
  * @brief Class responsible for keeping track of radio status and metrics.
  */
-class BoardStatus : public Boardcore::Module, private Boardcore::ActiveObject
+class BoardStatus
+    : public Boardcore::InjectableWithDeps<
+          Antennas::Actuators, Antennas::SMA, Antennas::Sensors,
+          Groundstation::HubBase, RadioMain, RadioPayload, EthernetGS>,
+      private Boardcore::ActiveObject
 {
 public:
     explicit BoardStatus(bool isArp) : isArp{isArp} {}
@@ -88,7 +103,7 @@ public:
     bool isPayloadRadioPresent();
 
     /**
-     * @brief Check wether the ethernet was found during boot.
+     * @brief Check wether the ethernet was found d\uring boot.
      */
     bool isEthernetPresent();
 
diff --git a/src/boards/Groundstation/LyraGS/Buses.h b/src/boards/Groundstation/LyraGS/Buses.h
index ead43b9b116f86bb476c1eda5c5a2a4d5a45af41..1faf0f84611b36b9e182c38852a26a1cb4a05c33 100644
--- a/src/boards/Groundstation/LyraGS/Buses.h
+++ b/src/boards/Groundstation/LyraGS/Buses.h
@@ -24,29 +24,23 @@
 
 #include <drivers/spi/SPIBus.h>
 #include <drivers/usart/USART.h>
-
-#include <utils/ModuleManager/ModuleManager.hpp>
+#include <utils/DependencyManager/DependencyManager.h>
 
 #include "interfaces-impl/hwmapping.h"
 
 namespace LyraGS
 {
 
-class Buses : public Boardcore::Module
+class Buses : public Boardcore::Injectable
 {
 public:
-    Boardcore::SPIBus radio1_bus;
-    Boardcore::SPIBus radio2_bus;
-    Boardcore::USART usart2;
-    Boardcore::USART uart4;
-    Boardcore::SPIBus ethernet_bus;
+    Boardcore::SPIBus &getRadio() { return radio1_bus; }
 
-    Buses()
-        : radio1_bus{MIOSIX_RADIO1_SPI}, radio2_bus{MIOSIX_RADIO2_SPI},
-          usart2{USART2, 115200}, uart4{UART4, 115200}, ethernet_bus{
-                                                            MIOSIX_ETHERNET_SPI}
-    {
-    }
+    Boardcore::SPIBus radio1_bus{MIOSIX_RADIO1_SPI};
+    Boardcore::SPIBus radio2_bus{MIOSIX_RADIO2_SPI};
+    Boardcore::USART usart2{USART2, 115200};
+    Boardcore::USART uart4{UART4, 115200};
+    Boardcore::SPIBus ethernet_bus{MIOSIX_ETHERNET_SPI};
 };
 
 }  // namespace LyraGS
\ No newline at end of file
diff --git a/src/boards/Groundstation/LyraGS/Ports/Ethernet.cpp b/src/boards/Groundstation/LyraGS/Ports/Ethernet.cpp
index 72cc4b01d0765031ff8d22743f91d5575a5d3d98..f4223d71deca2c96ffa71999ae01a712f8c430bd 100644
--- a/src/boards/Groundstation/LyraGS/Ports/Ethernet.cpp
+++ b/src/boards/Groundstation/LyraGS/Ports/Ethernet.cpp
@@ -27,21 +27,27 @@
 #include <interfaces-impl/hwmapping.h>
 
 using namespace Boardcore;
+using namespace LyraGS;
+
+namespace LyraGS
+{
+EthernetGS* ethernetGSGlobal = nullptr;
+}
 
 void __attribute__((used)) MIOSIX_ETHERNET_IRQ()
 {
-    ModuleManager::getInstance().get<LyraGS::Ethernet>()->handleINTn();
+    if (ethernetGSGlobal)
+        ethernetGSGlobal->handleINTn();
 }
 
 namespace LyraGS
 {
 
-bool Ethernet::start()
+bool EthernetGS::start()
 {
     std::unique_ptr<Wiz5500> wiz5500 = std::make_unique<Wiz5500>(
-        ModuleManager::getInstance().get<Buses>()->ethernet_bus,
-        miosix::ethernet::cs::getPin(), miosix::ethernet::intr::getPin(),
-        SPI::ClockDivider::DIV_64);
+        getModule<Buses>()->ethernet_bus, miosix::ethernet::cs::getPin(),
+        miosix::ethernet::intr::getPin(), SPI::ClockDivider::DIV_64);
 
     // First check if the device is even connected
     bool present = wiz5500->checkVersion();
@@ -56,8 +62,17 @@ bool Ethernet::start()
         return false;
     }
 
-    ModuleManager::getInstance().get<BoardStatus>()->setEthernetPresent(true);
+    ethernetGSGlobal = this;
+    getModule<BoardStatus>()->setEthernetPresent(true);
 
     return true;
 }
+
+void EthernetGS::sendMsg(const mavlink_message_t& msg) { Super::sendMsg(msg); };
+
+void EthernetGS::handleINTn() { EthernetBase::handleINTn(); }
+Boardcore::Wiz5500::PhyState EthernetGS::getState()
+{
+    return Super::getState();
+};
 }  // namespace LyraGS
\ No newline at end of file
diff --git a/src/boards/Groundstation/LyraGS/Ports/Ethernet.h b/src/boards/Groundstation/LyraGS/Ports/Ethernet.h
index d35d3b4a957054744bcf948fa29348a6ab6b9d9b..fe6913f22d14bbc265c124a9487aba57b2ba9332 100644
--- a/src/boards/Groundstation/LyraGS/Ports/Ethernet.h
+++ b/src/boards/Groundstation/LyraGS/Ports/Ethernet.h
@@ -23,21 +23,24 @@
 #pragma once
 
 #include <Groundstation/Common/Ports/EthernetBase.h>
-
-#include <utils/ModuleManager/ModuleManager.hpp>
+#include <Groundstation/LyraGS/BoardStatus.h>
+#include <utils/DependencyManager/DependencyManager.h>
 
 namespace LyraGS
 {
+class BoardStatus;
 
-class Ethernet : public Groundstation::EthernetBase, public Boardcore::Module
+class EthernetGS : public Boardcore::InjectableWithDeps<
+                       Boardcore::InjectableBase<Groundstation::EthernetBase>,
+                       Buses, BoardStatus>
 {
 public:
-    Ethernet() : EthernetBase(), Module() {}
-    Ethernet(bool randomIp, uint8_t ipOffset)
-        : EthernetBase(randomIp, ipOffset), Module()
-    {
-    }
+    EthernetGS() : Super{} {}
+    EthernetGS(bool randomIp, uint8_t ipOffset) : Super{randomIp, ipOffset} {}
     [[nodiscard]] bool start();
+    void sendMsg(const mavlink_message_t& msg);
+    void handleINTn();
+    Boardcore::Wiz5500::PhyState getState();
 };
 
 }  // namespace LyraGS
\ No newline at end of file
diff --git a/src/boards/Groundstation/LyraGS/Radio/Radio.cpp b/src/boards/Groundstation/LyraGS/Radio/Radio.cpp
index 4780fcab966bd98c726b25206be8694891b9c320..85b4afcaab6c2d2641b37cc5c462deba3f77ab62 100644
--- a/src/boards/Groundstation/LyraGS/Radio/Radio.cpp
+++ b/src/boards/Groundstation/LyraGS/Radio/Radio.cpp
@@ -22,51 +22,54 @@
 
 #include "Radio.h"
 
-#include <Groundstation/Common/HubBase.h>
-#include <Groundstation/Common/Ports/Serial.h>
-#include <Groundstation/LyraGS/BoardStatus.h>
-#include <Groundstation/LyraGS/Buses.h>
-#include <interfaces-impl/hwmapping.h>
-#include <radio/SX1278/SX1278Frontends.h>
-
-using namespace Groundstation;
 using namespace LyraGS;
 using namespace Boardcore;
 using namespace miosix;
 
+SX1278Fsk* radioMainGlobal{nullptr};
+SX1278Fsk* radioPayloadGlobal{nullptr};
+
 void __attribute__((used)) MIOSIX_RADIO1_DIO0_IRQ()
 {
-    ModuleManager::getInstance().get<RadioMain>()->handleDioIRQ();
+    SX1278Fsk* instance = radioMainGlobal;
+    if (instance)
+        instance->handleDioIRQ();
 }
 
 void __attribute__((used)) MIOSIX_RADIO1_DIO1_IRQ()
 {
-    ModuleManager::getInstance().get<RadioMain>()->handleDioIRQ();
+    SX1278Fsk* instance = radioMainGlobal;
+    if (instance)
+        instance->handleDioIRQ();
 }
 
 void __attribute__((used)) MIOSIX_RADIO1_DIO3_IRQ()
 {
-    ModuleManager::getInstance().get<RadioMain>()->handleDioIRQ();
+    SX1278Fsk* instance = radioMainGlobal;
+    if (instance)
+        instance->handleDioIRQ();
 }
 
 void __attribute__((used)) MIOSIX_RADIO2_DIO0_IRQ()
 {
-    ModuleManager::getInstance().get<RadioPayload>()->handleDioIRQ();
+    if (radioPayloadGlobal)
+        radioPayloadGlobal->handleDioIRQ();
 }
 
 void __attribute__((used)) MIOSIX_RADIO2_DIO1_IRQ()
 {
-    ModuleManager::getInstance().get<RadioPayload>()->handleDioIRQ();
+    if (radioPayloadGlobal)
+        radioPayloadGlobal->handleDioIRQ();
 }
 
 void __attribute__((used)) MIOSIX_RADIO2_DIO3_IRQ()
 {
-    ModuleManager::getInstance().get<RadioPayload>()->handleDioIRQ();
+    if (radioPayloadGlobal)
+        radioPayloadGlobal->handleDioIRQ();
 }
 
 bool RadioMain::start()
 {
-
     std::unique_ptr<SX1278::ISX1278Frontend> frontend;
 
     if (hasBackup)
@@ -77,31 +80,30 @@ bool RadioMain::start()
 
     std::unique_ptr<Boardcore::SX1278Fsk> sx1278 =
         std::make_unique<Boardcore::SX1278Fsk>(
-            ModuleManager::getInstance().get<Buses>()->radio1_bus,
-            radio1::cs::getPin(), radio1::dio0::getPin(),
-            radio1::dio1::getPin(), radio1::dio3::getPin(),
-            SPI::ClockDivider::DIV_64, std::move(frontend));
+            getModule<Buses>()->radio1_bus, radio1::cs::getPin(),
+            radio1::dio0::getPin(), radio1::dio1::getPin(),
+            radio1::dio3::getPin(), SPI::ClockDivider::DIV_64,
+            std::move(frontend));
+
+    // Set the global radio for IRQ
+    radioMainGlobal = sx1278.get();
 
     // First check if the device is even connected
     bool present = sx1278->checkVersion();
 
-    ModuleManager::getInstance().get<BoardStatus>()->setMainRadioPresent(
-        present);
+    getModule<LyraGS::BoardStatus>()->setMainRadioPresent(present);
 
     if (present)
     {
         // Configure the radio
         if (sx1278->configure(Common::MAIN_RADIO_CONFIG) !=
             SX1278Fsk::Error::NONE)
-        {
             return false;
-        }
 
         // Initialize if only if present
         if (!RadioBase::start(std::move(sx1278)))
-        {
+
             return false;
-        }
     }
 
     return true;
@@ -118,15 +120,17 @@ bool RadioPayload::start()
         frontend = std::make_unique<Skyward433Frontend>();
 
     sx1278 = std::make_unique<Boardcore::SX1278Fsk>(
-        ModuleManager::getInstance().get<Buses>()->radio2_bus,
-        radio2::cs::getPin(), radio2::dio0::getPin(), radio2::dio1::getPin(),
-        radio2::dio3::getPin(), SPI::ClockDivider::DIV_64, std::move(frontend));
+        getModule<Buses>()->radio2_bus, radio2::cs::getPin(),
+        radio2::dio0::getPin(), radio2::dio1::getPin(), radio2::dio3::getPin(),
+        SPI::ClockDivider::DIV_64, std::move(frontend));
+
+    // Set the global radio for IRQ
+    radioPayloadGlobal = sx1278.get();
 
     // First check if the device is even connected
     bool present = sx1278->checkVersion();
 
-    ModuleManager::getInstance().get<BoardStatus>()->setPayloadRadioPresent(
-        present);
+    getModule<LyraGS::BoardStatus>()->setPayloadRadioPresent(present);
 
     if (present)
     {
diff --git a/src/boards/Groundstation/LyraGS/Radio/Radio.h b/src/boards/Groundstation/LyraGS/Radio/Radio.h
index 47cefb5690d2c4316dd68e088d9b2750f8bab417..b176e2758a751f70be2f79a24f200ac2d2df2cd7 100644
--- a/src/boards/Groundstation/LyraGS/Radio/Radio.h
+++ b/src/boards/Groundstation/LyraGS/Radio/Radio.h
@@ -22,12 +22,23 @@
 
 #pragma once
 
+#include <Groundstation/Common/HubBase.h>
+#include <Groundstation/Common/Ports/Serial.h>
 #include <Groundstation/Common/Radio/RadioBase.h>
+#include <Groundstation/LyraGS/BoardStatus.h>
+#include <Groundstation/LyraGS/Buses.h>
+#include <interfaces-impl/hwmapping.h>
+#include <radio/SX1278/SX1278Frontends.h>
+#include <utils/DependencyManager/DependencyManager.h>
 
 namespace LyraGS
 {
 
-class RadioMain : public Groundstation::RadioBase, public Boardcore::Module
+class BoardStatus;
+
+class RadioMain : public Boardcore::InjectableWithDeps<
+                      Boardcore::InjectableBase<Groundstation::RadioBase>,
+                      Buses, BoardStatus>
 {
 public:
     [[nodiscard]] bool start();
@@ -39,8 +50,9 @@ public:
 private:
     bool hasBackup = false;
 };
-
-class RadioPayload : public Groundstation::RadioBase, public Boardcore::Module
+class RadioPayload : public Boardcore::InjectableWithDeps<
+                         Boardcore::InjectableBase<Groundstation::RadioBase>,
+                         Buses, BoardStatus>
 {
 public:
     [[nodiscard]] bool start();
diff --git a/src/entrypoints/Groundstation/Automated/test-actuators.cpp b/src/entrypoints/Groundstation/Automated/test-actuators.cpp
index b013b9410fbde35734b37e52b415f4fbdde0d8e1..064b76b6aa4e8f8f15619548cae18fe6b4224a74 100644
--- a/src/entrypoints/Groundstation/Automated/test-actuators.cpp
+++ b/src/entrypoints/Groundstation/Automated/test-actuators.cpp
@@ -199,19 +199,19 @@ int main()
     Actuators *actuators = new Actuators();
     Sensors *sensors     = new Sensors();
 
-    ModuleManager &modules = ModuleManager::getInstance();
-    PrintLogger logger     = PrintLogger{Logging::getLogger("test-actuators")};
-    bool ok                = true;
+    DependencyManager manager;
+    PrintLogger logger = PrintLogger{Logging::getLogger("test-actuators")};
+    bool ok            = true;
 
     LOG_INFO(logger, "test-actuators\n");
 
     // Insert modules
     {
-        ok &= modules.insert<HubBase>(hub);
-        ok &= modules.insert(buses);
-        ok &= modules.insert(serial);
-        ok &= modules.insert(actuators);
-        ok &= modules.insert(sensors);
+        ok &= manager.insert<HubBase>(hub);
+        ok &= manager.insert(buses);
+        ok &= manager.insert(serial);
+        ok &= manager.insert(actuators);
+        ok &= manager.insert(sensors);
 
         // If insertion failed, stop right here
         if (!ok)
@@ -223,6 +223,16 @@ int main()
         {
             LOG_DEBUG(logger, "All modules inserted successfully!\n");
         }
+
+        if (!manager.inject())
+        {
+            LOG_ERR(logger, "[error] Failed to inject the dependencies!\n");
+            errorLoop();
+        }
+        else
+        {
+            LOG_DEBUG(logger, "All modules injected successfully!\n");
+        }
     }
 
     // Start modules
diff --git a/src/entrypoints/Groundstation/lyra-gs-entry.cpp b/src/entrypoints/Groundstation/lyra-gs-entry.cpp
index 2dfeae47d4e6d529dd8040e2fe899cebe48700be..4ac45bb3d66190ecdd01c11ca096f21bc19825c0 100644
--- a/src/entrypoints/Groundstation/lyra-gs-entry.cpp
+++ b/src/entrypoints/Groundstation/lyra-gs-entry.cpp
@@ -38,14 +38,15 @@
 #include <events/EventBroker.h>
 #include <miosix.h>
 #include <scheduler/TaskScheduler.h>
+#include <utils/DependencyManager/DependencyManager.h>
 
 #include <thread>
-#include <utils/ModuleManager/ModuleManager.hpp>
 
 using namespace Boardcore;
 using namespace miosix;
 using namespace Groundstation;
 using namespace LyraGS;
+using namespace Antennas;
 
 /**
  * @brief Dip switch status for the GS board
@@ -126,29 +127,39 @@ int main()
     DipSwitch dip(sh, clk, qh, microSecClk);
     DipStatusLyraGS dipRead = getDipStatus(dip.read());
 
-    // TODO: Pass to DependencyManager when rebased!
-    ModuleManager &modules = ModuleManager::getInstance();
-    PrintLogger logger     = Logging::getLogger("lyra_gs");
+    DependencyManager manager;
+    PrintLogger logger = Logging::getLogger("lyra_gs");
 
     // TODO: Board scheduler for the schedulers
     TaskScheduler *scheduler_low  = new TaskScheduler(0);
     TaskScheduler *scheduler_high = new TaskScheduler();
     Buses *buses                  = new Buses();
     Serial *serial                = new Serial();
-    RadioMain *radio_main       = new LyraGS::RadioMain(dipRead.mainHasBackup);
-    BoardStatus *board_status   = new BoardStatus(dipRead.isARP);
-    LyraGS::Ethernet *ethernet  = new LyraGS::Ethernet(false, dipRead.ipConfig);
-    RadioPayload *radio_payload = new RadioPayload(dipRead.payloadHasBackup);
-    Antennas::Actuators *actuators = nullptr;
+    LyraGS::RadioMain *radio_main =
+        new LyraGS::RadioMain(dipRead.mainHasBackup);
+    LyraGS::BoardStatus *board_status = new LyraGS::BoardStatus(dipRead.isARP);
+    LyraGS::EthernetGS *ethernet =
+        new LyraGS::EthernetGS(false, dipRead.ipConfig);
+    LyraGS::RadioPayload *radio_payload =
+        new LyraGS::RadioPayload(dipRead.payloadHasBackup);
+
+    HubBase *hub = nullptr;
+
+    // ARP-related things
+    Antennas::Actuators *actuators   = nullptr;
+    Antennas::Leds *leds             = nullptr;
+    Antennas::Sensors *sensors       = nullptr;
+    Antennas::SMA *sma               = nullptr;
+    Antennas::PinHandler *pinHandler = nullptr;
 
     bool ok = true;
 
-    ok &= modules.insert(buses);
-    ok &= modules.insert(serial);
-    ok &= modules.insert(radio_main);
-    ok &= modules.insert(ethernet);
-    ok &= modules.insert(radio_payload);
-    ok &= modules.insert(board_status);
+    ok &= manager.insert(buses);
+    ok &= manager.insert(serial);
+    ok &= manager.insert<LyraGS::RadioMain>(radio_main);
+    ok &= manager.insert<LyraGS::EthernetGS>(ethernet);
+    ok &= manager.insert<LyraGS::RadioPayload>(radio_payload);
+    ok &= manager.insert(board_status);
 
     // Inserting Modules
 
@@ -156,30 +167,29 @@ int main()
     if (dipRead.isARP)
     {
         LOG_DEBUG(logger, "[debug] Starting as ARP Ground Station\n");
-        Antennas::Leds *leds             = new Antennas::Leds(scheduler_low);
-        HubBase *hub                     = new Antennas::Hub();
-        actuators                        = new Antennas::Actuators();
-        Antennas::Sensors *sensors       = new Antennas::Sensors();
-        Antennas::SMA *sma               = new Antennas::SMA(scheduler_high);
-        Antennas::PinHandler *pinHandler = new Antennas::PinHandler();
-
-        ok &= modules.insert(sma);
-        ok &= modules.insert<HubBase>(hub);
-        ok &= modules.insert(actuators);
-        ok &= modules.insert(sensors);
-        ok &= modules.insert(leds);
-        ok &= modules.insert(pinHandler);
+        leds       = new Antennas::Leds(scheduler_low);
+        hub        = new Antennas::Hub();
+        actuators  = new Antennas::Actuators();
+        sensors    = new Antennas::Sensors();
+        sma        = new Antennas::SMA(scheduler_high);
+        pinHandler = new Antennas::PinHandler();
+
+        ok &= manager.insert(sma);
+        ok &= manager.insert<HubBase>(hub);
+        ok &= manager.insert(actuators);
+        ok &= manager.insert(sensors);
+        ok &= manager.insert(leds);
+        ok &= manager.insert(pinHandler);
     }
     // Ground station module insertion
     else
     {
         LOG_DEBUG(logger, "[debug] Starting as GS base Ground Station\n");
-        HubBase *hub = new GroundstationBase::Hub();
-        ok &= modules.insert<HubBase>(hub);
+        hub = new GroundstationBase::Hub();
+        ok &= manager.insert<HubBase>(hub);
     }
 
     // If insertion failed, stop right here
-
     if (!ok)
     {
         LOG_ERR(logger, "[error] Failed to insert all modules!\n");
@@ -188,6 +198,15 @@ int main()
 
     LOG_DEBUG(logger, "[debug] All modules inserted correctly!\n");
 
+    if (!manager.inject())
+    {
+        LOG_ERR(logger, "[error] Failed to inject the dependencies!\n");
+        errorLoop();
+    }
+
+    // Print out the graph of dependencies
+    manager.graphviz(std::cout);
+
     // Start the modules
 
     // ARP start errors
@@ -201,12 +220,16 @@ int main()
     }
 #endif
 
+    LOG_DEBUG(logger, "DEBUG: scheduler_low starting...\n");
+
     if (!scheduler_low->start())
     {
         LOG_ERR(logger, "[error] Failed to start scheduler_low!\n");
         ok = false;
     }
 
+    LOG_DEBUG(logger, "DEBUG: scheduler_high starting...\n");
+
     if (!scheduler_high->start())
     {
         LOG_ERR(logger, "[error] Failed to start scheduler_high!\n");
@@ -214,12 +237,16 @@ int main()
         init_fatal = true;
     }
 
+    LOG_DEBUG(logger, "DEBUG: serial starting...\n");
+
     if (!serial->start())
     {
         LOG_ERR(logger, "[error] Failed to start serial!\n");
         ok = false;
     }
 
+    LOG_DEBUG(logger, "DEBUG: radio_main starting...\n");
+
     if (!radio_main->start())
     {
         LOG_ERR(logger, "[error] Failed to start radio_main!\n");
@@ -227,6 +254,8 @@ int main()
         init_fatal = true;
     }
 
+    LOG_DEBUG(logger, "DEBUG: radio_payload starting...\n");
+
     if (!radio_payload->start())
     {
         LOG_ERR(logger, "[error] Failed to start payload radio!\n");
@@ -234,12 +263,16 @@ int main()
         ok &= dipRead.isARP;
     }
 
+    LOG_DEBUG(logger, "DEBUG: ethernet starting...\n");
+
     if (!ethernet->start())
     {
         LOG_ERR(logger, "[error] Failed to start ethernet!\n");
         ok = false;
     }
 
+    LOG_DEBUG(logger, "DEBUG: board_status starting...\n");
+
     if (!board_status->start())
     {
         LOG_ERR(logger, "[error] Failed to start board_status!\n");
@@ -250,24 +283,32 @@ int main()
 
     if (dipRead.isARP)
     {
-        if (!ModuleManager::getInstance().get<Antennas::Leds>()->start())
+        LOG_DEBUG(logger, "DEBUG: leds starting...\n");
+
+        if (leds && !(leds->start()))
         {
             LOG_ERR(logger, "[error] Failed to start leds!\n");
             ok = false;
         }
 
-        if (!ModuleManager::getInstance().get<Antennas::Sensors>()->start())
+        LOG_DEBUG(logger, "DEBUG: sensors starting...\n");
+
+        if (sensors && !(sensors->start()))
         {
             LOG_ERR(logger, "[error] Failed to start sensors!\n");
             ok = false;
         }
 
-        if (!ModuleManager::getInstance().get<Antennas::SMA>()->start())
+        LOG_DEBUG(logger, "DEBUG: sma starting...\n");
+
+        if (sma && !(sma->start()))
         {
             LOG_ERR(logger, "[error] Failed to start sma!\n");
             ok = false;
         }
 
+        LOG_DEBUG(logger, "DEBUG: actuators starting...\n");
+
         if (actuators)
         {
             actuators->start();
@@ -276,7 +317,9 @@ int main()
         else
             LOG_ERR(logger, "[error] Failed to start actuators!\n");
 
-        if (!modules.get<Antennas::PinHandler>()->start())
+        LOG_DEBUG(logger, "DEBUG: pin handler starting...\n");
+
+        if (pinHandler && !pinHandler->start())
         {
             LOG_ERR(logger, "[error] Failed to start PinHandler!\n");
             ok = false;
@@ -334,10 +377,8 @@ int main()
                     "ARP's modules initialization has failed. Init fatal "
                     "error. Cannot proceed, a restart and fix of the "
                     "boards/module is required.\n");
-            ModuleManager::getInstance().get<Antennas::Leds>()->setFastBlink(
-                Antennas::LedColor::RED);
-            ModuleManager::getInstance().get<Antennas::SMA>()->setFatal();
-
+            if (sma)
+                sma->setFatal();
             // Still go to INIT_ERROR to still allow initialization
             EventBroker::getInstance().post(Common::ARP_INIT_ERROR,
                                             Common::TOPIC_ARP);
@@ -349,8 +390,6 @@ int main()
                 logger,
                 "ARP's modules initialization has failed. Init error. It "
                 "is still possible to proceed with MAV_ARP_CMD_FORCE_INIT.\n");
-            ModuleManager::getInstance().get<Antennas::Leds>()->setOn(
-                Antennas::LedColor::RED);
             EventBroker::getInstance().post(Common::ARP_INIT_ERROR,
                                             Common::TOPIC_ARP);
         }  // If all modules are ok