diff --git a/src/boards/Groundstation/Rovie/Buses.h b/src/boards/Groundstation/Rovie/Buses.h
index 34b13057ff99ffe2c0dfdd6cde1cd2e446e1d2e3..54d1ce0175a906953dc95ef8ec5f0dfaaf25f33d 100644
--- a/src/boards/Groundstation/Rovie/Buses.h
+++ b/src/boards/Groundstation/Rovie/Buses.h
@@ -23,23 +23,20 @@
 #pragma once
 
 #include <drivers/spi/SPIBus.h>
-
-#include <utils/ModuleManager/ModuleManager.hpp>
+#include <utils/DependencyManager/DependencyManager.h>
 
 #include "interfaces-impl/hwmapping.h"
 
 namespace GroundstationRovie
 {
 
-class Buses : public Boardcore::Module
+class Buses : public Boardcore::Injectable
 {
 public:
-    Boardcore::SPIBus radio1_bus;
-    Boardcore::SPIBus ethernet_bus;
+    Boardcore::SPIBus radio1;
+    Boardcore::SPIBus ethernet;
 
-    Buses() : radio1_bus(MIOSIX_RADIO1_SPI), ethernet_bus(MIOSIX_ETHERNET_SPI)
-    {
-    }
+    Buses() : radio1(MIOSIX_RADIO1_SPI), ethernet(MIOSIX_ETHERNET_SPI) {}
 };
 
 }  // namespace GroundstationRovie
\ No newline at end of file
diff --git a/src/boards/Groundstation/Rovie/Hub.cpp b/src/boards/Groundstation/Rovie/Hub.cpp
index 50fa886a2f63ea81cdeb84df3f4f43bd22ed369d..f91e023cdd12f7149e27d52a97423458530d183f 100644
--- a/src/boards/Groundstation/Rovie/Hub.cpp
+++ b/src/boards/Groundstation/Rovie/Hub.cpp
@@ -38,9 +38,6 @@ void Hub::dispatchOutgoingMsg(const mavlink_message_t& msg)
 
 void Hub::dispatchIncomingMsg(const mavlink_message_t& msg)
 {
-    Serial* serial = ModuleManager::getInstance().get<Serial>();
-    serial->sendMsg(msg);
-
-    Ethernet* ethernet = ModuleManager::getInstance().get<Ethernet>();
-    ethernet->sendMsg(msg);
+    getModule<Serial>()->sendMsg(msg);
+    getModule<Ethernet>()->sendMsg(msg);
 }
\ No newline at end of file
diff --git a/src/boards/Groundstation/Rovie/Hub.h b/src/boards/Groundstation/Rovie/Hub.h
index 18b7531326a9469c9cb7b37d2b8995ab93879e3f..b74a80901298591ed527c32651e270850b5558c0 100644
--- a/src/boards/Groundstation/Rovie/Hub.h
+++ b/src/boards/Groundstation/Rovie/Hub.h
@@ -23,9 +23,11 @@
 #pragma once
 
 #include <Groundstation/Common/HubBase.h>
+#include <Groundstation/Common/Ports/Serial.h>
+#include <Groundstation/Rovie/Ports/Ethernet.h>
+#include <Groundstation/Rovie/Radio/Radio.h>
 #include <common/Mavlink.h>
