diff --git a/cmake/aspis.cmake b/cmake/aspis.cmake
index 6e6287d55a0454d16d387e8183b40e6e122e0cdf..63f30a5fe7429d3511a0317e35c21b62dc734bb9 100644
--- a/cmake/aspis.cmake
+++ b/cmake/aspis.cmake
@@ -1,7 +1,7 @@
-include(${SBS_BASE}/libs/miosix-kernel/miosix/cmake/cmake-utils/cmake/LLVMIRUtil.cmake)
+# include(${SBS_BASE}/libs/miosix-kernel/miosix/cmake/cmake-utils/cmake/LLVMIRUtil.cmake)
 
-set(ASPIS_BASE_PATH ~/ASPIS)
-set(ASPIS_PASSES_PATH ${ASPIS_BASE_PATH}/build/passes)
+# set(ASPIS_BASE_PATH ~/ASPIS)
+# set(ASPIS_PASSES_PATH ${ASPIS_BASE_PATH}/build/passes)
 
 
 # function(aspis_passes source_files external_files)
@@ -14,18 +14,18 @@ set(ASPIS_PASSES_PATH ${ASPIS_BASE_PATH}/build/passes)
 #   llvmir_attach_link_target(${external_files}_link ${external_files}_ir)
 #
 # endfunction()
-function(aspis_passes TARGET)
-    set_target_properties(${TARGET} PROPERTIES LINKER_LANGUAGE CXX)
-    target_compile_options(${TARGET} PUBLIC "-O0")
+# function(aspis_passes TARGET)
+#     set_target_properties(${TARGET} PROPERTIES LINKER_LANGUAGE CXX)
+#     target_compile_options(${TARGET} PUBLIC "-O0")
 
-    if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL "5.0.0" OR
-        CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL "5.0.0")
-        target_compile_options(${TARGET} PUBLIC -Xclang -disable-O0-optnone)
-    endif()
+#     if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL "5.0.0" OR
+#         CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL "5.0.0")
+#         target_compile_options(${TARGET} PUBLIC -Xclang -disable-O0-optnone)
+#     endif()
 
-    llvmir_attach_bc_target(${TARGET}_ir ${TARGET})
-    llvmir_attach_link_target(${TARGET}_link ${TARGET}_ir)
-    # llvmir_attach_opt_pass_target(${TARGET}_eddi ${TARGET}_link -${ASPIS_PASSES_PATH}/libEDDI)
-    llvmir_attach_executable(${TARGET}_exe ${TARGET}_link)
+#     llvmir_attach_bc_target(${TARGET}_ir ${TARGET})
+#     llvmir_attach_link_target(${TARGET}_link ${TARGET}_ir)
+#     # llvmir_attach_opt_pass_target(${TARGET}_eddi ${TARGET}_link -${ASPIS_PASSES_PATH}/libEDDI)
+#     llvmir_attach_executable(${TARGET}_exe ${TARGET}_link)
 
-endfunction()
\ No newline at end of file
+# endfunction()
\ No newline at end of file
diff --git a/cmake/boardcore.cmake b/cmake/boardcore.cmake
index b45ff0b53fae4a5620a104a5a32253d665b054ff..4f3bbd20ffbd90bb706f15c2e0ae8cc89c0dfee8 100644
--- a/cmake/boardcore.cmake
+++ b/cmake/boardcore.cmake
@@ -27,6 +27,9 @@ include(${BOARDCORE_PATH}/cmake/dependencies.cmake)
 include(${BOARDCORE_PATH}/cmake/boardcore-host.cmake)
 include(${BOARDCORE_PATH}/cmake/boards.cmake)
 
