diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json
index 2ae159515ee83c9ae31157d17da269cc426044dc..b73c7ffe70c2cdd88ec7e4ac336204f949f62211 100755
--- a/.vscode/c_cpp_properties.json
+++ b/.vscode/c_cpp_properties.json
@@ -74,6 +74,7 @@
                 "HSE_VALUE=8000000",
                 "SYSCLK_FREQ_168MHz=168000000",
                 "_MIOSIX",
+                "HILSimulation",
                 "__cplusplus=201103L"
             ],
             "includePath": [
diff --git a/.vscode/settings.json b/.vscode/settings.json
index d64d9495c135a6f23bd27faa31950c80082b3441..743392d0cbad610129652fe8bcf299b7831f3e7f 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -1,10 +1,7 @@
 {
-    "cmake.configureSettings": {
-        "CMAKE_C_COMPILER_LAUNCHER": "ccache",
-        "CMAKE_CXX_COMPILER_LAUNCHER": "ccache"
-    },
     "cmake.parallelJobs": 1,
     "files.associations": {
+        "**/miosix-kernel/**": "c",
         "sstream": "cpp",
         "format": "cpp",
         "any": "cpp",
@@ -92,7 +89,38 @@
         "specialfunctions": "cpp",
         "splines": "cpp",
         "matrixfunctions": "cpp",
-        "tensorsymmetry": "cpp"
+        "tensorsymmetry": "cpp",
+        "ios": "cpp",
+        "charconv": "cpp",
+        "compare": "cpp",
+        "concepts": "cpp",
+        "forward_list": "cpp",
+        "locale": "cpp",
+        "queue": "cpp",
+        "stop_token": "cpp",
+        "xfacet": "cpp",
+        "xhash": "cpp",
+        "xiosbase": "cpp",
+        "xlocale": "cpp",
+        "xlocbuf": "cpp",
+        "xlocinfo": "cpp",
+        "xlocmes": "cpp",
+        "xlocmon": "cpp",
+        "xlocnum": "cpp",
+        "xloctime": "cpp",
+        "xmemory": "cpp",
+        "xstddef": "cpp",
+        "xstring": "cpp",
+        "xtr1common": "cpp",
+        "xtree": "cpp",
+        "xutility": "cpp"
+    },
+    "editor.formatOnSave": true,
+    "[c]": {
+        "editor.formatOnSave": false
+    },
+    "[cmake]": {
+        "editor.formatOnSave": false
     },
     "cSpell.words": [
         "Aeroutils",
@@ -138,5 +166,9 @@
         "VREF",
         "Xbee"
     ],
-    "C_Cpp.errorSquiggles": "Enabled"
-}
+    "C_Cpp.errorSquiggles": "Enabled",
+    "cmake.configureSettings": {
+        "CMAKE_C_COMPILER_LAUNCHER": "ccache",
+        "CMAKE_CXX_COMPILER_LAUNCHER": "ccache"
+    }
+}
\ No newline at end of file
diff --git a/skyward-boardcore b/skyward-boardcore
index 1bbf7e74e4b606d6ca63004291380f844b16b4de..692092c0d434f43a0f0e858d5fad8f0a8490b1a7 160000
--- a/skyward-boardcore
+++ b/skyward-boardcore
@@ -1 +1 @@
-Subproject commit 1bbf7e74e4b606d6ca63004291380f844b16b4de
+Subproject commit 692092c0d434f43a0f0e858d5fad8f0a8490b1a7
diff --git a/src/boards/Main/Configs/AirBrakesControllerConfig.h b/src/boards/Main/Configs/AirBrakesControllerConfig.h
index 63b3665d70dd096bff0202462059870045086d8a..bb613acb559d6f0769d933c02e7777ce8099d753 100644
--- a/src/boards/Main/Configs/AirBrakesControllerConfig.h
+++ b/src/boards/Main/Configs/AirBrakesControllerConfig.h
@@ -44,7 +44,7 @@ constexpr float MACH_LIMIT = 0.8;
 // Vertical speed limit beyond which the airbrakes need to be disabled.
 constexpr float DISABLE_VERTICAL_SPEED_TARGET = 10.0;
 
