diff --git a/CMakeLists.txt b/CMakeLists.txt
index 88149950fc8e4b508382ee92c1c832856e93c459..19a8f8514e7e9800dd452e6c9d7c0a67e1e19cd3 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -32,32 +32,36 @@ set(BOARDCORE_PATH ${CMAKE_CURRENT_LIST_DIR} CACHE PATH "Path to the skyward-boa
 # Includes all board/arch specific defines, dependencies, source files and boardcore_link_target function
 include(${BOARDCORE_PATH}/cmake/boardcore.cmake)
 
-# Define the miosix library with kernel and architecture sources
-add_library(skyward-boardcore STATIC ${BOARDCORE_SRC})
-
-# Only one include directory for Boardcore!
-target_include_directories(skyward-boardcore PUBLIC ${BOARDCORE_PATH}/src/shared)
-
-# Define DEBUG when in Debug mode
-target_compile_definitions(skyward-boardcore PUBLIC $<$<CONFIG:Debug>:DEBUG>)
-# Define NDEBUG when not in Debug mode
-target_compile_definitions(skyward-boardcore PUBLIC $<$<NOT:$<CONFIG:Debug>>:NDEBUG>)
-
-# Link libraries
-include(${MIOSIX_KPATH}/cmake/LinkTarget.cmake)
-miosix_link_target(skyward-boardcore)
-
-target_link_libraries(skyward-boardcore PUBLIC
-    TSCPP::TSCPP
-    Eigen3::Eigen
-    fmt::fmt-header-only
-    Catch2::Catch2
-    Mavlink::Mavlink
-)
-
-# Link MxGui if supported by the target
-if(DEFINED MXGUI_BASE_BOARD_NAME)
-    target_link_libraries(skyward-boardcore PUBLIC MxGui::${MXGUI_BASE_BOARD_NAME})
-elseif(TARGET MxGui::${BOARD_NAME})
-    target_link_libraries(skyward-boardcore PUBLIC MxGui::${BOARD_NAME})
-endif()
+
+# ### DEFAULT
+
+# # Define the miosix library with kernel and architecture sources
+# add_library(skyward-boardcore STATIC ${BOARDCORE_SRC} ${PROTECT_SRC})
+# link_boardcore_submodules(skyward-boardcore PUBLIC)
+# link_boardcore_libraries(skyward-boardcore PUBLIC)
+
+
+### ASPIS
+
+# Create a library for the duplications
+add_library(to_protect_lib STATIC EXCLUDE_FROM_ALL ${PROTECT_SRC})
+target_compile_options(to_protect_lib PRIVATE -S -emit-llvm)
+# add_options_boardcore_library(to_protect_lib PUBLIC ${BOARD_NAME})
+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})
+target_compile_options(external_lib PRIVATE -S -emit-llvm)
+# add_options_boardcore_library(external_lib PUBLIC ${BOARD_NAME})
+link_boardcore_submodules(external_lib PUBLIC)
+link_boardcore_libraries(external_lib PUBLIC)
+
+get_property(CXXFLAGS_RET TARGET miosix PROPERTY TARGET_CXX_FLAGS)
+
+apply_aspis_passes(to_protect_lib external_lib skyward-boardcore "${CXXFLAGS_RET}")
+# add_options_boardcore_library(skyward-boardcore INTERFACE ${BOARD_NAME})
+
+link_boardcore_submodules(skyward-boardcore INTERFACE)
+link_boardcore_libraries(skyward-boardcore INTERFACE)
+
diff --git a/cmake/boardcore.cmake b/cmake/boardcore.cmake
index f37825291985479e8bf0e12257c7d88e819aebb0..2dfdeaaa41869b533c0fdf885b0e35db3ca317b7 100644
--- a/cmake/boardcore.cmake
+++ b/cmake/boardcore.cmake
@@ -45,8 +45,8 @@ set(BOARDCORE_SRC
     ${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/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
@@ -153,6 +153,97 @@ set(BOARDCORE_SRC
     ${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
+)
+
+function(link_boardcore_submodules TARGET TYPE)
+    # Only one include directory for Boardcore!
+    target_include_directories(${TARGET} ${TYPE} ${BOARDCORE_PATH}/src/shared)
+
+    # Define DEBUG when in Debug mode
+    target_compile_definitions(${TARGET} ${TYPE} $<$<CONFIG:Debug>:DEBUG>)
+    # Define NDEBUG when not in Debug mode
+    target_compile_definitions(${TARGET} ${TYPE} $<$<NOT:$<CONFIG:Debug>>:NDEBUG>)
+
+    # Link libraries
+    include(${MIOSIX_KPATH}/cmake/LinkTarget.cmake)
+    miosix_link_target(${TARGET} ${TYPE})
+
+endfunction()
+
+function(link_boardcore_libraries TARGET TYPE)
+    target_link_libraries(${TARGET} ${TYPE}
+        TSCPP::TSCPP
+        Eigen3::Eigen
+        fmt::fmt-header-only
+        Catch2::Catch2
+        Mavlink::Mavlink
+    )
+
+    # Link MxGui if supported by the target
+    if(DEFINED MXGUI_BASE_BOARD_NAME)
+        target_link_libraries(${TARGET} ${TYPE} MxGui::${MXGUI_BASE_BOARD_NAME})
+    elseif(TARGET MxGui::${BOARD_NAME})
+        target_link_libraries(${TARGET} ${TYPE} MxGui::${BOARD_NAME})
+    endif()
+endfunction()
+
+# Given two libs, it creates a static library
+function(apply_aspis_passes TO_PROTECT_LIB EXTERNAL_LIB OUTLIBRARY CXXFLAGS_RET)
+    # Getting the sources of the two libraries
+    get_property(TO_PROTECT_SRC TARGET ${TO_PROTECT_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)
+    
+    # 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)
+    
+    set(ASPIS_PASSES_PATH /home/streben/Documenti/POLIMI/TESI/ASPIS/build/passes)
+
+    add_custom_target(
+        ${OUTLIBRARY}-target
+        BYPRODUCTS lib${OUTLIBRARY}.a
+        COMMAND echo "${PROTECT_COMPILED_SOURCES}"
+        COMMAND ${MIOSIX_PREFIX}-link -v ${PROTECT_COMPILED_SOURCES} -o duplication.bc 
+        COMMAND ${CMAKE_OPT} -load-pass-plugin=${ASPIS_PASSES_PATH}/libEDDI.so --passes="func-ret-to-ref" duplication.bc -o funcToRef.bc
+        # COMMAND ${CMAKE_OPT} --bugpoint-enable-legacy-pm -load ${ASPIS_PASSES_PATH}/libEDDI.so -func_ret_to_ref duplication.bc -o funcToRef.bc
+        # COMMAND ${CMAKE_OPT} --bugpoint-enable-legacy-pm -load  -eddi_verify funcToRef.bc -o dataProtection.bc
+        COMMAND ${CMAKE_OPT} -load-pass-plugin=${ASPIS_PASSES_PATH}/libSEDDI.so --passes="eddi-verify" funcToRef.bc -o dataProtection.bc
+        COMMAND ${CMAKE_OPT} --passes="dce,simplifycfg" dataProtection.bc -o simplifycfg.bc
+        COMMAND ${CMAKE_OPT} -load-pass-plugin=${ASPIS_PASSES_PATH}/libRASM.so --passes="rasm-verify" simplifycfg.bc -o protected.bc
+        COMMAND echo "${EXTERNAL_COMPILED_SOURCES}"
+        COMMAND ${MIOSIX_PREFIX}-link ${EXTERNAL_COMPILED_SOURCES} protected.bc -o linked.bc
+        COMMAND ${CMAKE_OPT} -load-pass-plugin=${ASPIS_PASSES_PATH}/libEDDI.so --passes="duplicate-globals" linked.bc -o out.bc
+        COMMAND echo "cxxflags_ret : ${CXXFLAGS_RET} ${${CXXFLAGS_RET}}"
+        COMMAND echo "CXXFLAGS_BASE: ${CXXFLAGS_BASE}"
+        # COMMAND clang++ -c --target=arm-none-eabi ${${CXXFLAGS_RET}} -o compiled.o out.bc 
+        COMMAND clang++ -c --target=arm-none-eabi ${CXXFLAGS_RET} -o compiled.o out.bc 
+        COMMAND ${CMAKE_AR} ru lib${OUTLIBRARY}.a compiled.o
+        COMMAND_EXPAND_LISTS
+        COMMENT "Applying ASPIS passes and creating archive lib${OUTLIBRARY}.a"
+    )
+    add_dependencies(${OUTLIBRARY}-target ${TO_PROTECT_LIB})
+    add_dependencies(${OUTLIBRARY}-target ${EXTERNAL_LIB})
+
+    # Importing the just built library
+    add_library(${OUTLIBRARY} STATIC IMPORTED)
+    add_dependencies(${OUTLIBRARY} ${OUTLIBRARY}-target)
+    set_target_properties(${OUTLIBRARY} PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_BINARY_DIR}/lib${OUTLIBRARY}.a)
+endfunction()
+
+
+
 # Function to link the Miosix libraries to a target and register the build command
 #
 #   boardcore_link_target(<target>)
@@ -165,7 +256,7 @@ set(BOARDCORE_SRC
 function(boardcore_link_target TARGET)
 
     # Linker script and linking options are eredited from miosix libraries
-    
+
     # Linking skyward-boardcore library
     target_link_libraries(${TARGET} PUBLIC skyward-boardcore)
 
diff --git a/src/shared/aspis/aspis.cpp b/src/shared/aspis/aspis.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..9e61a7e49076a888dd199512ec9884e767bc6e42
--- /dev/null
+++ b/src/shared/aspis/aspis.cpp
@@ -0,0 +1,12 @@
+#include "aspis.h"
+
+void __attribute__((weak)) DataCorruption_Handler()
+{
+    while(1);
+}
+
+
+void __attribute__((weak)) SigMismatch_Handler()
+{
+    while(1);
+}
\ No newline at end of file
diff --git a/src/shared/aspis/aspis.h b/src/shared/aspis/aspis.h
new file mode 100644
index 0000000000000000000000000000000000000000..17c43706c8b12892b7bdd32ad0cff14734e980de
--- /dev/null
+++ b/src/shared/aspis/aspis.h
@@ -0,0 +1,2 @@
+void DataCorruption_Handler();
+void SigMismatch_Handler();
\ No newline at end of file