+set(ASPIS_BASE_PATH ~/ASPIS)
+set(ASPIS_PASSES_PATH ${ASPIS_BASE_PATH}/build/passes)
+
 # Boardcore source files
 set(BOARDCORE_SRC
     # Actuators
@@ -135,14 +138,85 @@ set(BOARDCORE_SRC
     ${BOARDCORE_PATH}/src/shared/utils/TestUtils/TestHelper.cpp
 )
 
+set(DUPLICATE_SRC 
+    ${BOARDCORE_PATH}/src/tests/aspis/duplicate.cpp
+    ${BOARDCORE_PATH}/src/tests/aspis/dummy.cpp
+)
+
+# # Set flag for miosix base path
+# set(BASE_MIOSIX_TOOLCHAIN /home/ecorigliano/temp/arm-miosix-eabi)
+# set(CMAKE_LINKER       "${BASE_MIOSIX_TOOLCHAIN}/bin/arm-miosix-eabi-ld") # using patched miosix linker
+# add_link_options("-fuse-ld=${CMAKE_LINKER}")
+
 # Creates the Skyward::Boardcore::${BOARD_NAME} library
 function(add_boardcore_library BOARD_OPTIONS_FILE)
     # Get board options
     include(${BOARD_OPTIONS_FILE})
 
+    # Create a library for the duplications
+    set(DUPLICATION_LIB duplication-${BOARD_NAME})
+    add_library(${DUPLICATION_LIB} STATIC EXCLUDE_FROM_ALL ${DUPLICATE_SRC})
+    target_compile_options(${DUPLICATION_LIB} PUBLIC ${CMAKE_CXX_FLAGS} -flto)
+
     # Create a library for the board
     set(BOARDCORE_LIB boardcore-${BOARD_NAME})
     add_library(${BOARDCORE_LIB} STATIC EXCLUDE_FROM_ALL ${BOARDCORE_SRC})
+    target_compile_options(${BOARDCORE_LIB} PUBLIC ${CMAKE_CXX_FLAGS} -flto)
+
+    # Create list of compiled duplicated sources for each board
+    set(DUPLICATE_COMPILED_SOURCES DUPLICATE_COMP-${BOARD_NAME})
+    list(TRANSFORM DUPLICATE_SRC APPEND ".o" OUTPUT_VARIABLE DUPLICATE_COMPILED_SOURCES)
+    list(TRANSFORM DUPLICATE_COMPILED_SOURCES REPLACE ${BOARDCORE_PATH} "")
+    list(TRANSFORM DUPLICATE_COMPILED_SOURCES PREPEND ${BOARDCORE_PATH}/build/CMakeFiles/${DUPLICATION_LIB}.dir)
+    
+    # Create list of compiled boardcore sources for each board
+    set(BOARDCORE_COMPILED_SOURCES ${BOARDCORE_COMP-${BOARD_NAME}})
+    list(TRANSFORM BOARDCORE_SRC APPEND ".o" OUTPUT_VARIABLE BOARDCORE_COMPILED_SOURCES)
+    list(TRANSFORM BOARDCORE_COMPILED_SOURCES REPLACE ${BOARDCORE_PATH} "")
+    list(TRANSFORM BOARDCORE_COMPILED_SOURCES PREPEND ${BOARDCORE_PATH}/build/CMakeFiles/${BOARDCORE_LIB}.dir)
+    
+
+    add_custom_command(
+        OUTPUT duplicated-${BOARD_NAME}.ll.bak
+        COMMAND echo ${DUPLICATE_COMPILED_SOURCES}
+        COMMAND echo "STARTING DUPLICATED *.cpp.o"
+        COMMAND pwd
+        COMMAND llvm-link ${DUPLICATE_COMPILED_SOURCES} -o duplication-${BOARD_NAME}.ll
+        # COMMAND llvm-link -v CMakeFiles/duplication-stm32f767zi_compute_unit.dir/src/tests/aspis/ -o linked-${BOARD_NAME}.ll
+        COMMAND opt --bugpoint-enable-legacy-pm -load ${ASPIS_PASSES_PATH}/libEDDI.so -func_ret_to_ref duplication-${BOARD_NAME}.ll -o funcToRef.ll
+        COMMAND opt --bugpoint-enable-legacy-pm -load ${ASPIS_PASSES_PATH}/libEDDI.so -eddi_verify funcToRef.ll -o dataProtection.ll
+        COMMAND opt --bugpoint-enable-legacy-pm -simplifycfg dataProtection.ll -o simplifycfg.ll
+        COMMAND opt --bugpoint-enable-legacy-pm -load ${ASPIS_PASSES_PATH}/libRASM.so -rasm_verify simplifycfg.ll -o duplicated-${BOARD_NAME}.ll.bak
+        COMMAND echo "REMOVING ALL *.ll"
+        COMMAND rm *.ll
+        DEPENDS $<TARGET_FILE:${DUPLICATION_LIB}>
+        COMMENT "Applying ASPIS passes: duplicated-${BOARD_NAME}.ll.bak"
+    )
+
+    # add_custom_command(
+    #     TARGET ${DUPLICATION_LIB} POST_BUILD
+    #     COMMAND echo "STARTING DUPLICATED *.ll"
+    #     COMMAND llvm-link ${DUPLICATION_LIB} -o linked-${BOARD_NAME}.ll
+    #     COMMAND opt --bugpoint-enable-legacy-pm -load ${ASPIS_PASSES_PATH}/libEDDI.so -func_ret_to_ref duplication-${BOARD_NAME}.ll -o funcToRef.ll
+    #     COMMAND opt --bugpoint-enable-legacy-pm -load ${ASPIS_PASSES_PATH}/libEDDI.so -eddi_verify funcToRef.ll -o dataProtection.ll
+    #     COMMAND opt --bugpoint-enable-legacy-pm -simplifycfg dataProtection.ll -o simplifycfg.ll
+    #     COMMAND opt --bugpoint-enable-legacy-pm -load ${ASPIS_PASSES_PATH}/libRASM.so -rasm_verify simplifycfg.ll -o duplicated-${BOARD_NAME}.ll.bak
+    #     COMMAND echo "REMOVING ALL *.ll"
+    #     COMMAND rm *.ll
+    #     BYPRODUCTS duplicated-${BOARD_NAME}.ll.bak
+    #     DEPENDS $<TARGET_FILE:${DUPLICATION_LIB}>
+    #     COMMENT "Applying ASPIS passes: duplicated-${BOARD_NAME}.ll.bak"
+    #     VERBATIM
+    # )
+
+    # add_custom_command(
+    #         TARGET ${TARGET} POST_BUILD
+    #         COMMAND ${CMAKE_OBJCOPY} -O ihex ${TARGET} ${TARGET}.hex
+    #         COMMAND ${CMAKE_OBJCOPY} -O binary ${TARGET} ${TARGET}.bin
+    #         BYPRODUCTS ${TARGET}.hex ${TARGET}.bin
+    #         VERBATIM
+    #     )
+
 
     # Only one include directory for Boardcore!
     target_include_directories(${BOARDCORE_LIB} PUBLIC ${BOARDCORE_PATH}/src/shared)
@@ -159,6 +233,7 @@ function(add_boardcore_library BOARD_OPTIONS_FILE)
         fmt::fmt-header-only
         Catch2::Catch2
         Mavlink::Mavlink
+        ${DUPLICATION_LIB}
     )
 
     # Link MxGui if supported by the target
