diff --git a/CMakeLists.txt b/CMakeLists.txt
index 1cc0b40621fdc8b0366feeda26b2e77eb1f39727..05fe458e68468a795a6244782fde8a7479f40af8 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -36,7 +36,7 @@ include(${BOARDCORE_PATH}/cmake/boardcore.cmake)
 # ### DEFAULT
 
 # # Define the miosix library with kernel and architecture sources
-# add_library(skyward-boardcore STATIC ${BOARDCORE_SRC} ${PROTECT_SRC})
+# add_library(skyward-boardcore STATIC ${EXCLUDE_SRC} ${PROTECT_SRC} ${TO_DUPLICATE_SRC})
 # link_boardcore_submodules(skyward-boardcore PUBLIC)
 # link_boardcore_libraries(skyward-boardcore PUBLIC)
 
@@ -51,15 +51,22 @@ link_boardcore_submodules(to_protect_lib PUBLIC)
 link_boardcore_libraries(to_protect_lib PUBLIC)
 
 # Create a library for the board
-add_library(external_lib STATIC EXCLUDE_FROM_ALL ${BOARDCORE_SRC})
+add_library(external_lib STATIC EXCLUDE_FROM_ALL ${EXCLUDE_SRC})
 target_compile_options(external_lib PRIVATE -S -emit-llvm -O3)
 # add_options_boardcore_library(external_lib PUBLIC ${BOARD_NAME})
 link_boardcore_submodules(external_lib PUBLIC)
 link_boardcore_libraries(external_lib PUBLIC)
 
+# Create a library for the board
+add_library(to_duplicate_lib STATIC EXCLUDE_FROM_ALL ${TO_DUPLICATE_SRC})
+target_compile_options(to_duplicate_lib PRIVATE -S -emit-llvm -O3)
+# add_options_boardcore_library(to_duplicate_lib PUBLIC ${BOARD_NAME})
+link_boardcore_submodules(to_duplicate_lib PUBLIC)
+link_boardcore_libraries(to_duplicate_lib PUBLIC)
+
 get_property(CXXFLAGS_RET TARGET miosix PROPERTY TARGET_CXX_FLAGS)
 
-apply_aspis_passes(to_protect_lib external_lib skyward-boardcore "${CXXFLAGS_RET}")
+apply_aspis_passes(to_protect_lib external_lib to_duplicate_lib skyward-boardcore "${CXXFLAGS_RET}")
 # add_options_boardcore_library(skyward-boardcore INTERFACE ${BOARD_NAME})
 
 link_boardcore_submodules(skyward-boardcore INTERFACE)
diff --git a/cmake/boardcore.cmake b/cmake/boardcore.cmake
index ec3d4bae26cb2926a2375491b63b80c1c4e8cd4b..58e36bc5de74dc048a8ef81a73af297ee2b830e9 100644
--- a/cmake/boardcore.cmake
+++ b/cmake/boardcore.cmake
@@ -37,23 +37,13 @@ include(${BOARDCORE_PATH}/cmake/boardcore-host.cmake)
 include(${BOARDCORE_PATH}/cmake/boards.cmake)
 
 # Boardcore source files
