diff --git a/cmake/dependencies.cmake b/cmake/dependencies.cmake
index ab4872b2a0ccc323429989208e81fa317caee663..f15b5c01bf51bf4a26af6e9e52d0fba696673210 100644
--- a/cmake/dependencies.cmake
+++ b/cmake/dependencies.cmake
@@ -83,7 +83,6 @@ set(PAYLOAD_COMPUTER
     src/boards/Payload/CanHandler/CanHandler.cpp
     src/boards/Payload/FlightStatsRecorder/FlightStatsRecorder.cpp
     src/boards/Payload/Sensors/Sensors.cpp
-    src/boards/Payload/BoardScheduler.cpp
     src/boards/Payload/PinHandler/PinHandler.cpp
     src/boards/Payload/Radio/Radio.cpp
     src/boards/Payload/TMRepository/TMRepository.cpp
diff --git a/src/boards/Payload/Actuators/Actuators.cpp b/src/boards/Payload/Actuators/Actuators.cpp
index 759aef675a7d6b20a281ce92ed3cab0563e7e28a..ab96acfc4b046bef4874ddc553f23f63e5a796cc 100644
--- a/src/boards/Payload/Actuators/Actuators.cpp
+++ b/src/boards/Payload/Actuators/Actuators.cpp
@@ -35,7 +35,7 @@ using namespace Payload::ActuatorsConfigs;
 namespace Payload
 {
 
-Actuators::Actuators(Boardcore::TaskScheduler* sched) : scheduler(sched)
+Actuators::Actuators(Boardcore::TaskScheduler& sched) : scheduler(sched)
 {
     leftServo  = new Servo(SERVO_1_TIMER, SERVO_1_PWM_CH, LEFT_SERVO_MIN_PULSE,
                            LEFT_SERVO_MAX_PULSE);
@@ -56,8 +56,8 @@ bool Actuators::start()
 
     // Signaling Devices configurations
 
-    return scheduler->addTask([&]() { updateBuzzer(); }, BUZZER_UPDATE_PERIOD,
-                              TaskScheduler::Policy::RECOVER) != 0;
+    return scheduler.addTask([this]() { updateBuzzer(); }, BUZZER_UPDATE_PERIOD,
+                             TaskScheduler::Policy::RECOVER) != 0;
 }
 
 bool Actuators::setServo(ServosList servoId, float percentage)
diff --git a/src/boards/Payload/Actuators/Actuators.h b/src/boards/Payload/Actuators/Actuators.h
index 73a207d7307250932104cb63e0de07530123541c..7a29bab90874eee439b1069f96be1912bec37eca 100644
--- a/src/boards/Payload/Actuators/Actuators.h
+++ b/src/boards/Payload/Actuators/Actuators.h
@@ -34,7 +34,7 @@ namespace Payload
 
 struct Actuators : public Boardcore::Module
 {
-    explicit Actuators(Boardcore::TaskScheduler* sched);
+    explicit Actuators(Boardcore::TaskScheduler& sched);
 
     [[nodiscard]] bool start();
 
@@ -119,10 +119,10 @@ private:
      */
     void updateBuzzer();
 
-    Boardcore::TaskScheduler* scheduler = nullptr;
-    Boardcore::Servo* leftServo         = nullptr;
-    Boardcore::Servo* rightServo        = nullptr;
-    Boardcore::PWM* buzzer              = nullptr;
+    Boardcore::TaskScheduler& scheduler;
+    Boardcore::Servo* leftServo  = nullptr;
+    Boardcore::Servo* rightServo = nullptr;
+    Boardcore::PWM* buzzer       = nullptr;
 
     // mutexes
     miosix::FastMutex leftServoMutex;
diff --git a/src/boards/Payload/AltitudeTrigger/AltitudeTrigger.cpp b/src/boards/Payload/AltitudeTrigger/AltitudeTrigger.cpp
index 6398f6e51ee398d55ca657035461a5f32a3cdddc..d72a2c469de5caef401d1821faecba6b7e9eef07 100644
--- a/src/boards/Payload/AltitudeTrigger/AltitudeTrigger.cpp
+++ b/src/boards/Payload/AltitudeTrigger/AltitudeTrigger.cpp
@@ -34,7 +34,7 @@ using namespace Common;
 namespace Payload
 {
 
-AltitudeTrigger::AltitudeTrigger(TaskScheduler *sched)
+AltitudeTrigger::AltitudeTrigger(TaskScheduler& sched)
     : running(false), confidence(0),
       deploymentAltitude(WingConfig::ALTITUDE_TRIGGER_DEPLOYMENT_ALTITUDE),
       scheduler(sched)
@@ -43,8 +43,8 @@ AltitudeTrigger::AltitudeTrigger(TaskScheduler *sched)
 
 bool AltitudeTrigger::start()
 {
-    return (scheduler->addTask(std::bind(&AltitudeTrigger::update, this),
-                               WingConfig::ALTITUDE_TRIGGER_PERIOD) != 0);
+    return (scheduler.addTask([this] { update(); },
+                              WingConfig::ALTITUDE_TRIGGER_PERIOD) != 0);
 }
 
 void AltitudeTrigger::enable()
diff --git a/src/boards/Payload/AltitudeTrigger/AltitudeTrigger.h b/src/boards/Payload/AltitudeTrigger/AltitudeTrigger.h
index b0d2731ac9ecbcdc19ca2cd5f0ae9edd156735e1..3454064216fea40310a788ed39c63fcaf945bb50 100644
--- a/src/boards/Payload/AltitudeTrigger/AltitudeTrigger.h
+++ b/src/boards/Payload/AltitudeTrigger/AltitudeTrigger.h
@@ -33,7 +33,7 @@ namespace Payload
 class AltitudeTrigger : public Boardcore::Module
 {
 public:
-    explicit AltitudeTrigger(Boardcore::TaskScheduler *sched);
+    explicit AltitudeTrigger(Boardcore::TaskScheduler &sched);
 
     /**
      * @brief Adds the update() task to the task scheduler.
@@ -61,21 +61,19 @@ public:
     void setDeploymentAltitude(float altitude);
 
 private:
-    // Update method that posts a FLIGHT_WING_ALT_PASSED when the correct
-    // altitude is reached
+    /**
+     * @brief Update method that posts a FLIGHT_WING_ALT_PASSED when the correct
+     * altitude is reached
+     */
     void update();
 
     bool running;
-
-    // Number of times that the algorithm detects to be below the fixed
-    // altitude
-    int confidence;
-
+    int confidence;  ///< Number of times that the algorithm detects to be below
+                     ///< the fixed altitude
     float deploymentAltitude;
 
     miosix::FastMutex mutex;
-
-    Boardcore::TaskScheduler *scheduler = nullptr;
+    Boardcore::TaskScheduler &scheduler;
 };
 
 }  // namespace Payload
diff --git a/src/boards/Payload/BoardScheduler.cpp b/src/boards/Payload/BoardScheduler.cpp
deleted file mode 100644
index 10eafa5f52b0d11473470ae239165890a3795661..0000000000000000000000000000000000000000
--- a/src/boards/Payload/BoardScheduler.cpp
+++ /dev/null
@@ -1,66 +0,0 @@
-/* Copyright (c) 2023 Skyward Experimental Rocketry
- * Authors: Matteo Pignataro
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-#include "BoardScheduler.h"
-
-using namespace Boardcore;
-
-namespace Payload
-{
-
-BoardScheduler::BoardScheduler()
-{
-    scheduler1 = new TaskScheduler(miosix::PRIORITY_MAX - 4);
-    scheduler2 = new TaskScheduler(miosix::PRIORITY_MAX - 3);
-    scheduler3 = new TaskScheduler(miosix::PRIORITY_MAX - 2);
-    scheduler4 = new TaskScheduler(miosix::PRIORITY_MAX - 1);
-}
-
-TaskScheduler* BoardScheduler::getScheduler(miosix::Priority priority)
-{
-    switch (priority.get())
-    {
-        case miosix::PRIORITY_MAX:
-            return scheduler4;
-        case miosix::PRIORITY_MAX - 1:
-            return scheduler3;
-        case miosix::PRIORITY_MAX - 2:
-            return scheduler2;
-        case miosix::MAIN_PRIORITY:
-            return scheduler1;
-        default:
-            return scheduler1;
-    }
-}
-
-bool BoardScheduler::start()
-{
-    return scheduler1->start() && scheduler2->start() && scheduler3->start() &&
-           scheduler4->start();
-}
-
-bool BoardScheduler::isStarted()
-{
-    return scheduler1->isRunning() && scheduler2->isRunning() &&
-           scheduler3->isRunning() && scheduler4->isRunning();
-}
-}  // namespace Payload
\ No newline at end of file
diff --git a/src/boards/Payload/BoardScheduler.h b/src/boards/Payload/BoardScheduler.h
index 3a09bccc34b1508ff13df578ce9e8a9440badf43..9ec1a1d0ed53dc98a739339ccb15c6c2654e3b84 100644
--- a/src/boards/Payload/BoardScheduler.h
+++ b/src/boards/Payload/BoardScheduler.h
@@ -1,5 +1,5 @@
-/* Copyright (c) 2023 Skyward Experimental Rocketry
- * Authors: Matteo Pignataro
+/* Copyright (c) 2024 Skyward Experimental Rocketry
+ * Author: Niccolò Betto
  *
  * Permission is hereby granted, free of charge, to any person obtaining a copy
  * of this software and associated documentation files (the "Software"), to deal
@@ -34,29 +34,48 @@ namespace Payload
 class BoardScheduler : public Boardcore::Module
 {
 public:
-    BoardScheduler();
+    /**
+     * @brief Returns the scheduler for critical tasks (highest priority)
+     */
+    Boardcore::TaskScheduler& getCriticalScheduler() { return critical; }
+
+    /**
+     * @brief Returns the scheduler for high priority tasks
+     */
+    Boardcore::TaskScheduler& getHighScheduler() { return high; }
 
     /**
-     * @brief Get the Scheduler object relative to the requested priority
-     *
-     * @param priority The task scheduler priority
-     * @return Boardcore::TaskScheduler& Reference to the requested task
-     * scheduler.
-     * @note Min priority scheduler is returned in case of non valid priority.
+     * @brief Returns the scheduler for medium priority tasks
      */
-    Boardcore::TaskScheduler* getScheduler(miosix::Priority priority);
+    Boardcore::TaskScheduler& getMediumScheduler() { return medium; }
 
-    [[nodiscard]] bool start();
+    /**
+     * @brief Returns the scheduler for low priority tasks (lowest priority)
+     */
+    Boardcore::TaskScheduler& getLowScheduler() { return low; }
+
+    /**
+     * @brief Starts all the schedulers
+     */
+    [[nodiscard]] bool start()
+    {
+        return critical.start() && high.start() && medium.start() &&
+               low.start();
+    }
 
     /**
      * @brief Returns if all the schedulers are up and running
      */
-    bool isStarted();
+    bool isStarted()
+    {
+        return critical.isRunning() && high.isRunning() && medium.isRunning() &&
+               low.isRunning();
+    }
 
 private:
-    Boardcore::TaskScheduler* scheduler1;
-    Boardcore::TaskScheduler* scheduler2;
-    Boardcore::TaskScheduler* scheduler3;
-    Boardcore::TaskScheduler* scheduler4;
+    Boardcore::TaskScheduler critical{miosix::PRIORITY_MAX - 1};
+    Boardcore::TaskScheduler high{miosix::PRIORITY_MAX - 2};
+    Boardcore::TaskScheduler medium{miosix::PRIORITY_MAX - 3};
+    Boardcore::TaskScheduler low{miosix::PRIORITY_MAX - 4};
 };
 }  // namespace Payload
diff --git a/src/boards/Payload/CanHandler/CanHandler.cpp b/src/boards/Payload/CanHandler/CanHandler.cpp
index e9ba14e44aba062f39f77f000624f9084b2ac35c..d23389e734e0ac0657bec33b06c6dce8700323d6 100644
--- a/src/boards/Payload/CanHandler/CanHandler.cpp
+++ b/src/boards/Payload/CanHandler/CanHandler.cpp
@@ -30,8 +30,6 @@
 
 #include <functional>
 
-using namespace std;
-using namespace placeholders;
 using namespace Boardcore;
 using namespace Canbus;
 using namespace Common;
@@ -41,17 +39,18 @@ using namespace Payload::CanHandlerConfig;
 namespace Payload
 {
 
-CanHandler::CanHandler(TaskScheduler *sched) : scheduler(sched)
+CanHandler::CanHandler(TaskScheduler& sched) : scheduler(sched)
 {
     CanbusDriver::AutoBitTiming bitTiming;
     bitTiming.baudRate    = BAUD_RATE;
     bitTiming.samplePoint = SAMPLE_POINT;
+
     CanbusDriver::CanbusConfig config;
     driver = new CanbusDriver(CAN2, config, bitTiming);
 
-    protocol =
-        new CanProtocol(driver, bind(&CanHandler::handleCanMessage, this, _1),
-                        miosix::PRIORITY_MAX - 1);
+    protocol = new CanProtocol(
+        driver, [this](auto msg) { handleCanMessage(msg); },
+        miosix::PRIORITY_MAX - 1);
 
     // Accept messages only from the main and RIG board
     protocol->addFilter(static_cast<uint8_t>(Board::MAIN),
@@ -65,7 +64,7 @@ bool CanHandler::start()
 {
     bool result;
     // Add a task to periodically send the pitot data
-    result = scheduler->addTask(  // sensor template
+    result = scheduler.addTask(  // sensor template
                  [&]()
                  {
                      protocol->enqueueData(
@@ -82,7 +81,7 @@ bool CanHandler::start()
 
     result =
         result &&
-        scheduler->addTask(  // status
+        scheduler.addTask(  // status
             [&]()
             {
                 FlightModeManagerState state = ModuleManager::getInstance()
@@ -112,7 +111,7 @@ void CanHandler::sendEvent(EventId event)
                            static_cast<uint8_t>(event));
 }
 
-void CanHandler::handleCanMessage(const CanMessage &msg)
+void CanHandler::handleCanMessage(const CanMessage& msg)
 {
     PrimaryType msgType = static_cast<PrimaryType>(msg.getPrimaryType());
 
@@ -132,7 +131,7 @@ void CanHandler::handleCanMessage(const CanMessage &msg)
     }
 }
 
-void CanHandler::handleCanEvent(const Boardcore::Canbus::CanMessage &msg)
+void CanHandler::handleCanEvent(const Boardcore::Canbus::CanMessage& msg)
 {
     EventId eventId = static_cast<EventId>(msg.getSecondaryType());
 
diff --git a/src/boards/Payload/CanHandler/CanHandler.h b/src/boards/Payload/CanHandler/CanHandler.h
index 2f040b4e05bdaf1b7cf1793dc231c790e59d87f0..1e8a586e6a1443b786ee73f53e826ed8d7d621e0 100644
--- a/src/boards/Payload/CanHandler/CanHandler.h
+++ b/src/boards/Payload/CanHandler/CanHandler.h
@@ -46,7 +46,7 @@ public:
      * @warning With Payload motherboard CanDriver initialization could be
      * blocking
      */
-    explicit CanHandler(Boardcore::TaskScheduler *sched);
+    explicit CanHandler(Boardcore::TaskScheduler& sched);
 
     /**
      * @brief Starts the protocol and adds the periodic messages to the task
@@ -72,19 +72,19 @@ private:
     /**
      * @brief Function called by CanProtocol when a new message is received
      */
-    void handleCanMessage(const Boardcore::Canbus::CanMessage &msg);
+    void handleCanMessage(const Boardcore::Canbus::CanMessage& msg);
 
     /**
      * @brief Converts the received CanEvent in Event and post it on TOPIC_CAN
      */
-    void handleCanEvent(const Boardcore::Canbus::CanMessage &msg);
+    void handleCanEvent(const Boardcore::Canbus::CanMessage& msg);
 
-    Boardcore::Canbus::CanbusDriver *driver;
-    Boardcore::Canbus::CanProtocol *protocol;
+    Boardcore::Canbus::CanbusDriver* driver;
+    Boardcore::Canbus::CanProtocol* protocol;
 
     Boardcore::PrintLogger logger = Boardcore::Logging::getLogger("canhandler");
 
-    Boardcore::TaskScheduler *scheduler = nullptr;
+    Boardcore::TaskScheduler& scheduler;
 };
 
 }  // namespace Payload
diff --git a/src/boards/Payload/FlightStatsRecorder/FlightStatsRecorder.cpp b/src/boards/Payload/FlightStatsRecorder/FlightStatsRecorder.cpp
index faf62811c45892dd27aac1dcf5d63833f2db9f2b..8e697720bbb1169b0f41c1dff9395b7dd84798bd 100644
--- a/src/boards/Payload/FlightStatsRecorder/FlightStatsRecorder.cpp
+++ b/src/boards/Payload/FlightStatsRecorder/FlightStatsRecorder.cpp
@@ -35,7 +35,7 @@ using namespace miosix;
 
 namespace Payload
 {
-FlightStatsRecorder::FlightStatsRecorder(TaskScheduler* sched)
+FlightStatsRecorder::FlightStatsRecorder(TaskScheduler& sched)
     : scheduler(sched)
 {
     // Init the data structure to avoid UB
@@ -58,8 +58,8 @@ FlightStatsRecorder::FlightStatsRecorder(TaskScheduler* sched)
 
 bool FlightStatsRecorder::start()
 {
-    return scheduler->addTask([&]() { update(); }, FSR_UPDATE_PERIOD,
-                              TaskScheduler::Policy::RECOVER);
+    return scheduler.addTask([this] { update(); }, FSR_UPDATE_PERIOD,
+                             TaskScheduler::Policy::RECOVER);
 }
 
 void FlightStatsRecorder::update()
diff --git a/src/boards/Payload/FlightStatsRecorder/FlightStatsRecorder.h b/src/boards/Payload/FlightStatsRecorder/FlightStatsRecorder.h
index 2b034bd4a9f6762e7323e01407ddcec66a7285b6..8041652b129854afc20fd85ff9766bb35270facc 100644
--- a/src/boards/Payload/FlightStatsRecorder/FlightStatsRecorder.h
+++ b/src/boards/Payload/FlightStatsRecorder/FlightStatsRecorder.h
@@ -37,7 +37,7 @@ namespace Payload
 class FlightStatsRecorder : public Boardcore::Module
 {
 public:
-    FlightStatsRecorder(Boardcore::TaskScheduler* sched);
+    explicit FlightStatsRecorder(Boardcore::TaskScheduler& sched);
 
     /**
      * @brief Adds a task to the scheduler to update the stats
@@ -69,7 +69,7 @@ private:
                    Boardcore::NASState data);
 
     // Update scheduler to update all the data
-    Boardcore::TaskScheduler* scheduler = nullptr;
+    Boardcore::TaskScheduler& scheduler;
 
     // Data structure
     mavlink_payload_stats_tm_t stats;
diff --git a/src/boards/Payload/Radio/Radio.cpp b/src/boards/Payload/Radio/Radio.cpp
index 3611f2a44fbd05c3396553b552061e9f868333d0..392f38deb26b378352e11b4e989bdb9b155677d3 100644
--- a/src/boards/Payload/Radio/Radio.cpp
+++ b/src/boards/Payload/Radio/Radio.cpp
@@ -73,7 +73,7 @@ void __attribute__((used)) SX1278_IRQ_DIO3()
 namespace Payload
 {
 
-Radio::Radio(TaskScheduler* sched) : scheduler(sched) {}
+Radio::Radio(TaskScheduler& sched) : scheduler(sched) {}
 
 bool Radio::start()
 {
@@ -105,10 +105,10 @@ bool Radio::start()
 
     // Add periodic telemetry send task
     uint8_t result =
-        scheduler->addTask([&]() { this->sendPeriodicMessage(); },
-                           RadioConfig::RADIO_PERIODIC_TELEMETRY_PERIOD,
-                           TaskScheduler::Policy::RECOVER);
-    result *= scheduler->addTask(
+        scheduler.addTask([&]() { this->sendPeriodicMessage(); },
+                          RadioConfig::RADIO_PERIODIC_TELEMETRY_PERIOD,
+                          TaskScheduler::Policy::RECOVER);
+    result *= scheduler.addTask(
         [&]()
         {
             this->enqueueMsg(
@@ -119,8 +119,7 @@ bool Radio::start()
 
     // Config mavDriver
     mavDriver = new MavDriver(
-        transceiver,
-        [=](MavDriver*, const mavlink_message_t& msg)
+        transceiver, [=](MavDriver*, const mavlink_message_t& msg)
         { this->handleMavlinkMessage(msg); },
         RadioConfig::RADIO_SLEEP_AFTER_SEND,
         RadioConfig::RADIO_OUT_BUFFER_MAX_AGE);
@@ -157,7 +156,7 @@ void Radio::logStatus() { Logger::getInstance().log(mavDriver->getStatus()); }
 
 bool Radio::isStarted()
 {
-    return mavDriver->isStarted() && scheduler->isRunning();
+    return mavDriver->isStarted() && scheduler.isRunning();
 }
 
 void Radio::handleMavlinkMessage(const mavlink_message_t& msg)
diff --git a/src/boards/Payload/Radio/Radio.h b/src/boards/Payload/Radio/Radio.h
index 10cb47178051036e8438a1e023501ccd433fea8b..c5fdc24890346c8f123909d24feecbd732282aea 100644
--- a/src/boards/Payload/Radio/Radio.h
+++ b/src/boards/Payload/Radio/Radio.h
@@ -38,7 +38,7 @@ using MavDriver = Boardcore::MavlinkDriver<Boardcore::SX1278Fsk::MTU,
 class Radio : public Boardcore::Module
 {
 public:
-    Radio(Boardcore::TaskScheduler* sched);
+    Radio(Boardcore::TaskScheduler& sched);
 
     /**
      * @brief Starts the MavlinkDriver
@@ -97,7 +97,7 @@ private:
     miosix::FastMutex queueMutex;
 
     Boardcore::PrintLogger logger = Boardcore::Logging::getLogger("Radio");
-    Boardcore::TaskScheduler* scheduler = nullptr;
+    Boardcore::TaskScheduler& scheduler;
 };
 
 }  // namespace Payload
diff --git a/src/boards/Payload/Sensors/Sensors.cpp b/src/boards/Payload/Sensors/Sensors.cpp
index d43d378e2350128af19a0b960224791701bbf9e9..ecc7fd213803bbc48ae768337e3a5f9905d65721 100644
--- a/src/boards/Payload/Sensors/Sensors.cpp
+++ b/src/boards/Payload/Sensors/Sensors.cpp
@@ -165,7 +165,7 @@ MagnetometerData Sensors::getCalibratedMagnetometerLastSample()
     return result;
 }
 
-Sensors::Sensors(TaskScheduler* sched) : scheduler(sched), sensorsCounter(0) {}
+Sensors::Sensors(TaskScheduler& sched) : scheduler(sched), sensorsCounter(0) {}
 
 bool Sensors::start()
 {
@@ -186,7 +186,7 @@ bool Sensors::start()
     imuInit();
 
     // Add the magnetometer calibration to the scheduler
-    size_t result = scheduler->addTask(
+    size_t result = scheduler.addTask(
         [&]()
         {
             // Gather the last sample data
@@ -203,7 +203,7 @@ bool Sensors::start()
         MAG_CALIBRATION_PERIOD);
 
     // Create sensor manager with populated map and configured scheduler
-    manager = new SensorManager(sensorMap, scheduler);
+    manager = new SensorManager(sensorMap, &scheduler);
     return manager->start() && result != 0;
 }
 
@@ -211,7 +211,7 @@ void Sensors::stop() { manager->stop(); }
 
 bool Sensors::isStarted()
 {
-    return manager->areAllSensorsInitialized() && scheduler->isRunning();
+    return manager->areAllSensorsInitialized() && scheduler.isRunning();
 }
 
 void Sensors::calibrate()
diff --git a/src/boards/Payload/Sensors/Sensors.h b/src/boards/Payload/Sensors/Sensors.h
index faeee0b846d2c6b90b85ad3772128a35ce119fe8..62ce45051432116a410353ff8708cc78efa53065 100644
--- a/src/boards/Payload/Sensors/Sensors.h
+++ b/src/boards/Payload/Sensors/Sensors.h
@@ -49,7 +49,7 @@ namespace Payload
 class Sensors : public Boardcore::Module
 {
 public:
-    explicit Sensors(Boardcore::TaskScheduler* sched);
+    explicit Sensors(Boardcore::TaskScheduler& sched);
 
     [[nodiscard]] bool start();
 
@@ -164,7 +164,7 @@ private:
     // Sensor manager
     Boardcore::SensorManager* manager = nullptr;
     Boardcore::SensorManager::SensorMap_t sensorMap;
-    Boardcore::TaskScheduler* scheduler = nullptr;
+    Boardcore::TaskScheduler& scheduler;
 
     uint8_t sensorsCounter;
 
diff --git a/src/boards/Payload/StateMachines/NASController/NASController.cpp b/src/boards/Payload/StateMachines/NASController/NASController.cpp
index 8bb088495e5543f2f30c236268a92788f78e9d42..b68152a704447a8bac587eee645e1f2457de2911 100644
--- a/src/boards/Payload/StateMachines/NASController/NASController.cpp
+++ b/src/boards/Payload/StateMachines/NASController/NASController.cpp
@@ -31,11 +31,11 @@
 
 using namespace Boardcore;
 using namespace Eigen;
-using namespace std;
 using namespace Common;
+
 namespace Payload
 {
-NASController::NASController(TaskScheduler* sched)
+NASController::NASController(TaskScheduler& sched)
     : FSM(&NASController::state_idle), nas(NASConfig::config), scheduler(sched)
 {
     // Subscribe the class to the topics
@@ -64,9 +64,9 @@ NASController::NASController(TaskScheduler* sched)
 bool NASController::start()
 {
     // Add the task to the scheduler
-    size_t result = scheduler->addTask(bind(&NASController::update, this),
-                                       NASConfig::UPDATE_PERIOD,
-                                       TaskScheduler::Policy::RECOVER);
+    size_t result =
+        scheduler.addTask([this] { update(); }, NASConfig::UPDATE_PERIOD,
+                          TaskScheduler::Policy::RECOVER);
 
     return ActiveObject::start() && result != 0;
 }
diff --git a/src/boards/Payload/StateMachines/NASController/NASController.h b/src/boards/Payload/StateMachines/NASController/NASController.h
index 73a256714815349a9b293bb41457f5a98212efb9..3cf42f15a5f9564feccaf4515b0456156127d87c 100644
--- a/src/boards/Payload/StateMachines/NASController/NASController.h
+++ b/src/boards/Payload/StateMachines/NASController/NASController.h
@@ -37,7 +37,7 @@ class NASController : public Boardcore::FSM<NASController>,
                       public Boardcore::Module
 {
 public:
-    NASController(Boardcore::TaskScheduler* sched);
+    NASController(Boardcore::TaskScheduler& sched);
 
     /**
      * @brief Starts the FSM thread and adds the update function into the
@@ -84,7 +84,7 @@ private:
     Boardcore::NAS nas;
 
     // Scheduler to be used for update function
-    Boardcore::TaskScheduler* scheduler;
+    Boardcore::TaskScheduler& scheduler;
 
     // User set (or triac set) initial orientation
     Eigen::Vector3f initialOrientation;
diff --git a/src/boards/Payload/StateMachines/WingController/WingController.cpp b/src/boards/Payload/StateMachines/WingController/WingController.cpp
index 33a64f24aaf0617aa5b7566e903019e42a292449..fa753f2c8c03fb144f6674446f953692611719f9 100644
--- a/src/boards/Payload/StateMachines/WingController/WingController.cpp
+++ b/src/boards/Payload/StateMachines/WingController/WingController.cpp
@@ -47,7 +47,7 @@ using namespace miosix;
 namespace Payload
 {
 
-WingController::WingController(TaskScheduler* sched)
+WingController::WingController(TaskScheduler& sched)
     : HSM(&WingController::state_idle), running(false), selectedAlgorithm(0),
       scheduler(sched)
 {
@@ -59,8 +59,7 @@ WingController::WingController(TaskScheduler* sched)
 
 bool WingController::start()
 {
-    return scheduler->addTask(std::bind(&WingController::update, this),
-                              WING_UPDATE_PERIOD) &&
+    return scheduler.addTask([this] { update(); }, WING_UPDATE_PERIOD) &&
            addAlgorithms() && HSM::start();
 }
 
diff --git a/src/boards/Payload/StateMachines/WingController/WingController.h b/src/boards/Payload/StateMachines/WingController/WingController.h
index 1fb84ee6638df0990638911734ca37c7d6f9b8c1..e2fee5eaf13bc22ce6938431738ed467a946af38 100644
--- a/src/boards/Payload/StateMachines/WingController/WingController.h
+++ b/src/boards/Payload/StateMachines/WingController/WingController.h
@@ -57,21 +57,24 @@ namespace Payload
 {
 class WingController : public Boardcore::HSM<WingController>,
                        public Boardcore::Module
-
 {
-
 public:
-    Boardcore::State state_idle(const Boardcore::Event& event);
-    Boardcore::State state_flying(const Boardcore::Event& event);
-    Boardcore::State state_calibration(const Boardcore::Event& event);
-    Boardcore::State state_controlled_descent(const Boardcore::Event& event);
-    Boardcore::State state_on_ground(const Boardcore::Event& event);
+    /**
+     * @brief Construct a new Wing Controller object
+     */
+    explicit WingController(Boardcore::TaskScheduler& sched);
 
     /**
      * @brief Destroy the Wing Controller object.
      */
     ~WingController();
 
+    Boardcore::State state_idle(const Boardcore::Event& event);
+    Boardcore::State state_flying(const Boardcore::Event& event);
+    Boardcore::State state_calibration(const Boardcore::Event& event);
+    Boardcore::State state_controlled_descent(const Boardcore::Event& event);
+    Boardcore::State state_on_ground(const Boardcore::Event& event);
+
     /**
      * @brief Method to set the target position.
      */
@@ -88,11 +91,6 @@ public:
 
     WingControllerStatus getStatus();
 
-    /**
-     * @brief Construct a new Wing Controller object
-     */
-    explicit WingController(Boardcore::TaskScheduler* sched);
-
     bool start() override;
 
 private:
@@ -177,6 +175,6 @@ private:
 
     void update();
 
-    Boardcore::TaskScheduler* scheduler = nullptr;
+    Boardcore::TaskScheduler& scheduler;
 };
 }  // namespace Payload
diff --git a/src/boards/Payload/VerticalVelocityTrigger/VerticalVelocityTrigger.cpp b/src/boards/Payload/VerticalVelocityTrigger/VerticalVelocityTrigger.cpp
index 538d58a45b8441582492659d9f91faf28fe5217f..f99f176f6c720ca031b5a095ee4443da0a3880b4 100644
--- a/src/boards/Payload/VerticalVelocityTrigger/VerticalVelocityTrigger.cpp
+++ b/src/boards/Payload/VerticalVelocityTrigger/VerticalVelocityTrigger.cpp
@@ -29,22 +29,21 @@
 
 #include <functional>
 
-using namespace std;
 using namespace Boardcore;
 using namespace Common;
 
 namespace Payload
 {
 
-VerticalVelocityTrigger::VerticalVelocityTrigger(TaskScheduler* sched)
+VerticalVelocityTrigger::VerticalVelocityTrigger(TaskScheduler& sched)
     : running(false), confidence(0), scheduler(sched)
 {
 }
 
 bool VerticalVelocityTrigger::start()
 {
-    return scheduler->addTask(
-        bind(&VerticalVelocityTrigger::update, this),
+    return scheduler.addTask(
+        [this] { update(); },
         FailSafe::FAILSAFE_VERTICAL_VELOCITY_TRIGGER_PERIOD);
 }
 
diff --git a/src/boards/Payload/VerticalVelocityTrigger/VerticalVelocityTrigger.h b/src/boards/Payload/VerticalVelocityTrigger/VerticalVelocityTrigger.h
index 84f721f35a6e05efdff43de2da985f81ed8de9da..a0c137c533135bdc2acd84b29e6a716a8988654f 100644
--- a/src/boards/Payload/VerticalVelocityTrigger/VerticalVelocityTrigger.h
+++ b/src/boards/Payload/VerticalVelocityTrigger/VerticalVelocityTrigger.h
@@ -44,7 +44,7 @@ public:
      * Default constructor for VerticalVelocityTrigger
      * Sets the trigger to disabled by default
      */
-    VerticalVelocityTrigger(Boardcore::TaskScheduler* sched);
+    explicit VerticalVelocityTrigger(Boardcore::TaskScheduler& sched);
 
     /**
      * Starts the module by inserting it in the BoardScheduler
@@ -84,7 +84,7 @@ private:
     // threshold
     std::atomic<int> confidence;
 
-    Boardcore::TaskScheduler* scheduler;
+    Boardcore::TaskScheduler& scheduler;
 };
 
 }  // namespace Payload
diff --git a/src/boards/Payload/WindEstimationScheme/WindEstimation.cpp b/src/boards/Payload/WindEstimationScheme/WindEstimation.cpp
index e6cc50cc7baec7997e6986e7119837eee200cde4..f705cbc38cc498009572304784dd5140df0968e5 100644
--- a/src/boards/Payload/WindEstimationScheme/WindEstimation.cpp
+++ b/src/boards/Payload/WindEstimationScheme/WindEstimation.cpp
@@ -33,12 +33,11 @@
 using namespace Payload::WESConfig;
 using namespace Boardcore;
 using namespace Common;
-using namespace miosix;
 
 namespace Payload
 {
 
-WindEstimation::WindEstimation(TaskScheduler* sched)
+WindEstimation::WindEstimation(TaskScheduler& sched)
     : running(false), calRunning(false), scheduler(sched)
 {
     funv << 1.0f, 0.0f, 0.0f, 1.0f;  // cppcheck-suppress constStatement
@@ -46,13 +45,12 @@ WindEstimation::WindEstimation(TaskScheduler* sched)
 
 bool WindEstimation::start()
 {
-    scheduler->addTask(
-        std::bind(&WindEstimation::windEstimationSchemeCalibration, this),
-        WES_CALIBRATION_UPDATE_PERIOD);
+    scheduler.addTask([this] { windEstimationSchemeCalibration(); },
+                      WES_CALIBRATION_UPDATE_PERIOD);
 
     // Register the WES task
-    scheduler->addTask(std::bind(&WindEstimation::windEstimationScheme, this),
-                       WES_PREDICTION_UPDATE_PERIOD);
+    scheduler.addTask([this] { windEstimationScheme(); },
+                      WES_PREDICTION_UPDATE_PERIOD);
 
     return true;
 }
diff --git a/src/boards/Payload/WindEstimationScheme/WindEstimation.h b/src/boards/Payload/WindEstimationScheme/WindEstimation.h
index e3c5e0148ab938b66afcc26fda9ccd412842b31e..b54feba6b6649f5da6e8de93af258bde863af39f 100644
--- a/src/boards/Payload/WindEstimationScheme/WindEstimation.h
+++ b/src/boards/Payload/WindEstimationScheme/WindEstimation.h
@@ -32,6 +32,7 @@
 #include <utils/ModuleManager/ModuleManager.hpp>
 
 #include "WindEstimationData.h"
+
 namespace Payload
 {
 
@@ -45,7 +46,7 @@ public:
     /**
      * @brief Construct a new Wing Controller object
      */
-    explicit WindEstimation(Boardcore::TaskScheduler* sched);
+    explicit WindEstimation(Boardcore::TaskScheduler& sched);
 
     /**
      * @brief Destroy the Wing Controller object.
@@ -125,6 +126,6 @@ private:
     std::atomic<bool> running;
     std::atomic<bool> calRunning;
 
-    Boardcore::TaskScheduler* scheduler = nullptr;
+    Boardcore::TaskScheduler& scheduler;
 };
 }  // namespace Payload
diff --git a/src/entrypoints/Payload/payload-entry.cpp b/src/entrypoints/Payload/payload-entry.cpp
index 00bdfcda541e4c497ec9d8212cde8f9e2e5ef469..0554b34d73bd905d6cce95ee8dab88489737ed50 100644
--- a/src/entrypoints/Payload/payload-entry.cpp
+++ b/src/entrypoints/Payload/payload-entry.cpp
@@ -61,44 +61,33 @@ int main()
     bool initResult    = true;
     PrintLogger logger = Logging::getLogger("Payload");
 
-    // Scheduler
-    BoardScheduler* scheduler = new BoardScheduler();
-
-    // Nas priority (Max priority)
-    NASController* nas =
-        new NASController(scheduler->getScheduler(miosix::PRIORITY_MAX));
-
-    // Sensors priority (MAX - 1)
-    Sensors* sensors =
-        new Sensors(scheduler->getScheduler(miosix::PRIORITY_MAX - 1));
-
-    // Other critical components (Max - 2)
-    Radio* radio = new Radio(scheduler->getScheduler(miosix::PRIORITY_MAX - 2));
-    AltitudeTrigger* altTrigger =
-        new AltitudeTrigger(scheduler->getScheduler(miosix::PRIORITY_MAX - 2));
-    WingController* wingController =
-        new WingController(scheduler->getScheduler(miosix::PRIORITY_MAX - 2));
-    VerticalVelocityTrigger* verticalVelocityTrigger =
-        new VerticalVelocityTrigger(
-            scheduler->getScheduler(miosix::PRIORITY_MAX - 2));
-    WindEstimation* windEstimation =
-        new WindEstimation(scheduler->getScheduler(miosix::PRIORITY_MAX - 2));
-    CanHandler* canHandler =
-        new CanHandler(scheduler->getScheduler(miosix::PRIORITY_MAX - 2));
-
-    // Non critical components (Max - 3)
+    auto buses     = new Buses();
+    auto scheduler = new BoardScheduler();
+
+    // Attitude estimation are critical components
+    auto nas     = new NASController(scheduler->getCriticalScheduler());
+    auto sensors = new Sensors(scheduler->getHighScheduler());
+
+    // Radio and CAN
+    auto radio      = new Radio(scheduler->getMediumScheduler());
+    auto canHandler = new CanHandler(scheduler->getMediumScheduler());
+
+    // Flight algorithms
+    auto altTrigger     = new AltitudeTrigger(scheduler->getMediumScheduler());
+    auto wingController = new WingController(scheduler->getMediumScheduler());
+    auto verticalVelocityTrigger =
+        new VerticalVelocityTrigger(scheduler->getMediumScheduler());
+    auto windEstimation = new WindEstimation(scheduler->getMediumScheduler());
+
     // Actuators is considered non-critical since the scheduler is only used for
     // the led and buzzer tasks
-    Actuators* actuators =
-        new Actuators(scheduler->getScheduler(miosix::PRIORITY_MAX - 3));
-    FlightStatsRecorder* statesRecorder = new FlightStatsRecorder(
-        scheduler->getScheduler(miosix::PRIORITY_MAX - 3));
+    auto actuators      = new Actuators(scheduler->getLowScheduler());
+    auto statesRecorder = new FlightStatsRecorder(scheduler->getLowScheduler());
 
     // Components without a scheduler
-    TMRepository* tmRepo   = new TMRepository();
-    FlightModeManager* fmm = new FlightModeManager();
-    Buses* buses           = new Buses();
-    PinHandler* pinHandler = new PinHandler();
+    auto tmRepo     = new TMRepository();
+    auto fmm        = new FlightModeManager();
+    auto pinHandler = new PinHandler();
 
     // Insert modules
     if (!modules.insert<BoardScheduler>(scheduler))