diff --git a/src/RIGv2/Actuators/Actuators.cpp b/src/RIGv2/Actuators/Actuators.cpp
index cb671723e7dd0117b5d25be416a4973061f8b86d..d2a92c244a7b6cb6c25dbce86381edc4aecf7d02 100644
--- a/src/RIGv2/Actuators/Actuators.cpp
+++ b/src/RIGv2/Actuators/Actuators.cpp
@@ -408,12 +408,7 @@ bool Actuators::isCanServoOpen(ServosList servo)
         return false;
 }
 
-void Actuators::openNitrogen()
-{
-    openNitrogenWithTime(Config::Actuators::NITROGEN_OPENING_TIME);
-}
-
-void Actuators::openNitrogenWithTime(uint32_t time)
+void Actuators::openChamberWithTime(uint32_t time)
 {
     Lock<FastMutex> lock(infosMutex);
     long long currentTime = getTime();
@@ -422,13 +417,13 @@ void Actuators::openNitrogenWithTime(uint32_t time)
     nitrogenLastActionTs = currentTime;
 }
 
-void Actuators::closeNitrogen()
+void Actuators::closeChamber()
 {
     Lock<FastMutex> lock(infosMutex);
     nitrogenCloseTs = 0;
 }
 
-bool Actuators::isNitrogenOpen()
+bool Actuators::isChamberOpen()
 {
     Lock<FastMutex> lock(infosMutex);
     return nitrogenCloseTs != 0;
@@ -511,9 +506,9 @@ void Actuators::unsafeSetServoPosition(uint8_t idx, float position)
     sdLogger.log(data);
 }
 
-void Actuators::unsafeOpenNitrogen() { relays::nitrogen::low(); }
+void Actuators::unsafeOpenChamber() { relays::nitrogen::low(); }
 
-void Actuators::unsafeCloseNitrogen() { relays::nitrogen::high(); }
+void Actuators::unsafeCloseChamber() { relays::nitrogen::high(); }
 
 void Actuators::updatePositionsTask()
 {
@@ -571,12 +566,12 @@ void Actuators::updatePositionsTask()
     // Handle nitrogen logic
     if (currentTime < nitrogenCloseTs)
     {
-        unsafeOpenNitrogen();
+        unsafeOpenChamber();
     }
     else
     {
         nitrogenCloseTs = 0;
 
-        unsafeCloseNitrogen();
+        unsafeCloseChamber();
     }
 }
diff --git a/src/RIGv2/Actuators/Actuators.h b/src/RIGv2/Actuators/Actuators.h
index 41cf009ff31099c16f6800692d96c8eef6f2cdf0..08b66c63411eeb869ec176837f8d8d16d3c4950c 100644
--- a/src/RIGv2/Actuators/Actuators.h
+++ b/src/RIGv2/Actuators/Actuators.h
@@ -92,10 +92,11 @@ public:
     bool setOpeningTime(ServosList servo, uint32_t time);
     bool isServoOpen(ServosList servo);
     bool isCanServoOpen(ServosList servo);
-    void openNitrogen();
-    void openNitrogenWithTime(uint32_t time);
-    void closeNitrogen();
-    bool isNitrogenOpen();
+
+    // Chamber valve control
+    void openChamberWithTime(uint32_t time);
+    void closeChamber();
+    bool isChamberOpen();
 
     uint32_t getServoOpeningTime(ServosList servo);
     float getServoMaxAperture(ServosList servo);
@@ -114,8 +115,8 @@ private:
     ServoInfo* getServo(ServosList servo);
 
     void unsafeSetServoPosition(uint8_t idx, float position);
-    void unsafeOpenNitrogen();
-    void unsafeCloseNitrogen();
+    void unsafeOpenChamber();
+    void unsafeCloseChamber();
 
     void updatePositionsTask();
 
diff --git a/src/RIGv2/Configs/ActuatorsConfig.h b/src/RIGv2/Configs/ActuatorsConfig.h
index bfa3ddf4397c4c2f6a7cc3fb2bf77fc4ffa98bfa..74b5a06ac8b300c67db8a5bddd09641a65060d5b 100644
--- a/src/RIGv2/Configs/ActuatorsConfig.h
+++ b/src/RIGv2/Configs/ActuatorsConfig.h
@@ -76,10 +76,5 @@ constexpr bool DISCONNECT_FLIPPED = false;
 
 }  // namespace Servos
 