-set(BOARDCORE_SRC
+set(EXCLUDE_SRC
     # Actuators
     ${BOARDCORE_PATH}/src/shared/actuators/HBridge/HBridge.cpp
     ${BOARDCORE_PATH}/src/shared/actuators/Servo/Servo.cpp
     ${BOARDCORE_PATH}/src/shared/actuators/stepper/Stepper.cpp
     ${BOARDCORE_PATH}/src/shared/actuators/stepper/StepperPWM.cpp
 
-    # Algorithms
-    # ${BOARDCORE_PATH}/src/shared/algorithms/ADA/ADA.cpp
-    # ${BOARDCORE_PATH}/src/shared/algorithms/MEA/MEA.cpp
-    ${BOARDCORE_PATH}/src/shared/algorithms/AirBrakes/AirBrakesPI.cpp
-    ${BOARDCORE_PATH}/src/shared/algorithms/AirBrakes/AirBrakesInterp.cpp
-    ${BOARDCORE_PATH}/src/shared/algorithms/NAS/NAS.cpp
-    ${BOARDCORE_PATH}/src/shared/algorithms/NAS/StateInitializer.cpp
-    ${BOARDCORE_PATH}/src/shared/algorithms/Propagator/Propagator.cpp
-    ${BOARDCORE_PATH}/src/shared/algorithms/Follower/Follower.cpp
-
     # Debug
     ${BOARDCORE_PATH}/src/shared/utils/Debug.cpp
     ${BOARDCORE_PATH}/src/shared/diagnostic/CpuMeter/CpuMeter.cpp
@@ -77,9 +67,6 @@ set(BOARDCORE_SRC
     ${BOARDCORE_PATH}/src/shared/drivers/WIZ5500/WIZ5500.cpp
     ${BOARDCORE_PATH}/src/shared/drivers/DipSwitch/DipSwitch.cpp
 
-    # Events
-    ${BOARDCORE_PATH}/src/shared/events/EventBroker.cpp
-
     # Logger
     ${BOARDCORE_PATH}/src/shared/logger/Logger.cpp
 
@@ -91,9 +78,6 @@ set(BOARDCORE_SRC
     ${BOARDCORE_PATH}/src/shared/radio/SX1278/SX1278Lora.cpp
     ${BOARDCORE_PATH}/src/shared/radio/SX1278/SX1278Common.cpp
 
-    # Scheduler
-    ${BOARDCORE_PATH}/src/shared/scheduler/TaskScheduler.cpp
-
     # Sensors
     ${BOARDCORE_PATH}/src/shared/sensors/ADS1118/ADS1118.cpp
     ${BOARDCORE_PATH}/src/shared/sensors/ADS131M04/ADS131M04.cpp
@@ -130,6 +114,19 @@ set(BOARDCORE_SRC
     ${BOARDCORE_PATH}/src/shared/sensors/LPS22DF/LPS22DF.cpp
     ${BOARDCORE_PATH}/src/shared/sensors/LSM6DSRX/LSM6DSRX.cpp
 
+    # Utils
+    ${BOARDCORE_PATH}/src/shared/utils/ButtonHandler/ButtonHandler.cpp
+    ${BOARDCORE_PATH}/src/shared/utils/PinObserver/PinObserver.cpp
+    ${BOARDCORE_PATH}/src/shared/utils/Stats/Stats.cpp
+    ${BOARDCORE_PATH}/src/shared/utils/TestUtils/TestHelper.cpp
+    ${BOARDCORE_PATH}/src/shared/utils/Registry/RegistryFrontend.cpp
+    ${BOARDCORE_PATH}/src/shared/utils/Registry/RegistrySerializer.cpp
+    ${BOARDCORE_PATH}/src/shared/utils/Registry/Backend/FileBackend.cpp
+)
+
+set(PROTECT_SRC
+    ${BOARDCORE_PATH}/src/shared/aspis/aspis.cpp
+
     # Calibration
     ${BOARDCORE_PATH}/src/shared/sensors/calibration/BiasCalibration/BiasCalibration.cpp
     ${BOARDCORE_PATH}/src/shared/sensors/calibration/SensorDataExtra/SensorDataExtra.cpp
@@ -140,23 +137,28 @@ set(BOARDCORE_SRC
     ${BOARDCORE_PATH}/src/shared/sensors/correction/BiasCorrector/BiasCorrector.cpp
     ${BOARDCORE_PATH}/src/shared/sensors/correction/SixParametersCorrector/SixParametersCorrector.cpp
 
+    # Algorithms
+    ${BOARDCORE_PATH}/src/shared/algorithms/AirBrakes/AirBrakesPI.cpp
+    ${BOARDCORE_PATH}/src/shared/algorithms/AirBrakes/AirBrakesInterp.cpp
+    ${BOARDCORE_PATH}/src/shared/algorithms/NAS/NAS.cpp
+    ${BOARDCORE_PATH}/src/shared/algorithms/NAS/StateInitializer.cpp
+    ${BOARDCORE_PATH}/src/shared/algorithms/Propagator/Propagator.cpp
+    ${BOARDCORE_PATH}/src/shared/algorithms/Follower/Follower.cpp
+    ${BOARDCORE_PATH}/src/shared/algorithms/MEA/MEA.cpp
+    ${BOARDCORE_PATH}/src/shared/algorithms/ADA/ADA.cpp
+
     # Utils
     ${BOARDCORE_PATH}/src/shared/utils/AeroUtils/AeroUtils.cpp
-    ${BOARDCORE_PATH}/src/shared/utils/ButtonHandler/ButtonHandler.cpp
-    ${BOARDCORE_PATH}/src/shared/utils/PinObserver/PinObserver.cpp
     ${BOARDCORE_PATH}/src/shared/utils/SkyQuaternion/SkyQuaternion.cpp
-    ${BOARDCORE_PATH}/src/shared/utils/Stats/Stats.cpp
-    ${BOARDCORE_PATH}/src/shared/utils/TestUtils/TestHelper.cpp
-    ${BOARDCORE_PATH}/src/shared/utils/Registry/RegistryFrontend.cpp
-    ${BOARDCORE_PATH}/src/shared/utils/Registry/RegistrySerializer.cpp
-    ${BOARDCORE_PATH}/src/shared/utils/Registry/Backend/FileBackend.cpp
-    ${BOARDCORE_PATH}/src/shared/utils/DependencyManager/DependencyManager.cpp
 )
 
-set(PROTECT_SRC
-    ${BOARDCORE_PATH}/src/shared/aspis/aspis.cpp
-    ${BOARDCORE_PATH}/src/shared/algorithms/MEA/MEA.cpp
-    ${BOARDCORE_PATH}/src/shared/algorithms/ADA/ADA.cpp
+set(TO_DUPLICATE_SRC
+    # Scheduler
+    ${BOARDCORE_PATH}/src/shared/scheduler/TaskScheduler.cpp
+    ${BOARDCORE_PATH}/src/shared/utils/DependencyManager/DependencyManager.cpp
+
+    # Events
+    ${BOARDCORE_PATH}/src/shared/events/EventBroker.cpp
 )
 
 function(link_boardcore_submodules TARGET TYPE)
@@ -195,30 +197,39 @@ endfunction()
 set(ASPIS_PASSES_PATH /home/streben/Documenti/ASPIS/build/passes)
 
 # Given two libs, it creates a static library
-function(apply_aspis_passes TO_PROTECT_LIB EXTERNAL_LIB OUTLIBRARY CXXFLAGS_RET)
+function(apply_aspis_passes TO_PROTECT_LIB EXTERNAL_LIB TO_DUPLICATE_LIB OUTLIBRARY CXXFLAGS_RET)
     # Getting the sources of the two libraries
     get_property(TO_PROTECT_SRC TARGET ${TO_PROTECT_LIB} PROPERTY SOURCES)
+    get_property(TO_DUPLICATE_SRC TARGET ${TO_DUPLICATE_LIB} PROPERTY SOURCES)
     get_property(EXTERNAL_SRC TARGET ${EXTERNAL_LIB} PROPERTY SOURCES)
 
     # Create list of compiled protected sources for each board
     set(PROTECT_COMPILED_SOURCES TO_PROTECT_COMPILED)
     list(TRANSFORM TO_PROTECT_SRC APPEND ".o" OUTPUT_VARIABLE PROTECT_COMPILED_SOURCES)
     list(TRANSFORM PROTECT_COMPILED_SOURCES REPLACE ${CMAKE_SOURCE_DIR} "")
-    list(TRANSFORM PROTECT_COMPILED_SOURCES PREPEND ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${TO_PROTECT_LIB}.dir)
+    list(TRANSFORM PROTECT_COMPILED_SOURCES PREPEND ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${TO_PROTECT_LIB}.dir/)
+    
+    # Create list of compiled boardcore sources for each board
+    set(TO_DUPLICATE_COMPILED_SOURCES EXTERNAL_COMPILED)
+    list(TRANSFORM TO_DUPLICATE_SRC APPEND ".o" OUTPUT_VARIABLE TO_DUPLICATE_COMPILED_SOURCES)
+    list(TRANSFORM TO_DUPLICATE_COMPILED_SOURCES REPLACE ${CMAKE_SOURCE_DIR} "")
+    list(TRANSFORM TO_DUPLICATE_COMPILED_SOURCES PREPEND ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${TO_DUPLICATE_LIB}.dir/)
     
     # Create list of compiled boardcore sources for each board
     set(EXTERNAL_COMPILED_SOURCES EXTERNAL_COMPILED)
     list(TRANSFORM EXTERNAL_SRC APPEND ".o" OUTPUT_VARIABLE EXTERNAL_COMPILED_SOURCES)
     list(TRANSFORM EXTERNAL_COMPILED_SOURCES REPLACE ${CMAKE_SOURCE_DIR} "")
-    list(TRANSFORM EXTERNAL_COMPILED_SOURCES PREPEND ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${EXTERNAL_LIB}.dir)
+    list(TRANSFORM EXTERNAL_COMPILED_SOURCES PREPEND ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${EXTERNAL_LIB}.dir/)
 
     add_custom_target(
         ${OUTLIBRARY}-target
         BYPRODUCTS lib${OUTLIBRARY}.a
         COMMAND export LLVM_SYMBOLIZER_PATH=${LLVM_PREFIX}/llvm-symbolizer
         COMMAND ${MIOSIX_PREFIX}-link ${EXTERNAL_COMPILED_SOURCES} -o externals.bc
-        COMMAND ${CMAKE_OPT} -load-pass-plugin=${ASPIS_PASSES_PATH}/libMarkToExclude.so --passes="mark-to-exclude" externals.bc -o externals.bc
-        COMMAND ${MIOSIX_PREFIX}-link -v ${PROTECT_COMPILED_SOURCES} externals.bc -o out.bc
+        COMMAND ${CMAKE_OPT} -load-pass-plugin=${ASPIS_PASSES_PATH}/libAddAnnotation.so --passes="mark-to-exclude" externals.bc -o externals.bc
+        COMMAND ${MIOSIX_PREFIX}-link ${TO_DUPLICATE_COMPILED_SOURCES} -o to_duplicate.bc
+        COMMAND ${CMAKE_OPT} -load-pass-plugin=${ASPIS_PASSES_PATH}/libAddAnnotation.so --passes="mark-to-duplicate" to_duplicate.bc -o to_duplicate.bc
+        COMMAND ${MIOSIX_PREFIX}-link -v ${PROTECT_COMPILED_SOURCES} externals.bc to_duplicate.bc -o out.bc
         # COMMAND ${CMAKE_OPT} -load-pass-plugin=${ASPIS_PASSES_PATH}/libEDDI.so --passes="func-ret-to-ref" out.bc -o ret_to_ref.bc
         # COMMAND ${CMAKE_OPT} -load-pass-plugin=${ASPIS_PASSES_PATH}/libSEDDI.so --passes="eddi-verify" ret_to_ref.bc -o out.bc -debug
         # COMMAND ${CMAKE_OPT} --passes="dce,simplifycfg" out.bc -o out.bc
@@ -229,6 +240,7 @@ function(apply_aspis_passes TO_PROTECT_LIB EXTERNAL_LIB OUTLIBRARY CXXFLAGS_RET)
         COMMENT "Applying ASPIS passes and creating archive lib${OUTLIBRARY}.a"
     )
     add_dependencies(${OUTLIBRARY}-target ${TO_PROTECT_LIB})
+    add_dependencies(${OUTLIBRARY}-target ${TO_DUPLICATE_LIB})
     add_dependencies(${OUTLIBRARY}-target ${EXTERNAL_LIB})
 
     # Importing the just built library
@@ -239,9 +251,10 @@ endfunction()
 
 
 # Given two libs, it creates an executable
-function(apply_aspis_passes_exe TO_PROTECT_EXE EXTERNAL_EXE OUTEXECUTABLE CXXFLAGS_RET)
+function(apply_aspis_passes_exe TO_PROTECT_EXE EXTERNAL_EXE TO_DUPLICATE_LIB OUTEXECUTABLE CXXFLAGS_RET)
     # Getting the sources of the two libraries
     get_property(TO_PROTECT_SRC TARGET ${TO_PROTECT_EXE} PROPERTY SOURCES)
+    get_property(TO_DUPLICATE_SRC TARGET ${TO_DUPLICATE_LIB} PROPERTY SOURCES)
     get_property(EXTERNAL_SRC TARGET ${EXTERNAL_EXE} PROPERTY SOURCES)
 
     # Create list of compiled protected sources for each board
@@ -250,6 +263,12 @@ function(apply_aspis_passes_exe TO_PROTECT_EXE EXTERNAL_EXE OUTEXECUTABLE CXXFLA
     list(TRANSFORM PROTECT_COMPILED_SOURCES REPLACE ${CMAKE_SOURCE_DIR} "")
     list(TRANSFORM PROTECT_COMPILED_SOURCES PREPEND ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${TO_PROTECT_EXE}.dir/)
     
+    # Create list of compiled boardcore sources for each board
+    set(TO_DUPLICATE_COMPILED_SOURCES EXTERNAL_COMPILED)
+    list(TRANSFORM TO_DUPLICATE_SRC APPEND ".o" OUTPUT_VARIABLE TO_DUPLICATE_COMPILED_SOURCES)
+    list(TRANSFORM TO_DUPLICATE_COMPILED_SOURCES REPLACE ${CMAKE_SOURCE_DIR} "")
+    list(TRANSFORM TO_DUPLICATE_COMPILED_SOURCES PREPEND ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${TO_DUPLICATE_LIB}.dir/)
+    
     # Create list of compiled boardcore sources for each board
     set(EXTERNAL_COMPILED_SOURCES EXTERNAL_COMPILED)
     list(TRANSFORM EXTERNAL_SRC APPEND ".o" OUTPUT_VARIABLE EXTERNAL_COMPILED_SOURCES)
@@ -261,8 +280,10 @@ function(apply_aspis_passes_exe TO_PROTECT_EXE EXTERNAL_EXE OUTEXECUTABLE CXXFLA
         BYPRODUCTS ${OUTEXECUTABLE}.elf
         COMMAND export LLVM_SYMBOLIZER_PATH=${LLVM_PREFIX}/llvm-symbolizer
         COMMAND ${MIOSIX_PREFIX}-link ${EXTERNAL_COMPILED_SOURCES} -o externals.bc
-        COMMAND ${CMAKE_OPT} -load-pass-plugin=${ASPIS_PASSES_PATH}/libMarkToExclude.so --passes="mark-to-exclude" externals.bc -o externals.bc
-        COMMAND ${MIOSIX_PREFIX}-link -v ${CMAKE_BINARY_DIR}/skyward_boardcore.bc ${PROTECT_COMPILED_SOURCES} externals.bc -o out.bc
+        COMMAND ${CMAKE_OPT} -load-pass-plugin=${ASPIS_PASSES_PATH}/libAddAnnotation.so --passes="mark-to-exclude" externals.bc -o externals.bc
+        COMMAND ${MIOSIX_PREFIX}-link ${TO_DUPLICATE_COMPILED_SOURCES} -o to_duplicate.bc
+        COMMAND ${CMAKE_OPT} -load-pass-plugin=${ASPIS_PASSES_PATH}/libAddAnnotation.so --passes="mark-to-duplicate" to_duplicate.bc -o to_duplicate.bc
+        COMMAND ${MIOSIX_PREFIX}-link -v ${CMAKE_BINARY_DIR}/skyward_boardcore.bc ${PROTECT_COMPILED_SOURCES} externals.bc to_duplicate.bc -o out.bc
         COMMAND ${CMAKE_OPT} -load-pass-plugin=${ASPIS_PASSES_PATH}/libEDDI.so --passes="func-ret-to-ref" out.bc -o ret_to_ref.bc
         COMMAND ${CMAKE_OPT} -load-pass-plugin=${ASPIS_PASSES_PATH}/libSEDDI.so --passes="eddi-verify" ret_to_ref.bc -o out.bc -debug
         COMMAND ${CMAKE_OPT} --passes="dce,simplifycfg" out.bc -o out.bc
@@ -273,6 +294,7 @@ function(apply_aspis_passes_exe TO_PROTECT_EXE EXTERNAL_EXE OUTEXECUTABLE CXXFLA
         COMMENT "Applying ASPIS passes and creating ${OUTEXECUTABLE}.elf"
     )
     add_dependencies(${OUTEXECUTABLE}-target ${TO_PROTECT_EXE})
+    add_dependencies(${OUTEXECUTABLE}-target ${TO_DUPLICATE_LIB})
     add_dependencies(${OUTEXECUTABLE}-target ${EXTERNAL_EXE})
 
 # /usr/lib64/ccache/clang++ --target=arm-none-eabi --sysroot=/opt/arm-miosix-eabi/arm-miosix-eabi/lib -g -O0 -Wl,-Map,/home/streben/Documenti/POLIMI/TESI/obsw/src/entrypoints/Main/build/main-entry.map -Wl,-Map,/home/streben/Documenti/POLIMI/TESI/obsw/src/entrypoints/Main/build/skyward-boardcore.map -mcpu=cortex-m7 -mthumb -mfloat-abi=hard -mfpu=fpv5-d16 -Wl,--gc-sections -Wl,-T/home/streben/Documenti/POLIMI/TESI/obsw/skyward-boardcore/src/bsps/stm32f767zi_gemini_motor/stm32_2m+16m_xram.ld -nostdlib -o main-entry.elf   -L/opt/arm-miosix-eabi/arm-miosix-eabi/lib/thumb/cm7/hardfp/fpv5  -L/opt/arm-miosix-eabi/lib/gcc/arm-miosix-eabi/9.2.0/thumb/cm7/hardfp/fpv5  libskyward-boardcore.a -Wl,--start-group libmiosix.a -lstdc++ -lc -lm -lgcc -latomic -Wl,--end-group
diff --git a/libs/miosix-kernel b/libs/miosix-kernel
index e25e6ce927806d6a1954f8750569fc67e2eb8b48..12840bc5a26610905ac8ee0f6b3e3256bb4713bb 160000
--- a/libs/miosix-kernel
+++ b/libs/miosix-kernel
@@ -1 +1 @@
-Subproject commit e25e6ce927806d6a1954f8750569fc67e2eb8b48
+Subproject commit 12840bc5a26610905ac8ee0f6b3e3256bb4713bb
diff --git a/src/tests/test-serial/CMakeLists.txt b/src/tests/test-serial/CMakeLists.txt
index ca864fd57be3085dc4f0ca20b5b173d91242e322..16c060fd83f70469a2c14e3dfda564c2630efef3 100644
--- a/src/tests/test-serial/CMakeLists.txt
+++ b/src/tests/test-serial/CMakeLists.txt
@@ -35,7 +35,7 @@ include(${TESTS_PATH}/../../CMakeLists.txt)
 
 # List here your source files (.s, .c and .cpp)
 add_executable(test-serial test-serial.cpp)
-boardcore_link_target(test-serial)
+boardcore_link_target(test-serial PUBLIC)
 
 # List here additional include directories
 # target_include_directories(test-serial PRIVATE here_your_includes)