diff --git a/.vscode/settings.json b/.vscode/settings.json
index caa4ff15bf38b4658d34a4bf0af6745b62d54e44..ba530265aee5551604bf78df79042eaae66e1dba 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -118,19 +118,28 @@
                 "specialfunctions": "cpp"
         },
         "cSpell.words": [
+                "abom",
                 "ADCPRE",
+                "addfilter",
                 "ADON",
                 "aelf",
                 "airbrakes",
                 "Airbrakes",
+                "Alain",
                 "Alessandro",
+                "ALST",
                 "AMSL",
+                "apbclk",
                 "atthr",
                 "AVDD",
+                "awum",
                 "Baro",
+                "bittiming",
                 "boardcore",
                 "Boardcorev",
                 "boudrate",
+                "Canbus",
+                "Carlucci",
                 "Corigliano",
                 "CORTEXM",
                 "cpitch",
@@ -153,6 +162,8 @@
                 "Fatttr",
                 "fedetft's",
                 "fiprintf",
+                "FMPIE",
+                "FOVR",
                 "Gatttr",
                 "getdetahstate",
                 "GNSS",
@@ -169,10 +180,15 @@
                 "Hatt",
                 "HIFCR",
                 "HISR",
+                "hppw",
                 "HSCMAND",
                 "HSCMRNN",
                 "HWMAPPING",
                 "IDLEIE",
+                "Impli",
+                "Implii",
+                "INAK",
+                "INRQ",
                 "irqn",
                 "irqv",
                 "JEOC",
@@ -182,6 +198,7 @@
                 "Kalman",
                 "Katt",
                 "kbps",
+                "LBKM",
                 "ldrex",
                 "leds",
                 "LIFCR",
@@ -198,6 +215,7 @@
                 "mosi",
                 "MPXHZ",
                 "Musso",
+                "nart",
                 "NATT",
                 "NBAR",
                 "NDTR",
@@ -213,13 +231,21 @@
                 "PINC",
                 "Pitot",
                 "Plin",
+                "prescaler",
                 "Qgbw",
                 "Qget",
                 "Qhandle",
                 "Qput",
                 "Qwait",
                 "Qwakeup",
+                "RDHR",
+                "RDLR",
+                "RDTR",
+                "rflm",
+                "RFOM",
                 "Riccardo",
+                "RQCP",
+                "RXIRQ",
                 "RXNE",
                 "RXNEIE",
                 "sats",
@@ -239,11 +265,19 @@
                 "syaw",
                 "TCIE",
                 "TCIF",
+                "TDHR",
+                "TDLR",
+                "TDTR",
                 "TEIE",
                 "Terraneo",
                 "testsuite",
+                "TMEIE",
                 "TSCPP",
                 "TSVREFE",
+                "txfp",
+                "TXIRQ",
+                "TXOK",
+                "TXRQ",
                 "Ublox",
                 "UBXACK",
                 "UBXGPS",
diff --git a/cmake/boardcore.cmake b/cmake/boardcore.cmake
index b853f0628a71eb8045e1dc9c036fcd5e25d394dc..3453618b78c814bded59867f2d416255aad4744b 100644
--- a/cmake/boardcore.cmake
+++ b/cmake/boardcore.cmake
@@ -45,9 +45,9 @@ foreach(OPT_BOARD ${BOARDS})
         # Drivers
         ${SBS_BASE}/src/shared/drivers/adc/InternalTemp.cpp
         ${SBS_BASE}/src/shared/drivers/adc/InternalADC.cpp
-        ${SBS_BASE}/src/shared/drivers/canbus/Canbus.cpp
-        ${SBS_BASE}/src/shared/drivers/canbus/CanInterrupt.cpp
-        ${SBS_BASE}/src/shared/drivers/canbus/CanProtocol.cpp
+        ${SBS_BASE}/src/shared/drivers/canbus/CanDriver/CanDriver.cpp
+        ${SBS_BASE}/src/shared/drivers/canbus/CanDriver/CanInterrupt.cpp
+        ${SBS_BASE}/src/shared/drivers/canbus/CanProtocol/CanProtocol.cpp
         ${SBS_BASE}/src/shared/drivers/i2c/stm32f2_f4_i2c.cpp
         ${SBS_BASE}/src/shared/drivers/interrupt/external_interrupts.cpp
         ${SBS_BASE}/src/shared/drivers/timer/PWM.cpp
diff --git a/src/shared/drivers/canbus/BusLoadEstimation.h b/src/shared/drivers/canbus/CanDriver/BusLoadEstimation.h
similarity index 100%
rename from src/shared/drivers/canbus/BusLoadEstimation.h
rename to src/shared/drivers/canbus/CanDriver/BusLoadEstimation.h
diff --git a/src/shared/drivers/canbus/CanData.h b/src/shared/drivers/canbus/CanDriver/CanData.h
similarity index 100%
rename from src/shared/drivers/canbus/CanData.h
rename to src/shared/drivers/canbus/CanDriver/CanData.h
diff --git a/src/shared/drivers/canbus/Canbus.cpp b/src/shared/drivers/canbus/CanDriver/CanDriver.cpp
similarity index 94%
rename from src/shared/drivers/canbus/Canbus.cpp
rename to src/shared/drivers/canbus/CanDriver/CanDriver.cpp
index b7d70591a2b90d79f7ba675bd98c6858e89192ad..dc9469bddda098bdeac1b050a113bc04e734128c 100644
--- a/src/shared/drivers/canbus/Canbus.cpp
+++ b/src/shared/drivers/canbus/CanDriver/CanDriver.cpp
@@ -20,7 +20,7 @@
  * THE SOFTWARE.
  */
 
-#include "Canbus.h"
+#include "CanDriver.h"
 
 #include <kernel/scheduler/scheduler.h>
 #include <utils/ClockUtils.h>
@@ -53,26 +53,23 @@ CanbusDriver::CanbusDriver(CAN_TypeDef* can, CanbusConfig config,
     ClockUtils::enablePeripheralClock(can);
 
     // Enter init mode
-    can->MCR &= (~CAN_MCR_SLEEP);
+    can->MCR &= ~CAN_MCR_SLEEP;
     can->MCR |= CAN_MCR_INRQ;
 
     while ((can->MSR & CAN_MSR_INAK) == 0)
         ;
 
+    // Automatic wakeup when a new packet is available
     if (config.awum)
-    {
-        can->MCR |=
-            CAN_MCR_AWUM;  // Automatic wakeup when a new packet is available
-    }
+        can->MCR |= CAN_MCR_AWUM;
 
+    // Automatically recover from Bus-Off mode
     if (config.abom)
-    {
-        can->MCR |= CAN_MCR_ABOM;  // Automatically recover from Bus-Off mode
-    }
+        can->MCR |= CAN_MCR_ABOM;
+
+    // Disable automatic retransmission
     if (config.nart)
-    {
-        can->MCR |= CAN_MCR_NART;  // Disable automatic retransmission
-    }
+        can->MCR |= CAN_MCR_NART;
 
     // Bit timing configuration
     can->BTR &= ~CAN_BTR_BRP;
@@ -86,21 +83,15 @@ CanbusDriver::CanbusDriver(CAN_TypeDef* can, CanbusConfig config,
     can->BTR |= ((bitTiming.SJW - 1) & 0x3) << 24;
 
     if (config.loopback)
-    {
         can->BTR |= CAN_BTR_LBKM;
-    }
 
     // Enter filter initialization mode
     can->FMR |= CAN_FMR_FINIT;
 
     if (can == CAN1)
-    {
         canDrivers[0] = this;
-    }
     else
-    {
         canDrivers[1] = this;
-    }
 
     // Enable interrupts
     can->IER |= CAN_IER_FMPIE0 | CAN_IER_FMPIE1 | CAN_IER_TMEIE;
@@ -139,7 +130,7 @@ CanbusDriver::BitTiming CanbusDriver::calcBitTiming(AutoBitTiming autoBt)
                      1 << 10),
             1);
 
-        // Given N, calculate BS1 and BS2 that statusult in a sample time as
+        // Given N, calculate BS1 and BS2 that result in a sample time as
         // close as possible to the target one
         cfgIter.BS1 =
             std::min(std::max((int)roundf(autoBt.samplePoint * N - 1), 1),
@@ -190,9 +181,7 @@ CanbusDriver::BitTiming CanbusDriver::calcBitTiming(AutoBitTiming autoBt)
 void CanbusDriver::init()
 {
     if (isInit)
-    {
         return;
-    }
 
     PrintLogger ls = l.getChild("init");
 
@@ -203,9 +192,7 @@ void CanbusDriver::init()
 
     LOG_DEBUG(ls, "Waiting for canbus synchronization...");
     while ((can->MSR & CAN_MSR_INAK) > 0)
-    {
         Thread::sleep(1);
-    }
 
     LOG_INFO(ls, "Canbus synchronized! Init done!");
 
@@ -221,6 +208,7 @@ bool CanbusDriver::addFilter(FilterBank filter)
         LOG_ERR(ls, "Cannot add filter: canbus already initialized");
         return false;
     }
+
     if (filterIndex == NUM_FILTER_BANKS)
     {
         LOG_ERR(ls, "Cannot add filter: no more filter banks available");
@@ -256,6 +244,7 @@ uint32_t CanbusDriver::send(CanPacket packet)
 
     {
         miosix::FastInterruptDisableLock d;
+
         // Wait until there is an empty mailbox available to use
         while ((can->TSR & CAN_TSR_TME) == 0)
         {
@@ -312,13 +301,9 @@ uint32_t CanbusDriver::send(CanPacket packet)
     for (uint8_t i = 0; i < packet.length; ++i)
     {
         if (i < 4)
-        {
             mailbox->TDLR |= packet.data[i] << i * 8;
-        }
         else
-        {
             mailbox->TDHR |= packet.data[i] << (i - 4) * 8;
-        }
     }
 
     // Finally send the packet
@@ -336,13 +321,9 @@ void CanbusDriver::handleRXInterrupt(int fifo)
 
     mailbox = &can->sFIFOMailBox[fifo];
     if (fifo == 0)
-    {
         RFR = &can->RF0R;
-    }
     else
-    {
         RFR = &can->RF1R;
-    }
 
     status.fifoOverrun = (*RFR & CAN_RF0R_FOVR0) > 0;
     status.fifoFull    = (*RFR & CAN_RF0R_FULL0) > 0;
@@ -365,25 +346,18 @@ void CanbusDriver::handleRXInterrupt(int fifo)
         p.rtr = (mailbox->RIR & CAN_RI0R_RTR) > 0;
 
         if (p.ext)
-        {
             p.id = (mailbox->RIR >> 3) & 0x1FFFFFFF;
-        }
         else
-        {
             p.id = (mailbox->RIR >> 21) & 0x7FF;
-        }
+
         p.length = mailbox->RDTR & CAN_RDT0R_DLC;
 
         for (uint8_t i = 0; i < p.length; i++)
         {
             if (i < 4)  // Low register
-            {
                 p.data[i] = (mailbox->RDLR >> (i * 8)) & 0xFF;
-            }
             else  // High register
-            {
                 p.data[i] = (mailbox->RDHR >> ((i - 4) * 8)) & 0xFF;
-            }
         }
 
         *RFR |= CAN_RF0R_RFOM0;
diff --git a/src/shared/drivers/canbus/Canbus.h b/src/shared/drivers/canbus/CanDriver/CanDriver.h
similarity index 94%
rename from src/shared/drivers/canbus/Canbus.h
rename to src/shared/drivers/canbus/CanDriver/CanDriver.h
index b841096f29ade3f3ec47fb8af18198709075e4bf..07006aa3752021ebad17d7fe3a25ff13d19562da 100644
--- a/src/shared/drivers/canbus/Canbus.h
+++ b/src/shared/drivers/canbus/CanDriver/CanDriver.h
@@ -38,8 +38,8 @@ namespace Canbus
 {
 
 /**
- * @brief Low level canbus driver, with support for both peripherals (CAN1 and
- * CAN2) on stm32f4 micros.
+ * @brief Low level CanBus driver, with support for both peripherals (CAN1 and
+ * CAN2) on stm32f4 microcontrollers.
  */
 class CanbusDriver
 {
@@ -56,7 +56,7 @@ class CanbusDriver
 
 public:
     /**
-     * @brief Configuration struct for basic canbus operation.
+     * @brief Configuration struct for basic CanBus operation.
      */
     struct CanbusConfig
     {
@@ -81,7 +81,7 @@ public:
     {
         /**
          * @brief Canbus baud rate in bps (BITS PER SECOND). CANOpen standard
-         * values are preferred but not mandatory: 1000 kpbs, 500 kbps, 250
+         * values are preferred but not mandatory: 1000 kbps, 500 kbps, 250
          * kbps, 125 kbps, 100 kbps, 83.333 kbps, 50 kbps, 25 kbps and 10 kbps.
          */
         uint32_t baudRate;
@@ -93,7 +93,7 @@ public:
     };
 
     /**
-     * @brief Struct specifing exact bit timing registers values.
+     * @brief Struct specifying exact bit timing registers values.
      */
     struct BitTiming
     {
@@ -133,7 +133,7 @@ public:
     ~CanbusDriver();
 
     /**
-     * @brief Exits initialization mode and starts canbus operation.
+     * @brief Exits initialization mode and starts CanBus operation.
      */
     void init();
 
@@ -173,7 +173,7 @@ public:
     }
 
     /**
-     * @brief Returns the canbus peripheral assigned to this instance.
+     * @brief Returns the CanBus peripheral assigned to this instance.
      */
     CAN_TypeDef* getCAN() { return can; }
 
diff --git a/src/shared/drivers/canbus/CanInterrupt.cpp b/src/shared/drivers/canbus/CanDriver/CanInterrupt.cpp
similarity index 99%
rename from src/shared/drivers/canbus/CanInterrupt.cpp
rename to src/shared/drivers/canbus/CanDriver/CanInterrupt.cpp
index e0312b326dc917837e84f4faca875d6f22fa62c8..4ed47a191f8c8afa1a0716b7f1b0bfc08642cf47 100644
--- a/src/shared/drivers/canbus/CanInterrupt.cpp
+++ b/src/shared/drivers/canbus/CanDriver/CanInterrupt.cpp
@@ -26,7 +26,7 @@
 #include <kernel/scheduler/scheduler.h>
 #include <miosix.h>
 
-#include "Canbus.h"
+#include "CanDriver.h"
 
 namespace Boardcore
 {
@@ -98,9 +98,7 @@ void __attribute__((used)) CAN_RXIRQHandlerImpl(int canDev, int fifo)
     (void)canDev;
 
     if (canDrivers[canDev])
-    {
         canDrivers[canDev]->handleRXInterrupt(fifo);
-    }
 }
 
 void __attribute__((used)) CAN_TXIRQHandlerImpl(int canDev)
diff --git a/src/shared/drivers/canbus/CanInterrupt.h b/src/shared/drivers/canbus/CanDriver/CanInterrupt.h
similarity index 100%
rename from src/shared/drivers/canbus/CanInterrupt.h
rename to src/shared/drivers/canbus/CanDriver/CanInterrupt.h
diff --git a/src/shared/drivers/canbus/Filters.h b/src/shared/drivers/canbus/CanDriver/Filters.h
similarity index 100%
rename from src/shared/drivers/canbus/Filters.h
rename to src/shared/drivers/canbus/CanDriver/Filters.h
diff --git a/src/shared/drivers/canbus/CanProtocol.cpp b/src/shared/drivers/canbus/CanProtocol/CanProtocol.cpp
similarity index 100%
rename from src/shared/drivers/canbus/CanProtocol.cpp
rename to src/shared/drivers/canbus/CanProtocol/CanProtocol.cpp
diff --git a/src/shared/drivers/canbus/CanProtocol.h b/src/shared/drivers/canbus/CanProtocol/CanProtocol.h
similarity index 99%
rename from src/shared/drivers/canbus/CanProtocol.h
rename to src/shared/drivers/canbus/CanProtocol/CanProtocol.h
index d2be1c2efe69dc3fba64068530dd3e6e8b4d5a5e..88316ffad940f4884fa1a000f5a02e10dee9a732 100644
--- a/src/shared/drivers/canbus/CanProtocol.h
+++ b/src/shared/drivers/canbus/CanProtocol/CanProtocol.h
@@ -23,13 +23,12 @@
 #pragma once
 
 #include <ActiveObject.h>
+#include <drivers/canbus/CanDriver/CanDriver.h>
 #include <utils/Debug.h>
 #include <utils/collections/IRQCircularBuffer.h>
 
 #include <thread>
 
-#include "Canbus.h"
-
 #define N_BOARDS 3  ///< Number of boards on the bus.
 
 namespace Boardcore
diff --git a/src/tests/drivers/canbus/SimpleCanManager.h b/src/tests/drivers/canbus/SimpleCanManager.h
index f7ff5a59d5c65a83500948b128f2f0714c344701..141c5a60e2fe12c72607cd171f35231313874559 100644
--- a/src/tests/drivers/canbus/SimpleCanManager.h
+++ b/src/tests/drivers/canbus/SimpleCanManager.h
@@ -21,16 +21,16 @@
  */
 
 #pragma once
+
+#include <ActiveObject.h>
+#include <drivers/canbus/CanDriver/BusLoadEstimation.h>
+#include <drivers/canbus/CanDriver/CanDriver.h>
 #include <miosix.h>
+#include <utils/collections/SyncCircularBuffer.h>
 
 #include <cstdlib>
 #include <functional>
 
-#include "ActiveObject.h"
-#include "drivers/canbus/BusLoadEstimation.h"
-#include "drivers/canbus/Canbus.h"
-#include "utils/collections/SyncCircularBuffer.h"
-
 using std::function;
 
 class SimpleCanManager
diff --git a/src/tests/drivers/canbus/test-can-protocol.cpp b/src/tests/drivers/canbus/test-can-protocol.cpp
index 04b1fae84d928f8b93fb18d67fbea7f78c3a15f6..01b8a5f271fbaa49bc0834ca788c8a164f7edae1 100644
--- a/src/tests/drivers/canbus/test-can-protocol.cpp
+++ b/src/tests/drivers/canbus/test-can-protocol.cpp
@@ -22,13 +22,13 @@
  * THE SOFTWARE.
  */
 
-#include <drivers/canbus/CanProtocol.h>
+#include <drivers/canbus/CanDriver/BusLoadEstimation.h>
+#include <drivers/canbus/CanDriver/CanDriver.h>
+#include <drivers/canbus/CanProtocol/CanProtocol.h>
 
 #include <functional>
 #include <thread>
 
-#include "drivers/canbus/BusLoadEstimation.h"
-#include "drivers/canbus/Canbus.h"
 #include "utils/collections/CircularBuffer.h"
 
 constexpr uint32_t BAUD_RATE = 500 * 1000;
diff --git a/src/tests/drivers/canbus/test-canbus-2way.cpp b/src/tests/drivers/canbus/test-canbus-2way.cpp
index 91b69f5c2b9589fc67bfe5c843f0ed3eadad35b9..1a22bdfc874f306cfa4222838a19cd6b7ac02628 100644
--- a/src/tests/drivers/canbus/test-canbus-2way.cpp
+++ b/src/tests/drivers/canbus/test-canbus-2way.cpp
@@ -25,17 +25,17 @@
 // considered lost. It may also receive requests from other canbus devices, to
 // which it will respond
 
+#include <ActiveObject.h>
+#include <diagnostic/PrintLogger.h>
+#include <drivers/canbus/CanDriver/BusLoadEstimation.h>
+#include <drivers/canbus/CanDriver/CanDriver.h>
 #include <utils/Debug.h>
 #include <utils/Stats/Stats.h>
+#include <utils/collections/CircularBuffer.h>
 
 #include <string>
 
-#include "ActiveObject.h"
 #include "SimpleCanManager.h"
-#include "diagnostic/PrintLogger.h"
-#include "drivers/canbus/BusLoadEstimation.h"
-#include "drivers/canbus/Canbus.h"
-#include "utils/collections/CircularBuffer.h"
 
 constexpr uint32_t BAUD_RATE         = 500 * 1000;
 constexpr float SAMPLE_POINT         = 87.5f / 100.0f;
diff --git a/src/tests/drivers/canbus/test-canbus-filters.cpp b/src/tests/drivers/canbus/test-canbus-filters.cpp
index 64c8868840454afd28abcb7506592713ceb08095..c56e948c238fa50528df5466e64290f296fa2914 100644
--- a/src/tests/drivers/canbus/test-canbus-filters.cpp
+++ b/src/tests/drivers/canbus/test-canbus-filters.cpp
@@ -23,7 +23,7 @@
 #include <ActiveObject.h>
 #include <diagnostic/PrintLogger.h>
 #include <drivers/canbus/BusLoadEstimation.h>
-#include <drivers/canbus/Canbus.h>
+#include <drivers/canbus/CanDriver.h>
 
 #include <string>
 
diff --git a/src/tests/drivers/canbus/test-canbus-loopback.cpp b/src/tests/drivers/canbus/test-canbus-loopback.cpp
index d01ac89a1eee286837069dde8cbd8c8eef46e28e..06559020e6eaee2e933d2ce66696ec2a1c5baf44 100644
--- a/src/tests/drivers/canbus/test-canbus-loopback.cpp
+++ b/src/tests/drivers/canbus/test-canbus-loopback.cpp
@@ -20,12 +20,12 @@
  * THE SOFTWARE.
  */
 
-#include <string>
+#include <ActiveObject.h>
+#include <diagnostic/PrintLogger.h>
+#include <drivers/canbus/CanDriver/BusLoadEstimation.h>
+#include <drivers/canbus/CanDriver/CanDriver.h>
 
-#include "ActiveObject.h"
-#include "diagnostic/PrintLogger.h"
-#include "drivers/canbus/BusLoadEstimation.h"
-#include "drivers/canbus/Canbus.h"
+#include <string>
 
 using std::string;
 using namespace Boardcore;