diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 1f060357684301e42a9b8b4e39ce8b81e66f4b77..aa33eb367ff33410d196da60360eaf56a91e0ba2 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -52,7 +52,7 @@ build-debug:
 test:
   stage: test
   script:
-    - ./sbs --jobs 2 --test catch-tests-entry
+    - ./sbs --jobs 2 --test catch-tests-main
 
 # Stage lint
 
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 0867579651726f7dab306daf95a277e70b129390..2525102b521e02b8844828524bb28cfe162427ae 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -20,6 +20,7 @@
 # THE SOFTWARE.
 
 cmake_minimum_required(VERSION 3.16)
+enable_testing()
 include(skyward-boardcore/cmake/sbs.cmake)
 
 #-----------------------------------------------------------------------------#
diff --git a/skyward-boardcore b/skyward-boardcore
index a5c11b02fab8990b04b2f27f44f2415c79e6e72e..a10a0ec070e5a7ba2f817f2255811504039c8996 160000
--- a/skyward-boardcore
+++ b/skyward-boardcore
@@ -1 +1 @@
-Subproject commit a5c11b02fab8990b04b2f27f44f2415c79e6e72e
+Subproject commit a10a0ec070e5a7ba2f817f2255811504039c8996
diff --git a/src/boards/MainComputer/Actuators/Actuators.cpp b/src/boards/MainComputer/Actuators/Actuators.cpp
index e4b98ba33e112e6008ac8272de01fbfb5d3c585a..dabf7de852ae7eec6d9f9a22ab0a9dfcd7a80b66 100644
--- a/src/boards/MainComputer/Actuators/Actuators.cpp
+++ b/src/boards/MainComputer/Actuators/Actuators.cpp
@@ -24,7 +24,10 @@
 
 #include <MainComputer/AirBrakes/AirBrakesConfig.h>
 #include <MainComputer/Deployment/DeploymentConfig.h>
+
+#ifndef COMPILE_FOR_HOST
 #include <interfaces-impl/hwmapping.h>
+#endif
 
 using namespace miosix;
 using namespace MainComputer::DeploymentConfig;
@@ -33,6 +36,8 @@ using namespace MainComputer::AirBrakesConfigs;
 namespace MainComputer
 {
 
+#ifndef COMPILE_FOR_HOST
+
 Actuators::Actuators()
     : servoExpulsion(DPL_SERVO_TIMER, DPL_SERVO_PWM_CH),
       servoAirbrakes(ABK_SERVO_TIMER, ABK_SERVO_PWM_CH),
@@ -42,4 +47,14 @@ Actuators::Actuators()
 {
 }
 
+#else
+
+Actuators::Actuators()
+    : servoExpulsion(), servoAirbrakes(), led1(GpioPin{0, 0}),
+      led2(GpioPin{0, 0}), led3(GpioPin{0, 0}), cutter(GpioPin{0, 0})
+{
+}
+
+#endif
+
 }  // namespace MainComputer
diff --git a/src/boards/MainComputer/AirBrakes/AirBrakesConfig.h b/src/boards/MainComputer/AirBrakes/AirBrakesConfig.h
index 038711aad964260fb0bc3cacb6697d836a452962..829f4dc967473725829871627cf0864a7bfcc02d 100644
--- a/src/boards/MainComputer/AirBrakes/AirBrakesConfig.h
+++ b/src/boards/MainComputer/AirBrakes/AirBrakesConfig.h
@@ -22,7 +22,10 @@
 
 #pragma once
 
+#ifndef COMPILE_FOR_HOST
 #include <drivers/timer/PWM.h>
+#endif
+
 #include <utils/Constants.h>
 
 namespace MainComputer
