diff --git a/scripts/logdecoder/General/logdecoder.cpp b/scripts/logdecoder/General/logdecoder.cpp
index 73451409ca657ab5d9168ba86829dfd049c4cba4..c2639f17f9dc77a5cce605effb5cb22d7846d97d 100644
--- a/scripts/logdecoder/General/logdecoder.cpp
+++ b/scripts/logdecoder/General/logdecoder.cpp
@@ -106,13 +106,17 @@ void registerTypes(Deserializer& ds)
 
     // RIGv2
     ds.registerType<RIGv2::ADC1Data>();
+    ds.registerType<RIGv2::ADC2Data>();
     ds.registerType<RIGv2::TC1Data>();
-    ds.registerType<RIGv2::VesselWeightData>();
-    ds.registerType<RIGv2::TankWeightData>();
-    ds.registerType<RIGv2::VesselPressureData>();
-    ds.registerType<RIGv2::FillingPressureData>();
-    ds.registerType<RIGv2::TopTankPressureData>();
-    ds.registerType<RIGv2::BottomTankPressureData>();
+    ds.registerType<RIGv2::OxVesselWeightData>();
+    ds.registerType<RIGv2::OxTankWeightData>();
+    ds.registerType<RIGv2::OxVesselPressureData>();
+    ds.registerType<RIGv2::OxFillingPressureData>();
+    ds.registerType<RIGv2::N2Vessel1PressureData>();
+    ds.registerType<RIGv2::N2Vessel2PressureData>();
+    ds.registerType<RIGv2::N2FillingPressureData>();
+    ds.registerType<RIGv2::OxTankTopPressureData>();
+    ds.registerType<RIGv2::OxTankBottomPressureData>();
     ds.registerType<RIGv2::ActuatorsData>();
     ds.registerType<RIGv2::GroundModeManagerData>();
     ds.registerType<RIGv2::TarsActionData>();
diff --git a/scripts/logdecoder/RIGv2/logdecoder.cpp b/scripts/logdecoder/RIGv2/logdecoder.cpp
index 6709b7eca9046bf014350cc9b2a115683a9757ed..666ae2f71b2185ac68989df5efbef11f8dccdc98 100644
--- a/scripts/logdecoder/RIGv2/logdecoder.cpp
+++ b/scripts/logdecoder/RIGv2/logdecoder.cpp
@@ -54,13 +54,17 @@ void registerTypes(Deserializer& ds)
 
     // Custom types
     ds.registerType<ADC1Data>();
+    ds.registerType<ADC2Data>();
     ds.registerType<TC1Data>();
-    ds.registerType<VesselWeightData>();
-    ds.registerType<TankWeightData>();
-    ds.registerType<VesselPressureData>();
-    ds.registerType<FillingPressureData>();
-    ds.registerType<TopTankPressureData>();
-    ds.registerType<BottomTankPressureData>();
+    ds.registerType<OxVesselWeightData>();
+    ds.registerType<OxTankWeightData>();
+    ds.registerType<OxVesselPressureData>();
+    ds.registerType<OxFillingPressureData>();
+    ds.registerType<N2Vessel1PressureData>();
+    ds.registerType<N2Vessel2PressureData>();
+    ds.registerType<N2FillingPressureData>();
+    ds.registerType<OxTankTopPressureData>();
+    ds.registerType<OxTankBottomPressureData>();
     ds.registerType<ActuatorsData>();
     ds.registerType<GroundModeManagerData>();
     ds.registerType<TarsActionData>();
diff --git a/src/RIGv2/CanHandler/CanHandler.cpp b/src/RIGv2/CanHandler/CanHandler.cpp
index 055ae6e57bae3043a192eaaa1f7e61c2606e7efc..42494b83b2c866f4996629dfe1c0957cd47b9342 100644
--- a/src/RIGv2/CanHandler/CanHandler.cpp
+++ b/src/RIGv2/CanHandler/CanHandler.cpp
@@ -205,7 +205,7 @@ void CanHandler::handleSensor(const Canbus::CanMessage& msg)
         {
             CanPressureData data = pressureDataFromCanMessage(msg);
             sdLogger.log(data);
-            sensors->setCanCCPress(data);
+            sensors->setCanCombustionChamberPressure(data);
             break;
         }
 
@@ -213,7 +213,7 @@ void CanHandler::handleSensor(const Canbus::CanMessage& msg)
         {
             CanPressureData data = pressureDataFromCanMessage(msg);
             sdLogger.log(data);
-            sensors->setCanTopTankPress(data);
+            sensors->setCanOxTankTopPressure(data);
             break;
         }
 
@@ -221,7 +221,7 @@ void CanHandler::handleSensor(const Canbus::CanMessage& msg)
         {
             CanPressureData data = pressureDataFromCanMessage(msg);
             sdLogger.log(data);
-            sensors->setCanBottomTankPress(data);
+            sensors->setCanOxTankBottomPressure(data);
             break;
         }
 
@@ -229,7 +229,7 @@ void CanHandler::handleSensor(const Canbus::CanMessage& msg)
         {
             CanTemperatureData data = temperatureDataFromCanMessage(msg);
             sdLogger.log(data);
-            sensors->setCanTankTemp(data);
+            sensors->setCanOxTankTemperature(data);
             break;
         }
 