-namespace Actuators
-{
-static constexpr uint32_t NITROGEN_OPENING_TIME = 5000;  // 5s
-}
-
 }  // namespace Config
 }  // namespace RIGv2
diff --git a/src/RIGv2/Configs/GMMConfig.h b/src/RIGv2/Configs/GMMConfig.h
index cc02af3a0d76b53b6a49e82835511bf81287ea2e..93e60c04514a2eadb1f9e5ffb0c615b7ae8e5624 100644
--- a/src/RIGv2/Configs/GMMConfig.h
+++ b/src/RIGv2/Configs/GMMConfig.h
@@ -33,8 +33,10 @@ namespace GroundModeManager
 
 constexpr uint32_t DEFAULT_IGNITION_WAITING_TIME = 3700;  // [ms]
 
-constexpr uint32_t MOTOR_COOLING_TIME = 1500;
-constexpr uint32_t NITROGEN_TIME      = 20000;  // 20s
+/// Delay between the main valve opening and the chamber valve opening
+constexpr uint32_t DEFAULT_CHAMBER_VALVE_DELAY = 500;
+// Time the chamber valve stays open
+constexpr uint32_t DEFAULT_CHAMBER_VALVE_TIME = 6000;
 
 }  // namespace GroundModeManager
 }  // namespace Config
diff --git a/src/RIGv2/Radio/Radio.cpp b/src/RIGv2/Radio/Radio.cpp
index f657b77f314326b7d701792baa38ace350e47bc3..fe44a57c2e919f6a458532b0d718f1ffb25c2ace 100644
--- a/src/RIGv2/Radio/Radio.cpp
+++ b/src/RIGv2/Radio/Radio.cpp
@@ -259,6 +259,26 @@ void Radio::handleMessage(const mavlink_message_t& msg)
             break;
         }
 
+        case MAVLINK_MSG_ID_SET_NITROGEN_TIME_TC:
+        {
+            // Chamber valve opening time
+            uint32_t timing = mavlink_msg_set_nitrogen_time_tc_get_timing(&msg);
+            getModule<GroundModeManager>()->setChamberTime(timing);
+
+            enqueueAck(msg);
+            break;
+        }
+
+        case MAVLINK_MSG_ID_SET_COOLING_TIME_TC:
+        {
+            // Chamber valve delay after main valve opening
+            uint32_t timing = mavlink_msg_set_cooling_time_tc_get_timing(&msg);
+            getModule<GroundModeManager>()->setChamberDelay(timing);
+
+            enqueueAck(msg);
+            break;
+        }
+
         default:
         {
             // Unrecognized packet
@@ -569,7 +589,7 @@ bool Radio::enqueueSystemTm(uint8_t tmId)
                 actuators->isServoOpen(ServosList::MAIN_VALVE);
             tm.nitrogen_valve_state =
                 actuators->isServoOpen(ServosList::NITROGEN_VALVE);
-            tm.ignition_state = actuators->isNitrogenOpen();
+            tm.ignition_state = actuators->isChamberOpen();
 
             // Internal states
             tm.gmm_state    = getModule<GroundModeManager>()->getState();
diff --git a/src/RIGv2/Registry/Registry.h b/src/RIGv2/Registry/Registry.h
index 81164f3179ff2f48c30ab108fb59ccaff21aad1e..1f9b99b619b42e7519c917c8ef5a62c528fe6410 100644
--- a/src/RIGv2/Registry/Registry.h
+++ b/src/RIGv2/Registry/Registry.h
@@ -43,6 +43,8 @@ enum ConfigurationKeys
     CONFIG_ID_IGNITION_TIME           = 11,
     CONFIG_ID_DEFAULT_OPENING_TIME    = 12,
     CONFIG_ID_DEFAULT_MAX_APERTURE    = 13,
+    CONFIG_ID_CHAMBER_TIME            = 14,
+    CONFIG_ID_CHAMBER_DELAY           = 15,
 };
 
 const char* configurationIdToName(Boardcore::ConfigurationId id);