@@ -31,9 +34,11 @@ namespace MainComputer
 namespace AirBrakesConfigs
 {
 
+#ifndef COMPILE_FOR_HOST
 TIM_TypeDef* const ABK_SERVO_TIMER = TIM8;
 constexpr Boardcore::TimerUtils::Channel ABK_SERVO_PWM_CH =
     Boardcore::TimerUtils::Channel::CHANNEL_2;
+#endif
 
 static constexpr int SHADOW_MODE_TIMEOUT = 3.5 * 1000;
 
diff --git a/src/boards/MainComputer/Deployment/DeploymentConfig.h b/src/boards/MainComputer/Deployment/DeploymentConfig.h
index f9a64688d094de5fba29b98dfb90db0f8016912d..12b41953cf70772025d42858a9a4922fcef1238d 100644
--- a/src/boards/MainComputer/Deployment/DeploymentConfig.h
+++ b/src/boards/MainComputer/Deployment/DeploymentConfig.h
@@ -20,8 +20,10 @@
  * THE SOFTWARE.
  */
 
+#ifndef COMPILE_FOR_HOST
 #include <drivers/timer/PWM.h>
 #include <drivers/timer/TimerUtils.h>
+#endif
 
 namespace MainComputer
 {
@@ -29,9 +31,11 @@ namespace MainComputer
 namespace DeploymentConfig
 {
 
+#ifndef COMPILE_FOR_HOST
 static TIM_TypeDef* const DPL_SERVO_TIMER = TIM4;
 static constexpr Boardcore::TimerUtils::Channel DPL_SERVO_PWM_CH =
     Boardcore::TimerUtils::Channel::CHANNEL_1;
+#endif
 
 static constexpr int OPEN_NC_TIMEOUT = 5 * 1000;  // [ms]
 static constexpr int CUT_DURATION    = 50;        // [ms]
diff --git a/src/boards/MainComputer/FlightStatsRecorder/FSRConfig.h b/src/boards/MainComputer/FlightStatsRecorder/FSRConfig.h
index 3d376a748710d888de4f2de13150e6ad6302d64d..2b68bfd952c1aede46b8476d5a2d59163f7e9c84 100644
--- a/src/boards/MainComputer/FlightStatsRecorder/FSRConfig.h
+++ b/src/boards/MainComputer/FlightStatsRecorder/FSRConfig.h
@@ -20,8 +20,10 @@
  * THE SOFTWARE.
  */
 
+#ifndef COMPILE_FOR_HOST
 #include <drivers/timer/PWM.h>
 #include <drivers/timer/TimerUtils.h>
+#endif
 
 namespace MainComputer
 {
diff --git a/src/tests/MainComputer/catch/catch-tests-entry.cpp b/src/tests/MainComputer/catch/catch-tests-entry.cpp
index 1b970e126204eba4f2976fe22ece8fa787d161f3..1acb030985228992f908e7b7f38d4431bf061d50 100644
--- a/src/tests/MainComputer/catch/catch-tests-entry.cpp
+++ b/src/tests/MainComputer/catch/catch-tests-entry.cpp
@@ -1,5 +1,5 @@
-/* Copyright (c) 2019 Skyward Experimental Rocketry
- * Author: Luca Erbetta
+/* Copyright (c) 2019-2021 Skyward Experimental Rocketry
+ * Authors: Luca Erbetta, Damiano Amatruda
  *
  * Permission is hereby granted, free of charge, to any person obtaining a copy
  * of this software and associated documentation files (the "Software"), to deal
@@ -21,14 +21,14 @@
  */
 
 /*
- * Entrypoint for all Catch1-based tests. You should not need to modify this
+ * Entrypoint for all Catch2-based tests. You should not need to modify this
  * file.
  *
  * To add a test, just create a new source file and include <catch.hpp>, then
  * add test cases as you wish. Do not add a main() function in your test
  * sources.
  * Once the test is written, compile the test source file(s) + this entrypoint
- * in sbs.conf. Run it and all your test will be automatically executed.
+ * in CMakeLists.txt. Run it and all your test will be automatically executed.
  *
  * You can also include this file in your test source if you want to run it as a
  * standalone test, and not togheter with all the others. See the
@@ -41,21 +41,33 @@
  * https://github.com/catchorg/Catch2/blob/Catch1.x/docs/command-line.md
  *
  * To specify the command line options, add, in the definition of the entrypoint
- * in sbs.conf, add the CATCH1_CL_OPTIONS define.
- * Example: -DCATCH1_CL_OPTIONS="\"[tag1][tag2] -s\""
+ * in CMakeLists.txt, add the CATCH_CL_OPTIONS define.
+ * Example: -DCATCH_CL_OPTIONS="\"[tag1][tag2] -s\""
  * Remember to correctly escape the quotation marks, as shown
  * above.
  *
  * Further information at:
- * https://git.skywarder.eu/r2a/skyward-boardcore/wikis/Testing
+ * https://git.skywarder.eu/scs/skyward-boardcore/wikis/Testing
  */
 
 #define CATCH_CONFIG_RUNNER
 #define CATCH_CONFIG_NO_POSIX_SIGNALS
 
+#include <catch2/catch.hpp>
+
+// No tags or command line options as default.
+#ifndef CATCH_CL_OPTIONS
+#define CATCH_CL_OPTIONS ""
+#endif
+
+#ifdef COMPILE_FOR_HOST
+
+int main(int argc, char* argv[]) { return Catch::Session().run(argc, argv); }
+
+#else
+
 #include <miosix.h>
 
-#include <catch2/catch.hpp>
 #include <cstring>
 #include <string>
 #include <vector>
@@ -64,11 +76,6 @@ using miosix::Thread;
 using std::string;
 using std::vector;
 
-// No tags or command line options as default.
-#ifndef CATCH1_CL_OPTIONS
-#define CATCH1_CL_OPTIONS ""
-#endif
-
 /**
  * @brief Splits a string around spaces
  * Eg: "This is a string" -> {"This", "is", "a", "string"}
@@ -76,15 +83,18 @@ using std::vector;
  * @param str String to split
  * @return vector<string>
  */
-vector<string> splitSpaces(string str)
+static vector<string> splitSpaces(const string& str)
 {
-    unsigned int p = 0;
-    bool end       = false;
+    size_t p = 0;
+    bool end = false;
     vector<string> out;
 
+    if (str.length() == 0)
+        return out;
+
     do
     {
-        unsigned int p2 = str.find(" ", p);
+        size_t p2 = str.find(" ", p);
 
         if (p2 == string::npos)  // No match
         {
@@ -98,6 +108,7 @@ vector<string> splitSpaces(string str)
         {
             out.push_back(str.substr(p, len));
         }
+
         p = p2 + 1;
     } while (!end);
 
@@ -106,18 +117,18 @@ vector<string> splitSpaces(string str)
 
 /**
  * @brief Entrypoint for the tests. Parses the options and tags
- * provided in sbs.conf and runs a Catch1 session.
+ * provided in CMakeLists.txt and runs a Catch2 session.
  */
 int main()
 {
-    // Parse command line arguments from #defines in sbs.conf
+    // Parse command line arguments from #defines in CMakeLists.txt
 
     string skw{"Skyward-tests"};
 
-    // CATCH1_CL_OPTIONS defined in sbs.conf
-    string options_str{CATCH1_CL_OPTIONS};
+    // CATCH_CL_OPTIONS defined in CMakeLists.txt
+    string optionsStr{CATCH_CL_OPTIONS};
 
-    vector<string> options = splitSpaces(options_str);
+    vector<string> options = splitSpaces(optionsStr);
     vector<string> args{skw};
 
     if (options.size() > 0)
@@ -126,14 +137,14 @@ int main()
     // Convert vector of strings to array of c-strings
     size_t argc = args.size();
 
-    char** argv =
-        new char*[argc];  // Array of c strings, aka array of char pointers
+    // Array of c strings, aka array of char pointers
+    char** argv = new char*[argc];
     for (size_t i = 0; i < argc; i++)
     {
-        string s    = args.at(i);
-        char* c_arg = new char[s.length() + 1];
-        strcpy(c_arg, s.c_str());
-        argv[i] = c_arg;
+        string s   = args.at(i);
+        char* cArg = new char[s.length() + 1];
+        strcpy(cArg, s.c_str());
+        argv[i] = cArg;
     }
 
     // Run tests with the provided arguments
@@ -147,9 +158,12 @@ int main()
     delete[] argv;
 
     printf("End.\n");
+
     // Infinite loop to avoid board reset each time we return
-    for (;;)
+    while (true)
     {
         Thread::sleep(10000);
     }
 }
+
+#endif  // COMPILE_FOR_HOST