diff --git a/src/RIGv2/Configs/SensorsConfig.h b/src/RIGv2/Configs/SensorsConfig.h
index 21dfeeb7d51eb4257853d9417d1cce5bbe876564..397a5bd8ac3759b9bd86a8d95dfbab42d4be0ea9 100644
--- a/src/RIGv2/Configs/SensorsConfig.h
+++ b/src/RIGv2/Configs/SensorsConfig.h
@@ -1,5 +1,5 @@
 /* Copyright (c) 2024 Skyward Experimental Rocketry
- * Authors: Davide Mor
+ * Authors: Davide Mor, 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
@@ -42,31 +42,11 @@ namespace Sensors
 
 namespace ADS131M08
 {
-
-constexpr Boardcore::ADS131M08Defs::OversamplingRatio OSR =
-    Boardcore::ADS131M08Defs::OversamplingRatio::OSR_8192;
+constexpr auto OSR = Boardcore::ADS131M08Defs::OversamplingRatio::OSR_8192;
 constexpr bool GLOBAL_CHOP_MODE_EN = true;
 
-constexpr float CH1_SHUNT_RESISTANCE = 29.4048;
-constexpr float CH2_SHUNT_RESISTANCE = 29.5830;
-constexpr float CH3_SHUNT_RESISTANCE = 29.4973;
-constexpr float CH4_SHUNT_RESISTANCE = 29.8849;
-
-// ADC channels definitions for various sensors
-constexpr Boardcore::ADS131M08Defs::Channel VESSEL_PT_CHANNEL =
-    Boardcore::ADS131M08Defs::Channel::CHANNEL_0;
-constexpr Boardcore::ADS131M08Defs::Channel FILLING_PT_CHANNEL =
-    Boardcore::ADS131M08Defs::Channel::CHANNEL_1;
-constexpr Boardcore::ADS131M08Defs::Channel BOTTOM_PT_CHANNEL =
-    Boardcore::ADS131M08Defs::Channel::CHANNEL_2;
-constexpr Boardcore::ADS131M08Defs::Channel TOP_PT_CHANNEL =
-    Boardcore::ADS131M08Defs::Channel::CHANNEL_3;
-constexpr Boardcore::ADS131M08Defs::Channel SERVO_CURRENT_CHANNEL =
-    Boardcore::ADS131M08Defs::Channel::CHANNEL_4;
-constexpr Boardcore::ADS131M08Defs::Channel VESSEL_LC_CHANNEL =
-    Boardcore::ADS131M08Defs::Channel::CHANNEL_5;
-constexpr Boardcore::ADS131M08Defs::Channel TANK_LC_CHANNEL =
-    Boardcore::ADS131M08Defs::Channel::CHANNEL_6;
+constexpr Hertz PERIOD = 100_hz;
+constexpr bool ENABLED = true;
 
 // Servo current sensor calibration data
 // - A: 0.0 V: 2.520
@@ -78,11 +58,39 @@ constexpr Boardcore::ADS131M08Defs::Channel TANK_LC_CHANNEL =
 // - A: 5.2 V: 2.441
 constexpr float SERVO_CURRENT_SCALE = 4.5466;
 constexpr float SERVO_CURRENT_ZERO  = 2.520 / SERVO_CURRENT_SCALE;
-
-constexpr Hertz PERIOD = 100_hz;
-constexpr bool ENABLED = true;
 }  // namespace ADS131M08
 
+namespace ADC_1
+{
+using Channel = Boardcore::ADS131M08Defs::Channel;
+
+constexpr auto OX_VESSEL_PT_CHANNEL   = Channel::CHANNEL_0;
+constexpr auto OX_FILLING_PT_CHANNEL  = Channel::CHANNEL_1;
+constexpr auto N2_VESSEL_1_PT_CHANNEL = Channel::CHANNEL_2;
+constexpr auto N2_VESSEL_2_PT_CHANNEL = Channel::CHANNEL_3;
+constexpr auto SERVO_CURRENT_CHANNEL  = Channel::CHANNEL_4;
+constexpr auto OX_VESSEL_LC_CHANNEL   = Channel::CHANNEL_5;
+constexpr auto OX_TANK_LC_CHANNEL     = Channel::CHANNEL_6;
+constexpr auto N2_FILLING_PT_CHANNEL  = Channel::CHANNEL_7;
+
+constexpr float CH0_SHUNT_RESISTANCE = 29.4048;  // TODO: check
+constexpr float CH1_SHUNT_RESISTANCE = 29.5830;  // TODO: check
+constexpr float CH2_SHUNT_RESISTANCE = 29.4973;  // TODO: check
+constexpr float CH3_SHUNT_RESISTANCE = 29.8849;  // TODO: check
+constexpr float CH7_SHUNT_RESISTANCE = 29.0;     // TODO: measure
+}  // namespace ADC_1
+
+namespace ADC_2
+{
+using Channel = Boardcore::ADS131M08Defs::Channel;
+
+constexpr auto OX_TANK_TOP_PT_CHANNEL    = Channel::CHANNEL_0;
+constexpr auto OX_TANK_BOTTOM_PT_CHANNEL = Channel::CHANNEL_1;
+
+constexpr float CH0_SHUNT_RESISTANCE = 29.0;  // TODO: measure
+constexpr float CH1_SHUNT_RESISTANCE = 29.0;  // TODO: measure
+}  // namespace ADC_2
+
 namespace MAX31856
 {
 constexpr Hertz PERIOD = 10_hz;
@@ -91,18 +99,25 @@ constexpr bool ENABLED = true;
 
 namespace Trafag
 {
-constexpr float FILLING_SHUNT_RESISTANCE     = ADS131M08::CH2_SHUNT_RESISTANCE;
-constexpr float TANK_TOP_SHUNT_RESISTANCE    = ADS131M08::CH4_SHUNT_RESISTANCE;
-constexpr float TANK_BOTTOM_SHUNT_RESISTANCE = ADS131M08::CH3_SHUNT_RESISTANCE;
-constexpr float VESSEL_SHUNT_RESISTANCE      = ADS131M08::CH1_SHUNT_RESISTANCE;
+constexpr float OX_VESSEL_SHUNT_RESISTANCE      = ADC_1::CH0_SHUNT_RESISTANCE;
+constexpr float OX_FILLING_SHUNT_RESISTANCE     = ADC_1::CH1_SHUNT_RESISTANCE;
+constexpr float N2_VESSEL1_SHUNT_RESISTANCE     = ADC_1::CH2_SHUNT_RESISTANCE;
+constexpr float N2_VESSEL2_SHUNT_RESISTANCE     = ADC_1::CH3_SHUNT_RESISTANCE;
+constexpr float N2_FILLING_SHUNT_RESISTANCE     = ADC_1::CH7_SHUNT_RESISTANCE;
+constexpr float OX_TANK_TOP_SHUNT_RESISTANCE    = ADC_2::CH0_SHUNT_RESISTANCE;
+constexpr float OX_TANK_BOTTOM_SHUNT_RESISTANCE = ADC_2::CH1_SHUNT_RESISTANCE;
 
 constexpr float MIN_CURRENT = 4;
 constexpr float MAX_CURRENT = 20;
 
-constexpr float FILLING_MAX_PRESSURE     = 250;  // bar
-constexpr float TANK_TOP_MAX_PRESSURE    = 250;  // bar
-constexpr float TANK_BOTTOM_MAX_PRESSURE = 100;  // bar
-constexpr float VESSEL_MAX_PRESSURE      = 100;  // bar
+// TODO: check depending on which trafags are used
+constexpr float OX_VESSEL_MAX_PRESSURE      = 100;  // bar
+constexpr float OX_FILLING_MAX_PRESSURE     = 250;  // bar
+constexpr float N2_VESSEL1_MAX_PRESSURE     = 400;  // bar
+constexpr float N2_VESSEL2_MAX_PRESSURE     = 400;  // bar
+constexpr float N2_FILLING_MAX_PRESSURE     = 400;  // bar
+constexpr float OX_TANK_TOP_MAX_PRESSURE    = 250;  // bar
+constexpr float OX_TANK_BOTTOM_MAX_PRESSURE = 100;  // bar
 }  // namespace Trafag
 
 namespace LoadCell
@@ -152,8 +167,7 @@ constexpr float VESSEL_P1_MASS    = 8.720;
 
 namespace InternalADC
 {
-constexpr Boardcore::InternalADC::Channel BATTERY_VOLTAGE_CHANNEL =
-    Boardcore::InternalADC::CH14;
+constexpr auto BATTERY_VOLTAGE_CHANNEL = Boardcore::InternalADC::CH14;
 
 constexpr float BATTERY_VOLTAGE_SCALE = 4.7917;
 constexpr Hertz PERIOD                = 10_hz;
diff --git a/src/RIGv2/Radio/Radio.cpp b/src/RIGv2/Radio/Radio.cpp
index 4e6b17fbfdbd187712ec007641aa21fad607d7c4..d35a38d320976c5db850cdb0160b87ef4697b56c 100644
--- a/src/RIGv2/Radio/Radio.cpp
+++ b/src/RIGv2/Radio/Radio.cpp
@@ -546,26 +546,19 @@ bool Radio::enqueueSystemTm(uint8_t tmId)
             tm.timestamp = TimestampTimer::getTimestamp();
 
             // Sensors
-            tm.rocket_mass     = sensors->getTankWeightLastSample().load;
-            tm.n2o_vessel_mass = sensors->getVesselWeightLastSample().load;
-
-            // TODO: methods below have mismatching names
-            tm.n2o_filling_pressure =
-                sensors->getVesselPressLastSample().pressure;
-            tm.n2_filling_pressure =
-                sensors->getFillingPressLastSample().pressure;
-            tm.n2o_vessel_pressure =
-                sensors->getBottomTankPressLastSample().pressure;
-            tm.n2_vessel_1_pressure =
-                sensors->getTopTankPressLastSample().pressure;
-
-            tm.n2_vessel_2_pressure = -1.f;  // TODO
-
-            tm.battery_voltage = sensors->getBatteryVoltageLastSample().voltage;
-            tm.current_consumption =
-                sensors->getServoCurrentLastSample().current;
+            tm.rocket_mass     = sensors->getOxTankWeight().load;
+            tm.n2o_vessel_mass = sensors->getOxVesselWeight().load;
+
+            tm.n2o_vessel_pressure  = sensors->getOxVesselPressure().pressure;
+            tm.n2o_filling_pressure = sensors->getOxFillingPressure().pressure;
+            tm.n2_filling_pressure  = sensors->getN2FillingPressure().pressure;
+            tm.n2_vessel_1_pressure = sensors->getN2Vessel1Pressure().pressure;
+            tm.n2_vessel_2_pressure = sensors->getN2Vessel2Pressure().pressure;
+
+            tm.battery_voltage     = sensors->getBatteryVoltage().voltage;
+            tm.current_consumption = sensors->getServoCurrent().current;
             tm.umbilical_current_consumption =
-                sensors->getUmbilicalCurrentLastSample().current;
+                sensors->getUmbilicalCurrent().current;
 
             // Log data
             LoggerStats stats = sdLogger.getStats();
@@ -641,15 +634,13 @@ bool Radio::enqueueSystemTm(uint8_t tmId)
             tm.timestamp = TimestampTimer::getTimestamp();
 
             // Sensors (either CAN or local)
-            tm.top_tank_pressure =
-                sensors->getTopTankPressLastSample().pressure;
+            tm.top_tank_pressure = sensors->getOxTankTopPressure().pressure;
             tm.bottom_tank_pressure =
-                sensors->getBottomTankPressLastSample().pressure;
+                sensors->getOxTankBottomPressure().pressure;
             tm.combustion_chamber_pressure =
-                sensors->getCCPressLastSample().pressure;
-            tm.tank_temperature = sensors->getTankTempLastSample().temperature;
-            tm.battery_voltage =
-                sensors->getMotorBatteryVoltageLastSample().voltage;
+                sensors->getCombustionChamberPressure().pressure;
+            tm.tank_temperature = sensors->getOxTankTemperature().temperature;
+            tm.battery_voltage  = sensors->getMotorBatteryVoltage().voltage;
 
             // Valve states
             tm.main_valve_state =
@@ -708,12 +699,39 @@ bool Radio::enqueueSensorTm(uint8_t tmId)
             tm.channel_7 =
                 data.getVoltage(ADS131M08Defs::Channel::CHANNEL_7).voltage;
             tm.timestamp = data.timestamp;
-            strcpy(tm.sensor_name, "ADS131M08");
+            strcpy(tm.sensor_name, "ADS131M08_1");
 
             mavlink_msg_adc_tm_encode(Config::Radio::MAV_SYSTEM_ID,
                                       Config::Radio::MAV_COMPONENT_ID, &msg,
                                       &tm);
             enqueuePacket(msg);
+
+            data = getModule<Sensors>()->getADC2LastSample();
+
+            tm.channel_0 =
+                data.getVoltage(ADS131M08Defs::Channel::CHANNEL_0).voltage;
+            tm.channel_1 =
+                data.getVoltage(ADS131M08Defs::Channel::CHANNEL_1).voltage;
+            tm.channel_2 =
+                data.getVoltage(ADS131M08Defs::Channel::CHANNEL_2).voltage;
+            tm.channel_3 =
+                data.getVoltage(ADS131M08Defs::Channel::CHANNEL_3).voltage;
+            tm.channel_4 =
+                data.getVoltage(ADS131M08Defs::Channel::CHANNEL_4).voltage;
+            tm.channel_5 =
+                data.getVoltage(ADS131M08Defs::Channel::CHANNEL_5).voltage;
+            tm.channel_6 =
+                data.getVoltage(ADS131M08Defs::Channel::CHANNEL_6).voltage;
+            tm.channel_7 =
+                data.getVoltage(ADS131M08Defs::Channel::CHANNEL_7).voltage;
+            tm.timestamp = data.timestamp;
+            strcpy(tm.sensor_name, "ADS131M08_2");
+
+            mavlink_msg_adc_tm_encode(Config::Radio::MAV_SYSTEM_ID,
+                                      Config::Radio::MAV_COMPONENT_ID, &msg,
+                                      &tm);
+            enqueuePacket(msg);
+
             return true;
         }
 
@@ -722,8 +740,7 @@ bool Radio::enqueueSensorTm(uint8_t tmId)
             mavlink_message_t msg;
             mavlink_pressure_tm_t tm;
 
-            PressureData data =
-                getModule<Sensors>()->getVesselPressLastSample();
+            PressureData data = getModule<Sensors>()->getOxVesselPressure();
 
             tm.timestamp = data.pressureTimestamp;
             tm.pressure  = data.pressure;
@@ -741,8 +758,7 @@ bool Radio::enqueueSensorTm(uint8_t tmId)
             mavlink_message_t msg;
             mavlink_pressure_tm_t tm;
 
-            PressureData data =
-                getModule<Sensors>()->getFillingPressLastSample();
+            PressureData data = getModule<Sensors>()->getOxFillingPressure();
 
             tm.timestamp = data.pressureTimestamp;
             tm.pressure  = data.pressure;
@@ -760,8 +776,7 @@ bool Radio::enqueueSensorTm(uint8_t tmId)
             mavlink_message_t msg;
             mavlink_pressure_tm_t tm;
 
-            PressureData data =
-                getModule<Sensors>()->getBottomTankPressLastSample();
+            PressureData data = getModule<Sensors>()->getOxTankBottomPressure();
 
             tm.timestamp = data.pressureTimestamp;
             tm.pressure  = data.pressure;
@@ -779,8 +794,7 @@ bool Radio::enqueueSensorTm(uint8_t tmId)
             mavlink_message_t msg;
             mavlink_pressure_tm_t tm;
 
-            PressureData data =
-                getModule<Sensors>()->getTopTankPressLastSample();
+            PressureData data = getModule<Sensors>()->getOxTankTopPressure();
 
             tm.timestamp = data.pressureTimestamp;
             tm.pressure  = data.pressure;
@@ -816,8 +830,7 @@ bool Radio::enqueueSensorTm(uint8_t tmId)
             mavlink_message_t msg;
             mavlink_load_tm_t tm;
 
-            LoadCellData data =
-                getModule<Sensors>()->getVesselWeightLastSample();
+            LoadCellData data = getModule<Sensors>()->getOxVesselWeight();
 
             tm.timestamp = data.loadTimestamp;
             tm.load      = data.load;
@@ -835,7 +848,7 @@ bool Radio::enqueueSensorTm(uint8_t tmId)
             mavlink_message_t msg;
             mavlink_load_tm_t tm;
 
-            LoadCellData data = getModule<Sensors>()->getTankWeightLastSample();
+            LoadCellData data = getModule<Sensors>()->getOxTankWeight();
 
             tm.timestamp = data.loadTimestamp;
             tm.load      = data.load;
@@ -853,8 +866,7 @@ bool Radio::enqueueSensorTm(uint8_t tmId)
             mavlink_message_t msg;
             mavlink_voltage_tm_t tm;
 
-            VoltageData data =
-                getModule<Sensors>()->getBatteryVoltageLastSample();
+            VoltageData data = getModule<Sensors>()->getBatteryVoltage();
 
             tm.timestamp = data.voltageTimestamp;
             tm.voltage   = data.voltage;
diff --git a/src/RIGv2/Sensors/Sensors.cpp b/src/RIGv2/Sensors/Sensors.cpp
index cf83ecd54f1cdb5b89c415926e450b47b1970b13..a6f3aed8463e97951d09bc7171b119663598069a 100644
--- a/src/RIGv2/Sensors/Sensors.cpp
+++ b/src/RIGv2/Sensors/Sensors.cpp
@@ -1,5 +1,5 @@
 /* Copyright (c) 2024 Skyward Experimental Rocketry
- * Authors: Davide Mor
+ * Authors: Davide Mor, 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
@@ -40,12 +40,13 @@ bool Sensors::start()
     if (Config::Sensors::ADS131M08::ENABLED)
     {
         adc1Init();
-        vesselPressureInit();
-        fillingPressureInit();
-        topTankPressureInit();
-        bottomTankPressureInit();
-        vesselWeightInit();
-        tankWeightInit();
+        adc2Init();
+        oxVesselPressureInit();
+        oxFillingPressureInit();
+        oxTankTopPressureInit();
+        oxTankBottomPressureInit();
+        oxVesselWeightInit();
+        oxTankWeightInit();
     }
 
     if (Config::Sensors::MAX31856::ENABLED)
@@ -71,99 +72,123 @@ ADS131M08Data Sensors::getADC1LastSample()
     return adc1 ? adc1->getLastSample() : ADS131M08Data{};
 }
 
+ADS131M08Data Sensors::getADC2LastSample()
+{
+    return adc2 ? adc2->getLastSample() : ADS131M08Data{};
+}
+
 MAX31856Data Sensors::getTc1LastSample()
 {
     return tc1 ? tc1->getLastSample() : MAX31856Data{};
 }
 
-PressureData Sensors::getVesselPressLastSample()
+PressureData Sensors::getOxVesselPressure()
+{
+    return oxVesselPressure ? oxVesselPressure->getLastSample()
+                            : PressureData{};
+}
+
+PressureData Sensors::getOxFillingPressure()
 {
-    return vesselPressure ? vesselPressure->getLastSample() : PressureData{};
+    return oxFillingPressure ? oxFillingPressure->getLastSample()
+                             : PressureData{};
 }
 
-PressureData Sensors::getFillingPressLastSample()
+PressureData Sensors::getN2Vessel1Pressure()
 {
-    return fillingPressure ? fillingPressure->getLastSample() : PressureData{};
+    return n2Vessel1Pressure ? n2Vessel1Pressure->getLastSample()
+                             : PressureData{};
 }
 
-PressureData Sensors::getTopTankPressLastSample()
+PressureData Sensors::getN2Vessel2Pressure()
+{
+    return n2Vessel2Pressure ? n2Vessel2Pressure->getLastSample()
+                             : PressureData{};
+}
+
+PressureData Sensors::getN2FillingPressure()
+{
+    return n2FillingPressure ? n2FillingPressure->getLastSample()
+                             : PressureData{};
+}
+
+PressureData Sensors::getOxTankTopPressure()
 {
     if (useCanData)
     {
-        return getCanTopTankPressLastSample();
+        return getCanOxTankTopPressure();
     }
     else
     {
-        return topTankPressure ? topTankPressure->getLastSample()
-                               : PressureData{};
+        return oxTankTopPressure ? oxTankTopPressure->getLastSample()
+                                 : PressureData{};
     }
 }
 
-PressureData Sensors::getBottomTankPressLastSample()
+PressureData Sensors::getOxTankBottomPressure()
 {
     if (useCanData)
     {
-        return getCanBottomTankPressLastSample();
+        return getCanOxTankBottomPressure();
     }
     else
     {
-        return bottomTankPressure ? bottomTankPressure->getLastSample()
-                                  : PressureData{};
+        return oxTankBottomPressure ? oxTankBottomPressure->getLastSample()
+                                    : PressureData{};
     }
 }
 
-PressureData Sensors::getCCPressLastSample()
+PressureData Sensors::getCombustionChamberPressure()
 {
     if (useCanData)
-        return getCanCCPressLastSample();
+        return getCanCombustionChamberPressure();
     else
         return PressureData{};
 }
 
-TemperatureData Sensors::getTankTempLastSample()
+TemperatureData Sensors::getOxTankTemperature()
 {
     if (useCanData)
-        return getCanTankTempLastSample();
+        return getCanTankTemperature();
     else
         return getTc1LastSample();
 }
 
-LoadCellData Sensors::getVesselWeightLastSample()
+LoadCellData Sensors::getOxVesselWeight()
 {
-    if (vesselWeight)
-        return vesselWeight->getLastSample();
+    if (oxVesselWeight)
+        return oxVesselWeight->getLastSample();
     else
         return {};
 }
 
-LoadCellData Sensors::getTankWeightLastSample()
+LoadCellData Sensors::getOxTankWeight()
 {
-    if (tankWeight)
-        return tankWeight->getLastSample();
+    if (oxTankWeight)
+        return oxTankWeight->getLastSample();
     else
         return {};
 }
 
-CurrentData Sensors::getUmbilicalCurrentLastSample()
+CurrentData Sensors::getUmbilicalCurrent()
 {
-    // TODO: Implement this
+    // TODO: Implement umbilical current
     return {};
 }
 
-CurrentData Sensors::getServoCurrentLastSample()
+CurrentData Sensors::getServoCurrent()
 {
     auto sample = getADC1LastSample();
 
     float current =
-        (sample
-             .voltage[(int)Config::Sensors::ADS131M08::SERVO_CURRENT_CHANNEL] -
+        (sample.voltage[(int)Config::Sensors::ADC_1::SERVO_CURRENT_CHANNEL] -
          Config::Sensors::ADS131M08::SERVO_CURRENT_ZERO) *
         Config::Sensors::ADS131M08::SERVO_CURRENT_SCALE;
     // Current reading are flipped
     return {sample.timestamp, -current / 5.0f * 50.0f};
 }
 
-VoltageData Sensors::getBatteryVoltageLastSample()
+VoltageData Sensors::getBatteryVoltage()
 {
     auto sample = getInternalADCLastSample();
 
@@ -174,66 +199,66 @@ VoltageData Sensors::getBatteryVoltageLastSample()
     return {sample.timestamp, voltage};
 }
 
-VoltageData Sensors::getMotorBatteryVoltageLastSample()
+VoltageData Sensors::getMotorBatteryVoltage()
 {
     if (useCanData)
-        return getCanMotorBatteryVoltageLastSample();
+        return getCanMotorBatteryVoltage();
     else
         return VoltageData{};
 }
 
-PressureData Sensors::getCanTopTankPressLastSample()
+PressureData Sensors::getCanOxTankTopPressure()
 {
     Lock<FastMutex> lock{canMutex};
-    return canTopTankPressure;
+    return canOxTankBottomPressure;
 }
 
-PressureData Sensors::getCanBottomTankPressLastSample()
+PressureData Sensors::getCanOxTankBottomPressure()
 {
     Lock<FastMutex> lock{canMutex};
-    return canBottomTankPressure;
+    return canOxTankTopPressure;
 }
 
-PressureData Sensors::getCanCCPressLastSample()
+PressureData Sensors::getCanCombustionChamberPressure()
 {
     Lock<FastMutex> lock{canMutex};
-    return canCCPressure;
+    return canCombustionChamberPressure;
 }
 
-TemperatureData Sensors::getCanTankTempLastSample()
+TemperatureData Sensors::getCanTankTemperature()
 {
     Lock<FastMutex> lock{canMutex};
-    return canTankTemperature;
+    return canOxTankTemperature;
 }
 
-VoltageData Sensors::getCanMotorBatteryVoltageLastSample()
+VoltageData Sensors::getCanMotorBatteryVoltage()
 {
     Lock<FastMutex> lock{canMutex};
     return canMotorBatteryVoltage;
 }
 
-void Sensors::setCanTopTankPress(PressureData data)
+void Sensors::setCanOxTankTopPressure(PressureData data)
 {
     Lock<FastMutex> lock{canMutex};
-    canTopTankPressure = data;
+    canOxTankBottomPressure = data;
 }
 
-void Sensors::setCanBottomTankPress(PressureData data)
+void Sensors::setCanOxTankBottomPressure(PressureData data)
 {
     Lock<FastMutex> lock{canMutex};
-    canBottomTankPressure = data;
+    canOxTankTopPressure = data;
 }
 
-void Sensors::setCanCCPress(PressureData data)
+void Sensors::setCanCombustionChamberPressure(PressureData data)
 {
     Lock<FastMutex> lock{canMutex};
-    canCCPressure = data;
+    canCombustionChamberPressure = data;
 }
 
-void Sensors::setCanTankTemp(TemperatureData data)
+void Sensors::setCanOxTankTemperature(TemperatureData data)
 {
     Lock<FastMutex> lock{canMutex};
-    canTankTemperature = data;
+    canOxTankTemperature = data;
 }
 
 void Sensors::setCanMotorBatteryVoltage(VoltageData data)
@@ -246,20 +271,20 @@ void Sensors::switchToCanSensors() { useCanData = true; }
 
 void Sensors::calibrate()
 {
-    Stats vesselStats, tankStats;
+    Stats oxVesselStats, oxTankStats;
 
     for (unsigned int i = 0;
          i < Config::Sensors::LoadCell::CALIBRATE_SAMPLE_COUNT; i++)
     {
         // Tank readings WITHOUT offsets
-        vesselStats.add(vesselWeight->getLastSample().load);
-        tankStats.add(tankWeight->getLastSample().load);
+        oxVesselStats.add(oxVesselWeight->getLastSample().load);
+        oxTankStats.add(oxTankWeight->getLastSample().load);
 
         Thread::sleep(Config::Sensors::LoadCell::CALIBRATE_SAMPLE_PERIOD);
     }
 
-    vesselWeight->updateOffset(vesselStats.getStats().mean);
-    tankWeight->updateOffset(tankStats.getStats().mean);
+    oxVesselWeight->updateOffset(oxVesselStats.getStats().mean);
+    oxTankWeight->updateOffset(oxTankStats.getStats().mean);
 }
 
 std::vector<SensorInfo> Sensors::getSensorInfos()
@@ -268,32 +293,25 @@ std::vector<SensorInfo> Sensors::getSensorInfos()
     {
         std::vector<SensorInfo> infos{};
 
-        if (vesselWeight)
-            infos.push_back(manager->getSensorInfo(vesselWeight.get()));
-
-        if (tankWeight)
-            infos.push_back(manager->getSensorInfo(tankWeight.get()));
-
-        if (vesselPressure)
-            infos.push_back(manager->getSensorInfo(vesselPressure.get()));
-
-        if (fillingPressure)
-            infos.push_back(manager->getSensorInfo(fillingPressure.get()));
-
-        if (topTankPressure)
-            infos.push_back(manager->getSensorInfo(topTankPressure.get()));
-
-        if (bottomTankPressure)
-            infos.push_back(manager->getSensorInfo(bottomTankPressure.get()));
-
-        if (internalAdc)
-            infos.push_back(manager->getSensorInfo(internalAdc.get()));
-
-        if (adc1)
-            infos.push_back(manager->getSensorInfo(adc1.get()));
-
-        if (tc1)
-            infos.push_back(manager->getSensorInfo(tc1.get()));
+#define PUSH_SENSOR_INFO(instance, name)                         \
+    if (instance)                                                \
+        infos.push_back(manager->getSensorInfo(instance.get())); \
+    else                                                         \
+        infos.push_back(SensorInfo { #name, 0, nullptr, false })
+
+        PUSH_SENSOR_INFO(adc1, "ADC1");
+        PUSH_SENSOR_INFO(adc2, "ADC2");
+        PUSH_SENSOR_INFO(tc1, "TC1");
+        PUSH_SENSOR_INFO(internalAdc, "InternalADC");
+        PUSH_SENSOR_INFO(oxVesselPressure, "OxVesselPressure");
+        PUSH_SENSOR_INFO(oxFillingPressure, "OxFillingPressure");
+        PUSH_SENSOR_INFO(n2Vessel1Pressure, "N2Vessel1Pressure");
+        PUSH_SENSOR_INFO(n2Vessel2Pressure, "N2Vessel2Pressure");
+        PUSH_SENSOR_INFO(n2FillingPressure, "N2FillingPressure");
+        PUSH_SENSOR_INFO(oxTankTopPressure, "OxTankTopPressure");
+        PUSH_SENSOR_INFO(oxTankBottomPressure, "OxTankBotPressure");
+        PUSH_SENSOR_INFO(oxVesselWeight, "OxVesselWeight");
+        PUSH_SENSOR_INFO(oxTankWeight, "OxTankWeight");
 
         return infos;
     }
@@ -333,65 +351,101 @@ void Sensors::adc1Init()
         Config::Sensors::ADS131M08::GLOBAL_CHOP_MODE_EN;
 
     // Disable all channels
-    config.channelsConfig[0].enabled = false;
-    config.channelsConfig[1].enabled = false;
-    config.channelsConfig[2].enabled = false;
-    config.channelsConfig[3].enabled = false;
-    config.channelsConfig[4].enabled = false;
-    config.channelsConfig[5].enabled = false;
-    config.channelsConfig[6].enabled = false;
-    config.channelsConfig[7].enabled = false;
+    for (auto& channel : config.channelsConfig)
+        channel.enabled = false;
 
     // Configure all required channels
-    config.channelsConfig[(int)Config::Sensors::ADS131M08::VESSEL_PT_CHANNEL] =
+    config.channelsConfig[(int)Config::Sensors::ADC_1::OX_VESSEL_PT_CHANNEL] = {
+        .enabled = true,
+        .pga     = ADS131M08Defs::PGA::PGA_1,
+        .offset  = 0,
+        .gain    = 1.0};
+
+    config.channelsConfig[(int)Config::Sensors::ADC_1::OX_FILLING_PT_CHANNEL] =
+        {.enabled = true,
+         .pga     = ADS131M08Defs::PGA::PGA_1,
+         .offset  = 0,
+         .gain    = 1.0};
+
+    config.channelsConfig[(int)Config::Sensors::ADC_1::N2_VESSEL_1_PT_CHANNEL] =
         {.enabled = true,
          .pga     = ADS131M08Defs::PGA::PGA_1,
          .offset  = 0,
          .gain    = 1.0};
 
-    config.channelsConfig[(int)Config::Sensors::ADS131M08::FILLING_PT_CHANNEL] =
+    config.channelsConfig[(int)Config::Sensors::ADC_1::N2_VESSEL_2_PT_CHANNEL] =
         {.enabled = true,
          .pga     = ADS131M08Defs::PGA::PGA_1,
          .offset  = 0,
          .gain    = 1.0};
 
-    config.channelsConfig[(int)Config::Sensors::ADS131M08::BOTTOM_PT_CHANNEL] =
+    config.channelsConfig[(int)Config::Sensors::ADC_1::SERVO_CURRENT_CHANNEL] =
         {.enabled = true,
          .pga     = ADS131M08Defs::PGA::PGA_1,
          .offset  = 0,
          .gain    = 1.0};
 
-    config.channelsConfig[(int)Config::Sensors::ADS131M08::TOP_PT_CHANNEL] = {
+    config.channelsConfig[(int)Config::Sensors::ADC_1::OX_VESSEL_LC_CHANNEL] = {
         .enabled = true,
-        .pga     = ADS131M08Defs::PGA::PGA_1,
+        .pga     = ADS131M08Defs::PGA::PGA_32,
         .offset  = 0,
         .gain    = 1.0};
 
-    config.channelsConfig[(
-        int)Config::Sensors::ADS131M08::SERVO_CURRENT_CHANNEL] = {
+    config.channelsConfig[(int)Config::Sensors::ADC_1::OX_TANK_LC_CHANNEL] = {
         .enabled = true,
-        .pga     = ADS131M08Defs::PGA::PGA_1,
+        .pga     = ADS131M08Defs::PGA::PGA_32,
         .offset  = 0,
         .gain    = 1.0};
 
-    config.channelsConfig[(int)Config::Sensors::ADS131M08::VESSEL_LC_CHANNEL] =
+    config.channelsConfig[(int)Config::Sensors::ADC_1::N2_FILLING_PT_CHANNEL] =
         {.enabled = true,
-         .pga     = ADS131M08Defs::PGA::PGA_32,
+         .pga     = ADS131M08Defs::PGA::PGA_1,
          .offset  = 0,
          .gain    = 1.0};
 
-    config.channelsConfig[(int)Config::Sensors::ADS131M08::TANK_LC_CHANNEL] = {
+    adc1 = std::make_unique<ADS131M08>(getModule<Buses>()->getADS131M08_1(),
+                                       sensors::ADS131_1::cs::getPin(),
+                                       spiConfig, config);
+}
+
+void Sensors::adc1Callback() { sdLogger.log(ADC1Data{getADC1LastSample()}); }
+
+void Sensors::adc2Init()
+{
+    SPIBusConfig spiConfig = {};
+    spiConfig.mode         = SPI::Mode::MODE_0;
+    spiConfig.clockDivider = SPI::ClockDivider::DIV_32;
+
+    ADS131M08::Config config = {};
+    // Setup global configurations
+    config.oversamplingRatio = Config::Sensors::ADS131M08::OSR;
+    config.globalChopModeEnabled =
+        Config::Sensors::ADS131M08::GLOBAL_CHOP_MODE_EN;
+
+    // Disable all channels
+    for (auto& channel : config.channelsConfig)
+        channel.enabled = false;
+
+    // Configure all required channels
+    config.channelsConfig[(int)Config::Sensors::ADC_2::OX_TANK_TOP_PT_CHANNEL] =
+        {.enabled = true,
+         .pga     = ADS131M08Defs::PGA::PGA_1,
+         .offset  = 0,
+         .gain    = 1.0};
+
+    config.channelsConfig[(
+        int)Config::Sensors::ADC_2::OX_TANK_BOTTOM_PT_CHANNEL] = {
         .enabled = true,
-        .pga     = ADS131M08Defs::PGA::PGA_32,
+        .pga     = ADS131M08Defs::PGA::PGA_1,
         .offset  = 0,
         .gain    = 1.0};
 
-    adc1 = std::make_unique<ADS131M08>(getModule<Buses>()->getADS131M08_1(),
-                                       sensors::ADS131_1::cs::getPin(),
+    adc2 = std::make_unique<ADS131M08>(getModule<Buses>()->getADS131M08_2(),
+                                       sensors::ADS131_2::cs::getPin(),
                                        spiConfig, config);
 }
 
-void Sensors::adc1Callback() { sdLogger.log(ADC1Data{getADC1LastSample()}); }
+void Sensors::adc2Callback() { sdLogger.log(ADC2Data{getADC2LastSample()}); }
 
 void Sensors::tc1Init()
 {
@@ -405,94 +459,155 @@ void Sensors::tc1Init()
 
 void Sensors::tc1Callback() { sdLogger.log(TC1Data{getTc1LastSample()}); }
 
-void Sensors::vesselPressureInit()
+void Sensors::oxVesselPressureInit()
 {
-    vesselPressure = std::make_unique<TrafagPressureSensor>(
+    oxVesselPressure = std::make_unique<TrafagPressureSensor>(
         [this]()
         {
             auto sample = getADC1LastSample();
             return sample.getVoltage(
-                Config::Sensors::ADS131M08::VESSEL_PT_CHANNEL);
+                Config::Sensors::ADC_1::OX_VESSEL_PT_CHANNEL);
         },
-        Config::Sensors::Trafag::VESSEL_SHUNT_RESISTANCE,
-        Config::Sensors::Trafag::VESSEL_MAX_PRESSURE,
+        Config::Sensors::Trafag::OX_VESSEL_SHUNT_RESISTANCE,
+        Config::Sensors::Trafag::OX_VESSEL_MAX_PRESSURE,
         Config::Sensors::Trafag::MIN_CURRENT,
         Config::Sensors::Trafag::MAX_CURRENT);
 }
 
-void Sensors::vesselPressureCallback()
+void Sensors::oxVesselPressureCallback()
 {
-    sdLogger.log(VesselPressureData{getVesselPressLastSample()});
+    sdLogger.log(OxVesselPressureData{getOxVesselPressure()});
 }
 
-void Sensors::fillingPressureInit()
+void Sensors::oxFillingPressureInit()
 {
-    fillingPressure = std::make_unique<TrafagPressureSensor>(
+    oxFillingPressure = std::make_unique<TrafagPressureSensor>(
         [this]()
         {
             auto sample = getADC1LastSample();
             return sample.getVoltage(
-                Config::Sensors::ADS131M08::FILLING_PT_CHANNEL);
+                Config::Sensors::ADC_1::OX_FILLING_PT_CHANNEL);
         },
-        Config::Sensors::Trafag::FILLING_SHUNT_RESISTANCE,
-        Config::Sensors::Trafag::FILLING_MAX_PRESSURE,
+        Config::Sensors::Trafag::OX_FILLING_SHUNT_RESISTANCE,
+        Config::Sensors::Trafag::OX_FILLING_MAX_PRESSURE,
         Config::Sensors::Trafag::MIN_CURRENT,
         Config::Sensors::Trafag::MAX_CURRENT);
 }
 
-void Sensors::fillingPressureCallback()
+void Sensors::oxFillingPressureCallback()
 {
-    sdLogger.log(FillingPressureData{getFillingPressLastSample()});
+    sdLogger.log(OxFillingPressureData{getOxFillingPressure()});
 }
 
-void Sensors::topTankPressureInit()
+void Sensors::n2Vessel1PressureInit()
 {
-    topTankPressure = std::make_unique<TrafagPressureSensor>(
+    n2Vessel1Pressure = std::make_unique<TrafagPressureSensor>(
         [this]()
         {
             auto sample = getADC1LastSample();
             return sample.getVoltage(
-                Config::Sensors::ADS131M08::TOP_PT_CHANNEL);
+                Config::Sensors::ADC_1::N2_VESSEL_1_PT_CHANNEL);
         },
-        Config::Sensors::Trafag::TANK_TOP_SHUNT_RESISTANCE,
-        Config::Sensors::Trafag::TANK_TOP_MAX_PRESSURE,
+        Config::Sensors::Trafag::N2_VESSEL1_SHUNT_RESISTANCE,
+        Config::Sensors::Trafag::N2_VESSEL1_MAX_PRESSURE,
         Config::Sensors::Trafag::MIN_CURRENT,
         Config::Sensors::Trafag::MAX_CURRENT);
 }
 
-void Sensors::topTankPressureCallback()
+void Sensors::n2Vessel1PressureCallback()
 {
-    sdLogger.log(TopTankPressureData{topTankPressure->getLastSample()});
+    sdLogger.log(N2Vessel1PressureData{getN2Vessel1Pressure()});
 }
 
-void Sensors::bottomTankPressureInit()
+void Sensors::n2Vessel2PressureInit()
 {
-    bottomTankPressure = std::make_unique<TrafagPressureSensor>(
+    n2Vessel2Pressure = std::make_unique<TrafagPressureSensor>(
         [this]()
         {
             auto sample = getADC1LastSample();
             return sample.getVoltage(
-                Config::Sensors::ADS131M08::BOTTOM_PT_CHANNEL);
+                Config::Sensors::ADC_1::N2_VESSEL_2_PT_CHANNEL);
+        },
+        Config::Sensors::Trafag::N2_VESSEL2_SHUNT_RESISTANCE,
+        Config::Sensors::Trafag::N2_VESSEL2_MAX_PRESSURE,
+        Config::Sensors::Trafag::MIN_CURRENT,
+        Config::Sensors::Trafag::MAX_CURRENT);
+}
+
+void Sensors::n2Vessel2PressureCallback()
+{
+    sdLogger.log(N2Vessel2PressureData{getN2Vessel2Pressure()});
+}
+
+void Sensors::n2FillingPressureInit()
+{
+    n2FillingPressure = std::make_unique<TrafagPressureSensor>(
+        [this]()
+        {
+            auto sample = getADC1LastSample();
+            return sample.getVoltage(
+                Config::Sensors::ADC_1::N2_FILLING_PT_CHANNEL);
+        },
+        Config::Sensors::Trafag::N2_FILLING_SHUNT_RESISTANCE,
+        Config::Sensors::Trafag::N2_FILLING_MAX_PRESSURE,
+        Config::Sensors::Trafag::MIN_CURRENT,
+        Config::Sensors::Trafag::MAX_CURRENT);
+}
+
+void Sensors::n2FillingPressureCallback()
+{
+    sdLogger.log(N2FillingPressureData{getN2FillingPressure()});
+}
+
+void Sensors::oxTankTopPressureInit()
+{
+    oxTankTopPressure = std::make_unique<TrafagPressureSensor>(
+        [this]()
+        {
+            auto sample = getADC2LastSample();
+            return sample.getVoltage(
+                Config::Sensors::ADC_2::OX_TANK_TOP_PT_CHANNEL);
         },
-        Config::Sensors::Trafag::TANK_BOTTOM_SHUNT_RESISTANCE,
-        Config::Sensors::Trafag::TANK_BOTTOM_MAX_PRESSURE,
+        Config::Sensors::Trafag::OX_TANK_TOP_SHUNT_RESISTANCE,
+        Config::Sensors::Trafag::OX_TANK_TOP_MAX_PRESSURE,
         Config::Sensors::Trafag::MIN_CURRENT,
         Config::Sensors::Trafag::MAX_CURRENT);
 }
 
-void Sensors::bottomTankPressureCallback()
+void Sensors::oxTankTopPressureCallback()
 {
-    sdLogger.log(BottomTankPressureData{bottomTankPressure->getLastSample()});
+    sdLogger.log(OxTankTopPressureData{oxTankTopPressure->getLastSample()});
 }
 
-void Sensors::vesselWeightInit()
+void Sensors::oxTankBottomPressureInit()
 {
-    vesselWeight = std::make_unique<TwoPointAnalogLoadCell>(
+    oxTankBottomPressure = std::make_unique<TrafagPressureSensor>(
+        [this]()
+        {
+            auto sample = getADC2LastSample();
+            return sample.getVoltage(
+                Config::Sensors::ADC_2::OX_TANK_BOTTOM_PT_CHANNEL);
+        },
+        Config::Sensors::Trafag::OX_TANK_BOTTOM_SHUNT_RESISTANCE,
+        Config::Sensors::Trafag::OX_TANK_BOTTOM_MAX_PRESSURE,
+        Config::Sensors::Trafag::MIN_CURRENT,
+        Config::Sensors::Trafag::MAX_CURRENT);
+}
+
+void Sensors::oxTankBottomPressureCallback()
+{
+    sdLogger.log(
+        OxTankBottomPressureData{oxTankBottomPressure->getLastSample()});
+}
+
+void Sensors::oxVesselWeightInit()
+{
+    oxVesselWeight = std::make_unique<TwoPointAnalogLoadCell>(
         [this]()
         {
             auto sample = getADC1LastSample();
             return sample.getVoltage(
-                Config::Sensors::ADS131M08::VESSEL_LC_CHANNEL);
+                Config::Sensors::ADC_1::OX_VESSEL_LC_CHANNEL);
         },
         Config::Sensors::LoadCell::VESSEL_P0_VOLTAGE,
         Config::Sensors::LoadCell::VESSEL_P0_MASS,
@@ -500,19 +615,19 @@ void Sensors::vesselWeightInit()
         Config::Sensors::LoadCell::VESSEL_P1_MASS);
 }
 
-void Sensors::vesselWeightCallback()
+void Sensors::oxVesselWeightCallback()
 {
-    sdLogger.log(VesselWeightData{getVesselWeightLastSample()});
+    sdLogger.log(OxVesselWeightData{getOxVesselWeight()});
 }
 
-void Sensors::tankWeightInit()
+void Sensors::oxTankWeightInit()
 {
-    tankWeight = std::make_unique<TwoPointAnalogLoadCell>(
+    oxTankWeight = std::make_unique<TwoPointAnalogLoadCell>(
         [this]()
         {
             auto sample = getADC1LastSample();
             return sample.getVoltage(
-                Config::Sensors::ADS131M08::TANK_LC_CHANNEL);
+                Config::Sensors::ADC_1::OX_TANK_LC_CHANNEL);
         },
         Config::Sensors::LoadCell::TANK_P0_VOLTAGE,
         Config::Sensors::LoadCell::TANK_P0_MASS,
@@ -520,9 +635,9 @@ void Sensors::tankWeightInit()
         Config::Sensors::LoadCell::TANK_P1_MASS);
 }
 
-void Sensors::tankWeightCallback()
+void Sensors::oxTankWeightCallback()
 {
-    sdLogger.log(TankWeightData{getTankWeightLastSample()});
+    sdLogger.log(OxTankWeightData{getOxTankWeight()});
 }
 
 bool Sensors::sensorManagerInit()
@@ -534,7 +649,7 @@ bool Sensors::sensorManagerInit()
 
     if (internalAdc)
     {
-        SensorInfo info("InternalAdc", Config::Sensors::InternalADC::PERIOD,
+        SensorInfo info("InternalADC", Config::Sensors::InternalADC::PERIOD,
                         [this]() { internalAdcCallback(); });
         map.emplace(internalAdc.get(), info);
     }
@@ -546,6 +661,13 @@ bool Sensors::sensorManagerInit()
         map.emplace(std::make_pair(adc1.get(), info));
     }
 
+    if (adc2)
+    {
+        SensorInfo info("ADS131M08_2", Config::Sensors::ADS131M08::PERIOD,
+                        [this]() { adc2Callback(); });
+        map.emplace(std::make_pair(adc2.get(), info));
+    }
+
     if (tc1)
     {
         SensorInfo info("MAX31856_1", Config::Sensors::MAX31856::PERIOD,
@@ -553,47 +675,67 @@ bool Sensors::sensorManagerInit()
         map.emplace(std::make_pair(tc1.get(), info));
     }
 
-    if (vesselPressure)
+    if (oxVesselPressure)
+    {
+        SensorInfo info("OxVesselPressure", Config::Sensors::ADS131M08::PERIOD,
+                        [this]() { oxVesselPressureCallback(); });
+        map.emplace(std::make_pair(oxVesselPressure.get(), info));
+    }
+
+    if (oxFillingPressure)
+    {
+        SensorInfo info("OxFillingPressure", Config::Sensors::ADS131M08::PERIOD,
+                        [this]() { oxFillingPressureCallback(); });
+        map.emplace(std::make_pair(oxFillingPressure.get(), info));
+    }
+
+    if (n2Vessel1Pressure)
+    {
+        SensorInfo info("N2Vessel1Pressure", Config::Sensors::ADS131M08::PERIOD,
+                        [this]() { n2Vessel1PressureCallback(); });
+        map.emplace(std::make_pair(n2Vessel1Pressure.get(), info));
+    }
+
+    if (n2Vessel2Pressure)
     {
-        SensorInfo info("VesselPressure", Config::Sensors::ADS131M08::PERIOD,
-                        [this]() { vesselPressureCallback(); });
-        map.emplace(std::make_pair(vesselPressure.get(), info));
+        SensorInfo info("N2Vessel2Pressure", Config::Sensors::ADS131M08::PERIOD,
+                        [this]() { n2Vessel2PressureCallback(); });
+        map.emplace(std::make_pair(n2Vessel2Pressure.get(), info));
     }
 
-    if (fillingPressure)
+    if (n2FillingPressure)
     {
-        SensorInfo info("FillingPressure", Config::Sensors::ADS131M08::PERIOD,
-                        [this]() { fillingPressureCallback(); });
-        map.emplace(std::make_pair(fillingPressure.get(), info));
+        SensorInfo info("N2FillingPressure", Config::Sensors::ADS131M08::PERIOD,
+                        [this]() { n2FillingPressureCallback(); });
+        map.emplace(std::make_pair(n2FillingPressure.get(), info));
     }
 
-    if (topTankPressure)
+    if (oxTankTopPressure)
     {
-        SensorInfo info("TopTankPressure", Config::Sensors::ADS131M08::PERIOD,
-                        [this]() { topTankPressureCallback(); });
-        map.emplace(std::make_pair(topTankPressure.get(), info));
+        SensorInfo info("OxTankTopPressure", Config::Sensors::ADS131M08::PERIOD,
+                        [this]() { oxTankTopPressureCallback(); });
+        map.emplace(std::make_pair(oxTankTopPressure.get(), info));
     }
 
-    if (bottomTankPressure)
+    if (oxTankBottomPressure)
     {
-        SensorInfo info("BottomTankPressure",
-                        Config::Sensors::ADS131M08::PERIOD,
-                        [this]() { bottomTankPressureCallback(); });
-        map.emplace(std::make_pair(bottomTankPressure.get(), info));
+        SensorInfo info("OxTankBotPressure", Config::Sensors::ADS131M08::PERIOD,
+                        [this]() { oxTankBottomPressureCallback(); });
+        map.emplace(std::make_pair(oxTankBottomPressure.get(), info));
     }
 
-    if (vesselWeight)
+    if (oxVesselWeight)
     {
-        SensorInfo info("VesselWeight", Config::Sensors::ADS131M08::PERIOD,
-                        [this]() { vesselWeightCallback(); });
-        map.emplace(std::make_pair(vesselWeight.get(), info));
+        SensorInfo info("OxVesselWeight", Config::Sensors::ADS131M08::PERIOD,
+                        [this]() { oxVesselWeightCallback(); });
+        map.emplace(std::make_pair(oxVesselWeight.get(), info));
     }
 
-    if (tankWeight)
+    if (oxTankWeight)
     {
-        SensorInfo info("TankWeight", Config::Sensors::ADS131M08::PERIOD,
-                        [this]() { tankWeightCallback(); });
-        map.emplace(std::make_pair(tankWeight.get(), info));
+        SensorInfo info("OxTankWeight", Config::Sensors::ADS131M08::PERIOD,
+                        [this]() { oxTankWeightCallback(); });
+        map.emplace(std::make_pair(oxTankWeight.get(), info));
     }
 
     manager = std::make_unique<SensorManager>(map, &scheduler);
diff --git a/src/RIGv2/Sensors/Sensors.h b/src/RIGv2/Sensors/Sensors.h
index c349b48b95fc2b8e668de38f629501d4cd6d3866..06a5ceb1f46d841d454c63717cfd155ad9a94bd5 100644
--- a/src/RIGv2/Sensors/Sensors.h
+++ b/src/RIGv2/Sensors/Sensors.h
@@ -1,5 +1,5 @@
 /* Copyright (c) 2024 Skyward Experimental Rocketry
- * Authors: Davide Mor
+ * Authors: Davide Mor, 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
@@ -55,55 +55,70 @@ public:
     // Getters for raw data coming from sensors
     Boardcore::InternalADCData getInternalADCLastSample();
     Boardcore::ADS131M08Data getADC1LastSample();
+    Boardcore::ADS131M08Data getADC2LastSample();
     Boardcore::MAX31856Data getTc1LastSample();
 
     // Getters for processed data
-    Boardcore::PressureData getVesselPressLastSample();
-    Boardcore::PressureData getFillingPressLastSample();
-    Boardcore::PressureData getTopTankPressLastSample();
-    Boardcore::PressureData getBottomTankPressLastSample();
-    Boardcore::PressureData getCCPressLastSample();
-    Boardcore::TemperatureData getTankTempLastSample();
-    Boardcore::LoadCellData getVesselWeightLastSample();
-    Boardcore::LoadCellData getTankWeightLastSample();
-    Boardcore::CurrentData getUmbilicalCurrentLastSample();
-    Boardcore::CurrentData getServoCurrentLastSample();
-    Boardcore::VoltageData getBatteryVoltageLastSample();
-    Boardcore::VoltageData getMotorBatteryVoltageLastSample();
-
-    Boardcore::PressureData getCanTopTankPressLastSample();
-    Boardcore::PressureData getCanBottomTankPressLastSample();
-    Boardcore::PressureData getCanCCPressLastSample();
-    Boardcore::TemperatureData getCanTankTempLastSample();
-    Boardcore::VoltageData getCanMotorBatteryVoltageLastSample();
+    Boardcore::PressureData getOxVesselPressure();
+    Boardcore::PressureData getOxFillingPressure();
+    Boardcore::PressureData getN2Vessel1Pressure();
+    Boardcore::PressureData getN2Vessel2Pressure();
+    Boardcore::PressureData getN2FillingPressure();
+    Boardcore::PressureData getOxTankTopPressure();
+    Boardcore::PressureData getOxTankBottomPressure();
+    Boardcore::PressureData getCombustionChamberPressure();
+
+    Boardcore::TemperatureData getOxTankTemperature();
+    Boardcore::LoadCellData getOxVesselWeight();
+    Boardcore::LoadCellData getOxTankWeight();
+
+    Boardcore::CurrentData getUmbilicalCurrent();
+    Boardcore::CurrentData getServoCurrent();
+    Boardcore::VoltageData getBatteryVoltage();
+    Boardcore::VoltageData getMotorBatteryVoltage();
+
+    Boardcore::PressureData getCanOxTankTopPressure();
+    Boardcore::PressureData getCanOxTankBottomPressure();
+    Boardcore::PressureData getCanCombustionChamberPressure();
+    Boardcore::TemperatureData getCanTankTemperature();
+    Boardcore::VoltageData getCanMotorBatteryVoltage();
 
     std::vector<Boardcore::SensorInfo> getSensorInfos();
 
-    void setCanTopTankPress(Boardcore::PressureData data);
-    void setCanBottomTankPress(Boardcore::PressureData data);
-    void setCanCCPress(Boardcore::PressureData data);
-    void setCanTankTemp(Boardcore::TemperatureData data);
+    void setCanOxTankTopPressure(Boardcore::PressureData data);
+    void setCanOxTankBottomPressure(Boardcore::PressureData data);
+    void setCanCombustionChamberPressure(Boardcore::PressureData data);
+    void setCanOxTankTemperature(Boardcore::TemperatureData data);
     void setCanMotorBatteryVoltage(Boardcore::VoltageData data);
     void switchToCanSensors();
 
 private:
-    void vesselPressureInit();
-    void vesselPressureCallback();
+    void oxVesselPressureInit();
+    void oxVesselPressureCallback();
 
-    void fillingPressureInit();
-    void fillingPressureCallback();
+    void oxFillingPressureInit();
+    void oxFillingPressureCallback();
 
-    void topTankPressureInit();
-    void topTankPressureCallback();
+    void n2Vessel1PressureInit();
+    void n2Vessel1PressureCallback();
 
-    void bottomTankPressureInit();
-    void bottomTankPressureCallback();
+    void n2Vessel2PressureInit();
+    void n2Vessel2PressureCallback();
 
-    void vesselWeightInit();
-    void vesselWeightCallback();
+    void n2FillingPressureInit();
+    void n2FillingPressureCallback();
 
-    void tankWeightInit();
-    void tankWeightCallback();
+    void oxTankTopPressureInit();
+    void oxTankTopPressureCallback();
+
+    void oxTankBottomPressureInit();
+    void oxTankBottomPressureCallback();
+
+    void oxVesselWeightInit();
+    void oxVesselWeightCallback();
+
+    void oxTankWeightInit();
+    void oxTankWeightCallback();
 
     void internalAdcInit();
     void internalAdcCallback();
@@ -111,6 +126,9 @@ private:
     void adc1Init();
     void adc1Callback();
 
+    void adc2Init();
+    void adc2Callback();
+
     void tc1Init();
     void tc1Callback();
 
@@ -123,22 +141,28 @@ private:
 
     std::atomic<bool> useCanData{false};
     miosix::FastMutex canMutex;
-    Boardcore::PressureData canCCPressure;
-    Boardcore::PressureData canBottomTankPressure;
-    Boardcore::PressureData canTopTankPressure;
-    Boardcore::TemperatureData canTankTemperature;
+
+    Boardcore::PressureData canOxTankTopPressure;
+    Boardcore::PressureData canOxTankBottomPressure;
+    Boardcore::PressureData canCombustionChamberPressure;
+    // TODO: N2 tank pressure from CAN
+    Boardcore::TemperatureData canOxTankTemperature;
     Boardcore::VoltageData canMotorBatteryVoltage;
 
     // Analog sensors
-    std::unique_ptr<Boardcore::TrafagPressureSensor> vesselPressure;
-    std::unique_ptr<Boardcore::TrafagPressureSensor> fillingPressure;
-    std::unique_ptr<Boardcore::TrafagPressureSensor> topTankPressure;
-    std::unique_ptr<Boardcore::TrafagPressureSensor> bottomTankPressure;
-    std::unique_ptr<Boardcore::TwoPointAnalogLoadCell> vesselWeight;
-    std::unique_ptr<Boardcore::TwoPointAnalogLoadCell> tankWeight;
+    std::unique_ptr<Boardcore::TrafagPressureSensor> oxVesselPressure;
+    std::unique_ptr<Boardcore::TrafagPressureSensor> oxFillingPressure;
+    std::unique_ptr<Boardcore::TrafagPressureSensor> n2Vessel1Pressure;
+    std::unique_ptr<Boardcore::TrafagPressureSensor> n2Vessel2Pressure;
+    std::unique_ptr<Boardcore::TrafagPressureSensor> n2FillingPressure;
+    std::unique_ptr<Boardcore::TrafagPressureSensor> oxTankTopPressure;
+    std::unique_ptr<Boardcore::TrafagPressureSensor> oxTankBottomPressure;
+    std::unique_ptr<Boardcore::TwoPointAnalogLoadCell> oxVesselWeight;
+    std::unique_ptr<Boardcore::TwoPointAnalogLoadCell> oxTankWeight;
 
     // Digital sensors
     std::unique_ptr<Boardcore::ADS131M08> adc1;
+    std::unique_ptr<Boardcore::ADS131M08> adc2;
     std::unique_ptr<Boardcore::MAX31856> tc1;
     std::unique_ptr<Boardcore::InternalADC> internalAdc;
     std::unique_ptr<Boardcore::SensorManager> manager;
diff --git a/src/RIGv2/Sensors/SensorsData.h b/src/RIGv2/Sensors/SensorsData.h
index 5f418da1ef30262444e114f47359ae3954a11428..c598c0a2a0f9d87e8fc19f7e0df682450a0a194b 100644
--- a/src/RIGv2/Sensors/SensorsData.h
+++ b/src/RIGv2/Sensors/SensorsData.h
@@ -1,5 +1,5 @@
 /* Copyright (c) 2024 Skyward Experimental Rocketry
- * Authors: Davide Mor
+ * Authors: Davide Mor, 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
@@ -39,6 +39,16 @@ struct ADC1Data : Boardcore::ADS131M08Data
     ADC1Data() {}
 };
 
+struct ADC2Data : Boardcore::ADS131M08Data
+{
+    explicit ADC2Data(const Boardcore::ADS131M08Data& data)
+        : Boardcore::ADS131M08Data(data)
+    {
+    }
+
+    ADC2Data() {}
+};
+
 struct TC1Data : Boardcore::MAX31856Data
 {
     explicit TC1Data(const Boardcore::MAX31856Data& data)
@@ -49,64 +59,94 @@ struct TC1Data : Boardcore::MAX31856Data
     TC1Data() {}
 };
 
-struct VesselWeightData : Boardcore::LoadCellData
+struct OxVesselWeightData : Boardcore::LoadCellData
 {
-    explicit VesselWeightData(const Boardcore::LoadCellData& data)
+    explicit OxVesselWeightData(const Boardcore::LoadCellData& data)
         : Boardcore::LoadCellData(data)
     {
     }
 
-    VesselWeightData() {}
+    OxVesselWeightData() {}
 };
 
-struct TankWeightData : Boardcore::LoadCellData
+struct OxTankWeightData : Boardcore::LoadCellData
 {
-    explicit TankWeightData(const Boardcore::LoadCellData& data)
+    explicit OxTankWeightData(const Boardcore::LoadCellData& data)
         : Boardcore::LoadCellData(data)
     {
     }
 
-    TankWeightData() {}
+    OxTankWeightData() {}
+};
+
+struct OxVesselPressureData : Boardcore::PressureData
+{
+    explicit OxVesselPressureData(const Boardcore::PressureData& data)
+        : Boardcore::PressureData(data)
+    {
+    }
+
+    OxVesselPressureData() {}
+};
+
+struct OxFillingPressureData : Boardcore::PressureData
+{
+    explicit OxFillingPressureData(const Boardcore::PressureData& data)
+        : Boardcore::PressureData(data)
+    {
+    }
+
+    OxFillingPressureData() {}
+};
+
+struct N2Vessel1PressureData : Boardcore::PressureData
+{
+    explicit N2Vessel1PressureData(const Boardcore::PressureData& data)
+        : Boardcore::PressureData(data)
+    {
+    }
+
+    N2Vessel1PressureData() {}
 };
 
-struct VesselPressureData : Boardcore::PressureData
+struct N2Vessel2PressureData : Boardcore::PressureData
 {
-    explicit VesselPressureData(const Boardcore::PressureData& data)
+    explicit N2Vessel2PressureData(const Boardcore::PressureData& data)
         : Boardcore::PressureData(data)
     {
     }
 
-    VesselPressureData() {}
+    N2Vessel2PressureData() {}
 };
 
-struct FillingPressureData : Boardcore::PressureData
+struct N2FillingPressureData : Boardcore::PressureData
 {
-    explicit FillingPressureData(const Boardcore::PressureData& data)
+    explicit N2FillingPressureData(const Boardcore::PressureData& data)
         : Boardcore::PressureData(data)
     {
     }
 
-    FillingPressureData() {}
+    N2FillingPressureData() {}
 };
 
-struct TopTankPressureData : Boardcore::PressureData
+struct OxTankTopPressureData : Boardcore::PressureData
 {
-    explicit TopTankPressureData(const Boardcore::PressureData& data)
+    explicit OxTankTopPressureData(const Boardcore::PressureData& data)
         : Boardcore::PressureData(data)
     {
     }
 
-    TopTankPressureData() {}
+    OxTankTopPressureData() {}
 };
 
-struct BottomTankPressureData : Boardcore::PressureData
+struct OxTankBottomPressureData : Boardcore::PressureData
 {
-    explicit BottomTankPressureData(const Boardcore::PressureData& data)
+    explicit OxTankBottomPressureData(const Boardcore::PressureData& data)
         : Boardcore::PressureData(data)
     {
     }
 
-    BottomTankPressureData() {}
+    OxTankBottomPressureData() {}
 };
 
 }  // namespace RIGv2
diff --git a/src/RIGv2/StateMachines/TARS1/TARS1.cpp b/src/RIGv2/StateMachines/TARS1/TARS1.cpp
index 50a1f90d7c405769b4f0a03bf1a42ec5f420ca55..b6806abf3b158366ba876131d98024c2cbd8c86a 100644
--- a/src/RIGv2/StateMachines/TARS1/TARS1.cpp
+++ b/src/RIGv2/StateMachines/TARS1/TARS1.cpp
@@ -257,8 +257,8 @@ void TARS1::sample()
 {
     Sensors* sensors = getModule<Sensors>();
 
-    pressureFilter.add(sensors->getBottomTankPressLastSample().pressure);
-    massFilter.add(sensors->getTankWeightLastSample().load);
+    pressureFilter.add(sensors->getOxTankBottomPressure().pressure);
+    massFilter.add(sensors->getOxTankWeight().load);
     medianSamples++;
 
     if (medianSamples == Config::TARS1::MEDIAN_SAMPLE_NUMBER)
diff --git a/src/RIGv2/rig-v2-entry.cpp b/src/RIGv2/rig-v2-entry.cpp
index ebc6174462b608020ed3757a216a2adaf8dbbdb6..b8ec84e95f5c374fc1cbf0caed1bce28ce6375f1 100644
--- a/src/RIGv2/rig-v2-entry.cpp
+++ b/src/RIGv2/rig-v2-entry.cpp
@@ -208,8 +208,12 @@ int main()
     std::cout << "Sensor status:" << std::endl;
     for (auto info : sensors->getSensorInfos())
     {
+        auto statusStr = !info.isEnabled      ? "Disabled"
+                         : info.isInitialized ? "Ok"
+                                              : "Error";
+
         std::cout << "\t" << std::setw(16) << std::left << info.id << " "
-                  << (info.isInitialized ? "Ok" : "Error") << std::endl;
+                  << statusStr << std::endl;
     }
 
     // Periodic statistics