-
-#include <utils/ModuleManager/ModuleManager.hpp>
+#include <utils/DependencyManager/DependencyManager.h>
 
 namespace GroundstationRovie
 {
@@ -33,7 +35,9 @@ namespace GroundstationRovie
 /**
  * @brief Central hub connecting all outgoing and ingoing modules.
  */
-class Hub : public Groundstation::HubBase
+class Hub : public Boardcore::InjectableWithDeps<
+                Boardcore::InjectableBase<Groundstation::HubBase>, Ethernet,
+                RadioRig, Groundstation::Serial>
 {
 public:
     Hub() {}
diff --git a/src/boards/Groundstation/Rovie/Ports/Ethernet.cpp b/src/boards/Groundstation/Rovie/Ports/Ethernet.cpp
index b242322bf5f41510caea0c0fc7c3438067bd547d..3be88ebe667cc86baeae81945b32fd1a451cb62b 100644
--- a/src/boards/Groundstation/Rovie/Ports/Ethernet.cpp
+++ b/src/boards/Groundstation/Rovie/Ports/Ethernet.cpp
@@ -30,18 +30,30 @@ using namespace GroundstationRovie;
 using namespace Boardcore;
 using namespace miosix;
 
+Wiz5500* gWiz5500{nullptr};
+
 void __attribute__((used)) MIOSIX_ETHERNET_IRQ()
 {
-    ModuleManager::getInstance().get<Ethernet>()->handleINTn();
+    Wiz5500* instance = gWiz5500;
+    if (instance)
+    {
+        instance->handleINTn();
+    }
+}
+
+void setIRQWiz5500(Wiz5500* instance)
+{
+    FastInterruptDisableLock dl;
+    gWiz5500 = instance;
 }
 
 bool Ethernet::start()
 {
     std::unique_ptr<Wiz5500> wiz5500 = std::make_unique<Wiz5500>(
-        ModuleManager::getInstance().get<Buses>()->ethernet_bus,
-        ethernet::cs::getPin(), ethernet::intr::getPin(),
-        SPI::ClockDivider::DIV_64);
+        getModule<Buses>()->ethernet, ethernet::cs::getPin(),
+        ethernet::intr::getPin(), SPI::ClockDivider::DIV_64);
 
+    setIRQWiz5500(wiz5500.get());
     if (!EthernetBase::start(std::move(wiz5500)))
     {
         return false;
diff --git a/src/boards/Groundstation/Rovie/Ports/Ethernet.h b/src/boards/Groundstation/Rovie/Ports/Ethernet.h
index 1aa1acdb919d529cf8f3562348338bf9828994ef..7184483e7ed4ca09893d30aa65e3afe3e7cc73d9 100644
--- a/src/boards/Groundstation/Rovie/Ports/Ethernet.h
+++ b/src/boards/Groundstation/Rovie/Ports/Ethernet.h
@@ -23,13 +23,15 @@
 #pragma once
 
 #include <Groundstation/Common/Ports/EthernetBase.h>
-
-#include <utils/ModuleManager/ModuleManager.hpp>
+#include <Groundstation/Rovie/Buses.h>
+#include <utils/DependencyManager/DependencyManager.h>
 
 namespace GroundstationRovie
 {
 
-class Ethernet : public Groundstation::EthernetBase, public Boardcore::Module
+class Ethernet
+    : public Boardcore::InjectableWithDeps<
+          Boardcore::InjectableBase<Groundstation::EthernetBase>, Buses>
 {
 public:
     [[nodiscard]] bool start();
diff --git a/src/boards/Groundstation/Rovie/Radio/Radio.cpp b/src/boards/Groundstation/Rovie/Radio/Radio.cpp
index dd129e6bd73ccd3f369085c1708c8e43cf052d26..4a3bc05945f74c3c296b52dd4ccd9518153cc02d 100644
--- a/src/boards/Groundstation/Rovie/Radio/Radio.cpp
+++ b/src/boards/Groundstation/Rovie/Radio/Radio.cpp
@@ -24,7 +24,6 @@
 
 #include <Groundstation/Common/Ports/Serial.h>
 #include <Groundstation/Rovie/Buses.h>
-#include <Groundstation/Rovie/Hub.h>
 #include <radio/SX1278/SX1278Frontends.h>
 
 using namespace Groundstation;
@@ -32,28 +31,26 @@ using namespace GroundstationRovie;
 using namespace Boardcore;
 using namespace miosix;
 
-void __attribute__((used)) MIOSIX_RADIO1_DIO0_IRQ()
-{
-    ModuleManager::getInstance().get<RadioRig>()->handleDioIRQ();
-}
+SX1278Lora* gRadio{nullptr};
 
-void __attribute__((used)) MIOSIX_RADIO1_DIO1_IRQ()
+void handleDioIRQ()
 {
-    ModuleManager::getInstance().get<RadioRig>()->handleDioIRQ();
+    SX1278Lora* instance = gRadio;
+    if (instance)
+    {
+        instance->handleDioIRQ();
+    }
 }
 
-void __attribute__((used)) MIOSIX_RADIO1_DIO3_IRQ()
+void setIRQRadio(SX1278Lora* radio)
 {
-    ModuleManager::getInstance().get<RadioRig>()->handleDioIRQ();
+    FastInterruptDisableLock dl;
+    gRadio = radio;
 }
 
-void RadioRig::handleDioIRQ()
-{
-    if (started)
-    {
-        sx1278->handleDioIRQ();
-    }
-}
+void __attribute__((used)) MIOSIX_RADIO_DIO0_IRQ() { handleDioIRQ(); }
+void __attribute__((used)) MIOSIX_RADIO_DIO1_IRQ() { handleDioIRQ(); }
+void __attribute__((used)) MIOSIX_RADIO_DIO3_IRQ() { handleDioIRQ(); }
 
 bool RadioRig::start()
 {
@@ -67,9 +64,12 @@ bool RadioRig::start()
 #endif
 
     sx1278 = std::make_unique<SX1278Lora>(
-        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, radio1::cs::getPin(),
+        radio1::dio0::getPin(), radio1::dio1::getPin(), radio1::dio3::getPin(),
+        SPI::ClockDivider::DIV_64, std::move(frontend));
+
+    // Store the global radio instance
+    setIRQRadio(sx1278.get());
 
     // Configure the radio
     if (sx1278->configure(Common::RIG_RADIO_CONFIG) != SX1278Lora::Error::NONE)
@@ -77,14 +77,14 @@ bool RadioRig::start()
         return false;
     }
 
-    auto mav_handler = [this](RadioMavDriver* channel,
-                              const mavlink_message_t& msg) { handleMsg(msg); };
+    auto mavHandler = [this](RadioMavDriver* channel,
+                             const mavlink_message_t& msg) { handleMsg(msg); };
 
-    mav_driver = std::make_unique<RadioMavDriver>(
-        sx1278.get(), mav_handler, Groundstation::MAV_SLEEP_AFTER_SEND,
+    mavDriver = std::make_unique<RadioMavDriver>(
+        sx1278.get(), mavHandler, Groundstation::MAV_SLEEP_AFTER_SEND,
         Groundstation::MAV_OUT_BUFFER_MAX_AGE);
 
-    if (!mav_driver->start())
+    if (!mavDriver->start())
     {
         return false;
     }
@@ -96,5 +96,5 @@ bool RadioRig::start()
 void RadioRig::handleMsg(const mavlink_message_t& msg)
 {
     // Dispatch the message through the hub.
-    ModuleManager::getInstance().get<HubBase>()->dispatchIncomingMsg(msg);
+    getModule<HubBase>()->dispatchIncomingMsg(msg);
 }
\ No newline at end of file
diff --git a/src/boards/Groundstation/Rovie/Radio/Radio.h b/src/boards/Groundstation/Rovie/Radio/Radio.h
index 2e497210756c134a9d5a0a86852001258ce2259e..05dfb37514801b499f3169c8bea5f91d668c1c1e 100644
--- a/src/boards/Groundstation/Rovie/Radio/Radio.h
+++ b/src/boards/Groundstation/Rovie/Radio/Radio.h
@@ -22,7 +22,10 @@
 
 #pragma once
 
+#include <Groundstation/Common/HubBase.h>
 #include <Groundstation/Common/Radio/RadioBase.h>
+#include <Groundstation/Rovie/Buses.h>
+#include <utils/DependencyManager/DependencyManager.h>
 
 #include <atomic>
 
@@ -34,18 +37,14 @@ using RadioMavDriver =
                              Groundstation::MAV_OUT_QUEUE_SIZE,
                              MAVLINK_MAX_DIALECT_PAYLOAD_SIZE>;
 
-class RadioRig : public Boardcore::Module
+class RadioRig
+    : public Boardcore::InjectableWithDeps<Groundstation::HubBase, Buses>
 {
 public:
     RadioRig() {}
 
     [[nodiscard]] bool start();
 
-    /**
-     * @brief Handle generic DIO irq.
-     */
-    void handleDioIRQ();
-
 private:
     /**
      * @brief Called internally when a message is received.
@@ -57,7 +56,7 @@ private:
     // Objects are always destructed in reverse order, so keep them in this
     // order
     std::unique_ptr<Boardcore::SX1278Lora> sx1278;
-    std::unique_ptr<RadioMavDriver> mav_driver;
+    std::unique_ptr<RadioMavDriver> mavDriver;
 };
 
 }  // namespace GroundstationRovie
\ No newline at end of file
diff --git a/src/entrypoints/Groundstation/rovie-groundstation-entry.cpp b/src/entrypoints/Groundstation/rovie-groundstation-entry.cpp
index 59dba2ff317a499e8ed3ca7ee09d12b3dd19f40d..be6064a41333a686e502d246a61b3233a82acf91 100644
--- a/src/entrypoints/Groundstation/rovie-groundstation-entry.cpp
+++ b/src/entrypoints/Groundstation/rovie-groundstation-entry.cpp
@@ -26,6 +26,7 @@
 #include <Groundstation/Rovie/Ports/Ethernet.h>
 #include <Groundstation/Rovie/Radio/Radio.h>
 #include <miosix.h>
+#include <utils/DependencyManager/DependencyManager.h>
 
 using namespace Groundstation;
 using namespace GroundstationRovie;
@@ -55,21 +56,19 @@ int main()
 {
     ledOff();
 
-    Hub *hub            = new Hub();
-    Buses *buses        = new Buses();
-    Serial *serial      = new Serial();
-    Ethernet *ethernet  = new Ethernet();
-    RadioRig *radio_rig = new RadioRig();
+    Hub *hub           = new Hub();
+    Buses *buses       = new Buses();
+    Serial *serial     = new Serial();
+    Ethernet *ethernet = new Ethernet();
+    RadioRig *radioRig = new RadioRig();
 
-    ModuleManager &modules = ModuleManager::getInstance();
+    DependencyManager manager;
 
-    bool ok = true;
+    bool ok = manager.insert<HubBase>(hub) && manager.insert(buses) &&
+              manager.insert(serial) && manager.insert(ethernet) &&
+              manager.insert(radioRig) && manager.inject();
 
-    ok &= modules.insert<HubBase>(hub);
-    ok &= modules.insert(buses);
-    ok &= modules.insert(serial);
-    ok &= modules.insert(ethernet);
-    ok &= modules.insert(radio_rig);
+    manager.graphviz(std::cout);
 
     // If insertion failed, stop right here
     if (!ok)
@@ -92,7 +91,7 @@ int main()
         printf("[error] Failed to start ethernet!\n");
     }
 
-    ok &= radio_rig->start();
+    ok &= radioRig->start();
     if (!ok)
     {
         printf("[error] Failed to start RIG radio!\n");