diff --git a/src/RIGv2/StateMachines/GroundModeManager/GroundModeManager.cpp b/src/RIGv2/StateMachines/GroundModeManager/GroundModeManager.cpp
index 2b372417e9c13014f71c6c9e89cbca9058f85936..cfff1aaa0dbd7ee340fb2932fa17a5c498da0b9c 100644
--- a/src/RIGv2/StateMachines/GroundModeManager/GroundModeManager.cpp
+++ b/src/RIGv2/StateMachines/GroundModeManager/GroundModeManager.cpp
@@ -47,6 +47,16 @@ void GroundModeManager::setIgnitionTime(uint32_t time)
     getModule<Registry>()->setUnsafe(CONFIG_ID_IGNITION_TIME, time);
 }
 
+void GroundModeManager::setChamberTime(uint32_t time)
+{
+    getModule<Registry>()->setUnsafe(CONFIG_ID_CHAMBER_TIME, time);
+}
+
+void GroundModeManager::setChamberDelay(uint32_t time)
+{
+    getModule<Registry>()->setUnsafe(CONFIG_ID_CHAMBER_DELAY, time);
+}
+
 State GroundModeManager::state_idle(const Event& event)
 {
     switch (event)
@@ -194,7 +204,11 @@ State GroundModeManager::state_disarmed(const Event& event)
 
         case TMTC_OPEN_NITROGEN:
         {
-            getModule<Actuators>()->openNitrogen();
+            uint32_t chamberTime = getModule<Registry>()->getOrSetDefaultUnsafe(
+                CONFIG_ID_CHAMBER_TIME,
+                Config::GroundModeManager::DEFAULT_CHAMBER_VALVE_TIME);
+
+            getModule<Actuators>()->openChamberWithTime(chamberTime);
             return HANDLED;
         }
 
@@ -227,7 +241,7 @@ State GroundModeManager::state_armed(const Event& event)
             getModule<CanHandler>()->sendEvent(CanConfig::EventId::ARM);
             getModule<Actuators>()->armLightOn();
             getModule<Actuators>()->closeAllServos();
-            getModule<Actuators>()->closeNitrogen();
+            getModule<Actuators>()->closeChamber();
             return HANDLED;
         }
 
@@ -248,7 +262,10 @@ State GroundModeManager::state_armed(const Event& event)
 
         case TMTC_OPEN_NITROGEN:
         {
-            getModule<Actuators>()->openNitrogen();
+            uint32_t chamberTime = getModule<Registry>()->getOrSetDefaultUnsafe(
+                CONFIG_ID_CHAMBER_TIME,
+                Config::GroundModeManager::DEFAULT_CHAMBER_VALVE_TIME);
+            getModule<Actuators>()->openChamberWithTime(chamberTime);
 
             // Nitrogen causes automatic disarm
             return transition(&GroundModeManager::state_disarmed);
@@ -289,7 +306,6 @@ State GroundModeManager::state_firing(const Event& event)
 
             // Disable all events
             EventBroker::getInstance().removeDelayed(openOxidantDelayEventId);
-            EventBroker::getInstance().removeDelayed(coolingDelayEventId);
 
             return HANDLED;
         }
@@ -307,7 +323,11 @@ State GroundModeManager::state_firing(const Event& event)
         case TMTC_OPEN_NITROGEN:
         {
             // Open nitrogen
-            getModule<Actuators>()->openNitrogen();
+            uint32_t chamberTime = getModule<Registry>()->getOrSetDefaultUnsafe(
+                CONFIG_ID_CHAMBER_TIME,
+                Config::GroundModeManager::DEFAULT_CHAMBER_VALVE_TIME);
+
+            getModule<Actuators>()->openChamberWithTime(chamberTime);
 
             return transition(&GroundModeManager::state_disarmed);
         }
@@ -315,9 +335,6 @@ State GroundModeManager::state_firing(const Event& event)
         case MOTOR_COOLING_TIMEOUT:  // Normal firing end
         case TMTC_DISARM:            // Abort signal
         {
-            getModule<Actuators>()->openNitrogenWithTime(
-                Config::GroundModeManager::NITROGEN_TIME);
-
             return transition(&GroundModeManager::state_disarmed);
         }
 
@@ -389,6 +406,14 @@ State GroundModeManager::state_oxidizer(const Event& event)
 
             getModule<Actuators>()->openServo(ServosList::MAIN_VALVE);
 