@@ -168,8 +243,34 @@ function(add_boardcore_library BOARD_OPTIONS_FILE)
         target_link_libraries(${BOARDCORE_LIB} PUBLIC MxGui::${BOARD_NAME})
     endif()
 
+    add_custom_command(
+        OUTPUT out-${BOARD_NAME}.ll
+        # TARGET ${BOARDCORE_LIB} POST_BUILD
+        COMMAND echo ${BOARDCORE_COMPILED_SOURCES}
+        COMMAND echo "STARTING BOARDCORE *.cpp.o"
+        COMMAND pwd
+        COMMAND llvm-link ${BOARDCORE_COMPILED_SOURCES} duplicated-${BOARD_NAME}.ll.bak -o linked-${BOARD_NAME}.ll
+        COMMAND opt --bugpoint-enable-legacy-pm -load ${ASPIS_PASSES_PATH}/libEDDI.so -duplicate_globals linked-${BOARD_NAME}.ll -o out-${BOARD_NAME}.ll.bak
+        COMMAND rm *.ll
+        COMMAND mv out-${BOARD_NAME}.ll.bak out-${BOARD_NAME}.ll
+        DEPENDS duplicated-${BOARD_NAME}.ll.bak $<TARGET_FILE:${BOARDCORE_LIB}> 
+        COMMENT "Applying ASPIS passes: out-${BOARD_NAME}.ll"
+    )
+    # add_dependencies(out-${BOARD_NAME}.ll ${BOARDCORE_LIB})
+    # add_dependencies(out-${BOARD_NAME}.ll duplicated-${BOARD_NAME}.ll.bak)
+
+    set(BOARDCORE_FINAL boardcore-lib-${BOARD_NAME})
+    add_library(${BOARDCORE_FINAL} STATIC EXCLUDE_FROM_ALL out-${BOARD_NAME}.ll)
+    target_link_libraries(${BOARDCORE_FINAL} PUBLIC ${BOARDCORE_LIB})
+
+    # add_custom_target(boardcore-target-${BOARD_NAME} ALL DEPENDS out-${BOARD_NAME}.ll)
+    # add_dependencies(boardcore-target-${BOARD_NAME} ${BOARDCORE_LIB})
+
+    # add_custom_target(duplicated-target-${BOARD_NAME} DEPENDS duplicated-${BOARD_NAME}.ll.bak)
+    # add_dependencies(duplicated-target-${BOARD_NAME} ${BOARDCORE_LIB})
+
     # Create a nice alias for the library
-    add_library(Skyward::Boardcore::${BOARD_NAME} ALIAS ${BOARDCORE_LIB})
+    add_library(Skyward::Boardcore::${BOARD_NAME} ALIAS ${BOARDCORE_FINAL})
 endfunction()
 
 # Create the Miosix libraries for Boardcore custom boards
diff --git a/cmake/sbs.cmake b/cmake/sbs.cmake
index 4ba733c68768da49745e8cc6a5c32baae3745edb..25d03aa9b102ff174aed3c42c7b8220f95adbced 100644
--- a/cmake/sbs.cmake
+++ b/cmake/sbs.cmake
@@ -32,9 +32,6 @@ cmake_path(GET CMAKE_CURRENT_LIST_DIR PARENT_PATH SBS_BASE)
 list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR})
 include(boardcore)
 
-# Include cmake functions to use ASPIS in a simple way
-include(aspis)
-
 # Command to print all the available boards used by the sbs script
 string(REPLACE ";" "\\n" BOARDS_STR "${MIOSIX_BOARDS};${BOARDCORE_BOARDS}")
 add_custom_target(
@@ -59,9 +56,6 @@ function(sbs_target TARGET OPT_BOARD)
 
         # Linker script and linking options are eredited from the kernel library
 
-        # Apply ASPIS passes
-        aspis_passes(${TARGET})
-
         # Add a post build command to create the hex file to flash on the board
         add_custom_command(
             TARGET ${TARGET} POST_BUILD
diff --git a/src/tests/aspis/dummy.cpp b/src/tests/aspis/dummy.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391