-static const Boardcore::AirBrakesConfig ABK_CONFIG{
+static const Boardcore::AirBrakesConfig BASE_ABK_CONFIG{
     .N000       = 0.4884,
     .N100       = -1.4391,
     .N200       = 6.6940,
@@ -74,9 +74,6 @@ static const Boardcore::AirBrakesConfig ABK_CONFIG{
     .S0         = 0.017671458676443,
     .SURFACE    = 0.009564 * Main::ActuatorsConfigs::ABK_SERVO_ROTATION *
                EIGEN_PI / 180.0,
-    .KP = 20,
-    .KI = 5,
-    .TS = UPDATE_PERIOD / 1000.0,
 };
 
 }  // namespace AirBrakesControllerConfig
diff --git a/src/boards/Main/Configs/AirBrakesControllerConfigInterp.h b/src/boards/Main/Configs/AirBrakesControllerConfigInterp.h
new file mode 100644
index 0000000000000000000000000000000000000000..ed2f25d60e7245c9e7a365b96963ac70a9b499a4
--- /dev/null
+++ b/src/boards/Main/Configs/AirBrakesControllerConfigInterp.h
@@ -0,0 +1,44 @@
+/* Copyright (c) 2022 Skyward Experimental Rocketry
+ * Author: Alberto Nidasio
+ *
+ * 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.
+ */
+
+#pragma once
+
+#include <AirBrakesControllerConfig.h>
+#include <algorithms/AirBrakes/AirBrakesInterpConfig.h>
+
+namespace Main
+{
+
+namespace AirBrakesControllerConfig
+{
+
+static const Boardcore::AirBrakesInterpConfig ABK_CONFIG(
+    BASE_ABK_CONFIG,
+    0.3,  // INITIAL_FILTER_COEFF
+    12,   // INITIAL_T_FILTER
+    2.5,  // DELTA_T_FILTER
+    2     // FILTER_RATIO
+);
+
+}  // namespace AirBrakesControllerConfig
+
+}  // namespace Main
diff --git a/src/boards/Main/Configs/AirBrakesControllerConfigPI.h b/src/boards/Main/Configs/AirBrakesControllerConfigPI.h
new file mode 100644
index 0000000000000000000000000000000000000000..5131baf64fa7a9d3649cd9122553ae282219ee42
--- /dev/null
+++ b/src/boards/Main/Configs/AirBrakesControllerConfigPI.h
@@ -0,0 +1,43 @@
+/* Copyright (c) 2022 Skyward Experimental Rocketry
+ * Author: Alberto Nidasio
+ *
+ * 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.
+ */
+
+#pragma once
+
+#include <Main/Configs/AirBrakesControllerConfig.h>
+#include <algorithms/AirBrakes/AirBrakesPIConfig.h>
+
+namespace Main
+{
+
+namespace AirBrakesControllerConfig
+{
+
+static const Boardcore::AirBrakesPIConfig ABK_CONFIG(BASE_ABK_CONFIG,
+                                                     20,  // KP
+                                                     5,   // KI
+                                                     UPDATE_PERIOD /
+                                                         1000.0  // TS
+);
+
+}  // namespace AirBrakesControllerConfig
+
+}  // namespace Main
diff --git a/src/boards/Main/Radio/Radio.cpp b/src/boards/Main/Radio/Radio.cpp
index 0597b93d5b84731a158510aecc4ef21ca19b43ea..e1a542bf49b0eaa10b6804bcee1164527bec8e21 100644
--- a/src/boards/Main/Radio/Radio.cpp
+++ b/src/boards/Main/Radio/Radio.cpp
@@ -122,7 +122,7 @@ Radio::Radio()
         new SX1278(Buses::getInstance().spi5, sensors::sx127x::cs::getPin());
 
     SX1278::Config config = {};
-    config.freq_rf = 412000000;
+    config.freq_rf        = 412000000;
 
     // Use default configuration
     transceiver->init(config);
diff --git a/src/boards/Main/StateMachines/AirBrakesController/AirBrakesController.cpp b/src/boards/Main/StateMachines/AirBrakesController/AirBrakesController.cpp
index 4f16ac3ad66637f3a84c7b5c5e52e5a8cb988440..47f502cf8fc0af56899f301a52679159a1da6d2f 100644
--- a/src/boards/Main/StateMachines/AirBrakesController/AirBrakesController.cpp
+++ b/src/boards/Main/StateMachines/AirBrakesController/AirBrakesController.cpp
@@ -25,8 +25,9 @@
 #include <Main/Actuators/Actuators.h>
 #include <Main/BoardScheduler.h>
 #include <Main/Configs/ActuatorsConfigs.h>
-#include <Main/Configs/AirBrakesControllerConfig.h>
 #include <Main/StateMachines/NASController/NASController.h>
+#include <algorithms/AirBrakes/AirBrakesInterp.h>
+#include <algorithms/AirBrakes/AirBrakesPI.h>
 #include <common/events/Events.h>
 #include <drivers/timer/TimestampTimer.h>
 #include <events/EventBroker.h>
@@ -36,8 +37,10 @@
 #endif
 
 #ifdef INTERP
+#include "Main/Configs/AirBrakesControllerConfigInterp.h"
 #include "TrajectorySetInterp.h"
 #else
+#include "Main/Configs/AirBrakesControllerConfigPI.h"
 #include "TrajectorySet.h"
 #endif
 
@@ -66,11 +69,11 @@ void AirBrakesController::update()
     auto currentPoint =
         TimedTrajectoryPoint{NASController::getInstance().getNasState()};
 
-    if (!abk.isRunning() && status.state == AirBrakesControllerState::ACTIVE &&
+    if (!abk->isRunning() && status.state == AirBrakesControllerState::ACTIVE &&
         currentPoint.getMac() < MACH_LIMIT)
-        abk.begin();
+        abk->begin();
 
-    abk.update();
+    abk->update();
 }
 
 AirBrakesControllerStatus AirBrakesController::getStatus()
@@ -174,7 +177,7 @@ void AirBrakesController::state_end(const Event& event)
         {
             logStatus(AirBrakesControllerState::END);
 
-            abk.end();
+            abk->end();
             Actuators::getInstance().setServoAngle(AIR_BRAKES_SERVO, 0);
 
             return;
@@ -183,22 +186,23 @@ void AirBrakesController::state_end(const Event& event)
 }
 
 AirBrakesController::AirBrakesController()
-    : FSM(&AirBrakesController::state_init),
-      abk(
+    : FSM(&AirBrakesController::state_init)
+{
+    this->abk = new AirBrakesPI(
 #ifndef HILMockNAS
-          []() {
-              return TimedTrajectoryPoint{
-                  NASController::getInstance().getNasState()};
-          },
+        []() {
+            return TimedTrajectoryPoint{
+                NASController::getInstance().getNasState()};
+        },
 #else   // HILMockNAS
-          []() { return Sensors::getInstance().state.kalman->getLastSample(); },
+        []() { return Sensors::getInstance().state.kalman->getLastSample(); },
 #endif  // HILMockNAS
-          TRAJECTORY_SET, AirBrakesControllerConfig::ABK_CONFIG,
-          [](float position) {
-              Actuators::getInstance().setServo(ServosList::AIR_BRAKES_SERVO,
-                                                position);
-          })
-{
+        TRAJECTORY_SET, AirBrakesControllerConfig::ABK_CONFIG,
+        [](float position) {
+            Actuators::getInstance().setServo(ServosList::AIR_BRAKES_SERVO,
+                                              position);
+        });
+
     EventBroker::getInstance().subscribe(this, TOPIC_ABK);
     EventBroker::getInstance().subscribe(this, TOPIC_FLIGHT);
 }
diff --git a/src/boards/Main/StateMachines/AirBrakesController/AirBrakesController.h b/src/boards/Main/StateMachines/AirBrakesController/AirBrakesController.h
index 0ad5f9a05cf8f02aba88bf932bf3a20c041c4841..6fca88c9b509c88c830567b7666a15d16e083d98 100644
--- a/src/boards/Main/StateMachines/AirBrakesController/AirBrakesController.h
+++ b/src/boards/Main/StateMachines/AirBrakesController/AirBrakesController.h
@@ -60,7 +60,7 @@ private:
 
     void wiggleServo();
 
-    Boardcore::AirBrakes abk;
+    Boardcore::AirBrakes* abk;
 
     Boardcore::PrintLogger logger = Boardcore::Logging::getLogger("main.abk");
 };
diff --git a/src/entrypoints/Groundstation/groundstation-entry.cpp b/src/entrypoints/Groundstation/groundstation-entry.cpp
index bf2eeaba6cee1231117b7b75226cc6f8381d3d34..3d81da4809be5fd2f297227874a0920d9c24ddcb 100644
--- a/src/entrypoints/Groundstation/groundstation-entry.cpp
+++ b/src/entrypoints/Groundstation/groundstation-entry.cpp
@@ -74,9 +74,9 @@ void recvLoop()
 
     while (true)
     {
-        int len = sx1278->receive(msg, sizeof(msg));
+        int len    = sx1278->receive(msg, sizeof(msg));
         stats.rssi = sx1278->getLastRxRssi();
-        stats.fei = sx1278->getLastRxFei();
+        stats.fei  = sx1278->getLastRxFei();
         stats.recv_count++;
         stats.cur_rx += len;
 
@@ -96,7 +96,7 @@ void sendLoop()
         sx1278->send(msg, len);
         stats.sent_count++;
         stats.cur_tx += len;
-        ledOff();        
+        ledOff();
     }
 }
 
@@ -182,9 +182,12 @@ int main()
         stats.cur_rx = 0;
         stats.cur_tx = 0;
 
-        StatsScreen::Data data = {stats.txBitrate() * 8, stats.rxBitrate() * 8,
-                                  stats.sent_count, stats.recv_count,
-                                  stats.rssi, stats.fei};
+        StatsScreen::Data data = {stats.txBitrate() * 8,
+                                  stats.rxBitrate() * 8,
+                                  stats.sent_count,
+                                  stats.recv_count,
+                                  stats.rssi,
+                                  stats.fei};
 
         gui->stats_screen.updateStats(data);
         Thread::sleep(DELTA_T);