+            uint32_t chamberDelay =
+                getModule<Registry>()->getOrSetDefaultUnsafe(
+                    CONFIG_ID_CHAMBER_DELAY,
+                    Config::GroundModeManager::DEFAULT_CHAMBER_VALVE_DELAY);
+
+            EventBroker::getInstance().postDelayed(MOTOR_OPEN_CHAMBER,
+                                                   TOPIC_MOTOR, chamberDelay);
+
             return HANDLED;
         }
 
@@ -407,8 +432,15 @@ State GroundModeManager::state_oxidizer(const Event& event)
             return HANDLED;
         }
 
-        case MOTOR_CLOSE_FEED_VALVE:
+        case MOTOR_OPEN_CHAMBER:
         {
+            uint32_t chamberTime = getModule<Registry>()->getOrSetDefaultUnsafe(
+                CONFIG_ID_CHAMBER_TIME,
+                Config::GroundModeManager::DEFAULT_CHAMBER_VALVE_TIME);
+
+            // Open the chamber valve
+            getModule<Actuators>()->openChamberWithTime(chamberTime);
+
             return transition(&GroundModeManager::state_cooling);
         }
 
@@ -427,10 +459,6 @@ State GroundModeManager::state_cooling(const Event& event)
         {
             updateAndLogStatus(GroundModeManagerState::COOLING);
 
-            coolingDelayEventId = EventBroker::getInstance().postDelayed(
-                MOTOR_COOLING_TIMEOUT, TOPIC_MOTOR,
-                Config::GroundModeManager::MOTOR_COOLING_TIME);
-
             return HANDLED;
         }
 
diff --git a/src/RIGv2/StateMachines/GroundModeManager/GroundModeManager.h b/src/RIGv2/StateMachines/GroundModeManager/GroundModeManager.h
index a4939c0cbbbc7720bc3f11c37f67bc31edbe1963..3abbb141c5042d7e5edf3313e2b8f4dc150ce9e4 100644
--- a/src/RIGv2/StateMachines/GroundModeManager/GroundModeManager.h
+++ b/src/RIGv2/StateMachines/GroundModeManager/GroundModeManager.h
@@ -51,6 +51,10 @@ public:
 
     void setIgnitionTime(uint32_t time);
 
+    void setChamberTime(uint32_t time);
+
+    void setChamberDelay(uint32_t time);
+
 private:
     Boardcore::State state_idle(const Boardcore::Event& event);
     Boardcore::State state_init(const Boardcore::Event& event);
@@ -70,7 +74,6 @@ private:
     std::atomic<GroundModeManagerState> state{GroundModeManagerState::IDLE};
 
     uint16_t openOxidantDelayEventId = -1;
-    uint16_t coolingDelayEventId     = -1;
 };
 
 }  // namespace RIGv2
diff --git a/src/common/Events.h b/src/common/Events.h
index fc524997e62255a4e295a0af299ca491f8c49618..efff19c8d00c1b2818071941ab3280408451b04a 100644
--- a/src/common/Events.h
+++ b/src/common/Events.h
@@ -158,6 +158,7 @@ enum Events : uint8_t
     MOTOR_OPEN_OXIDANT,
     MOTOR_COOLING_TIMEOUT,
     MOTOR_SHADOW_MODE_TIMEOUT,
+    MOTOR_OPEN_CHAMBER,
     TARS_WASHING_DONE,
     TARS_CHECK_PRESSURE_STABILIZE,
     TARS_PRESSURE_STABILIZED,
@@ -293,6 +294,7 @@ inline std::string getEventString(uint8_t event)
         {MOTOR_OPEN_OXIDANT, "MOTOR_OPEN_OXIDANT"},
         {MOTOR_COOLING_TIMEOUT, "MOTOR_COOLING_TIMEOUT"},
         {MOTOR_SHADOW_MODE_TIMEOUT, "MOTOR_SHADOW_MODE_TIMEOUT"},
+        {MOTOR_OPEN_CHAMBER, "MOTOR_OPEN_CHAMBER"},
         {TARS_WASHING_DONE, "TARS_WASHING_DONE"},
         {TARS_CHECK_PRESSURE_STABILIZE, "TARS_CHECK_PRESSURE_STABILIZE"},
         {TARS_PRESSURE_STABILIZED, "TARS_PRESSURE_STABILIZED"},