diff --git a/cmake/boardcore.cmake b/cmake/boardcore.cmake
index 3f489d2336708b6d8e89976855aa580703edb89e..c59f2ce5b4af78d3607e2094feabf4e91498461d 100644
--- a/cmake/boardcore.cmake
+++ b/cmake/boardcore.cmake
@@ -138,12 +138,57 @@ set(BOARDCORE_SRC
     ${BOARDCORE_PATH}/src/shared/utils/TestUtils/TestHelper.cpp
 )
 
-set(DUPLICATE_SRC 
+set(PROTECT_SRC 
     ${BOARDCORE_PATH}/src/tests/aspis/duplicate.cpp
     ${BOARDCORE_PATH}/src/tests/aspis/dummy.cpp
 )
 
-function(add_options_boardcore_library LIB TYPE)
+# 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/)
+    
+    add_custom_target(
+        ${OUTLIBRARY}-target
+        BYPRODUCTS lib${OUTLIBRARY}.a
+        COMMAND llvm-link ${PROTECT_COMPILED_SOURCES} -o duplication.bc
+        COMMAND opt --bugpoint-enable-legacy-pm -load ${ASPIS_PASSES_PATH}/libEDDI.so -func_ret_to_ref duplication.bc -o funcToRef.bc
+        COMMAND opt --bugpoint-enable-legacy-pm -load ${ASPIS_PASSES_PATH}/libSEDDI.so -eddi_verify funcToRef.bc -o dataProtection.bc
+        COMMAND opt --bugpoint-enable-legacy-pm -simplifycfg dataProtection.bc -o simplifycfg.bc
+        COMMAND opt --bugpoint-enable-legacy-pm -load ${ASPIS_PASSES_PATH}/libRASM.so -rasm_verify simplifycfg.bc -o protected.bc
+        COMMAND llvm-link ${EXTERNAL_COMPILED_SOURCES} protected.bc -o linked.bc
+        COMMAND opt --bugpoint-enable-legacy-pm -load ${ASPIS_PASSES_PATH}/libEDDI.so -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 llvm-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(add_options_boardcore_library LIB TYPE BOARD_NAME)
     # Only one include directory for Boardcore!
     target_include_directories(${LIB} ${TYPE} ${BOARDCORE_PATH}/src/shared)
 
@@ -177,91 +222,25 @@ function(add_boardcore_library BOARD_OPTIONS_FILE)
     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} PRIVATE -S -emit-llvm)
-    target_link_libraries(${DUPLICATION_LIB} PUBLIC Miosix::Interface::${BOARD_NAME})
+    set(PROTECTED_LIB duplication-${BOARD_NAME})
+    add_library(${PROTECTED_LIB} STATIC EXCLUDE_FROM_ALL ${PROTECT_SRC})
+    target_compile_options(${PROTECTED_LIB} PRIVATE -S -emit-llvm)
+    add_options_boardcore_library(${PROTECTED_LIB} PUBLIC ${BOARD_NAME})
+    target_link_libraries(${PROTECTED_LIB} PUBLIC Miosix::Interface::${BOARD_NAME})
 
     # 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} PRIVATE -S -emit-llvm)
+    add_options_boardcore_library(${BOARDCORE_LIB} PUBLIC ${BOARD_NAME})
     target_link_libraries(${BOARDCORE_LIB} PUBLIC Miosix::Interface::${BOARD_NAME})
 
-    # 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 ${CMAKE_CURRENT_BINARY_DIR}/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 ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${BOARDCORE_LIB}.dir)
-    
-    add_custom_command(
-        OUTPUT duplicated-${BOARD_NAME}.ll.bak
-        COMMAND llvm-link ${DUPLICATE_COMPILED_SOURCES} -o duplication-${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
-        DEPENDS $<TARGET_FILE:${DUPLICATION_LIB}>
-        COMMENT "Applying ASPIS passes: duplicated-${BOARD_NAME}.ll.bak"
-    )
-
-    add_options_boardcore_library(${BOARDCORE_LIB} PUBLIC)
-    add_options_boardcore_library(${DUPLICATION_LIB} PUBLIC)
-    target_link_libraries(${BOARDCORE_LIB} PUBLIC ${DUPLICATION_LIB})
-    
-    add_custom_command(
-        OUTPUT out-${BOARD_NAME}.bc
-        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}.bc.bak
-        COMMAND rm *.ll
-        COMMAND mv out-${BOARD_NAME}.bc.bak out-${BOARD_NAME}.bc
-        DEPENDS duplicated-${BOARD_NAME}.ll.bak $<TARGET_FILE:${BOARDCORE_LIB}> 
-        COMMENT "Applying ASPIS passes: out-${BOARD_NAME}.bc"
-    )
-    
-    set_property(
-        SOURCE ${CMAKE_CURRENT_BINARY_DIR}/out-${BOARD_NAME}.bc 
-        PROPERTY EXTERNAL_OBJECT TRUE
-    )
-
-    add_custom_target(
-        libboardcore-target-${BOARD_NAME}
-        DEPENDS out-${BOARD_NAME}.bc
-    )
-
-    add_dependencies(libboardcore-target-${BOARD_NAME} ${BOARDCORE_LIB})
-
-    # Compose all the building flags necessary to build the static library
-    set(COMPILATION_FLAGS 
-        --target=arm-none-eabi
-        ${CXXFLAGS_BASE} # C++ Flags
-    )
-
-    # Command to crosscompiling the generated bitcode and creating the static library
-    add_custom_target(
-        libboardcore-lib-target-${BOARD_NAME}
-        COMMAND clang++ -c ${COMPILATION_FLAGS} -o compiled-${BOARD_NAME}.o out-${BOARD_NAME}.bc
-        COMMAND llvm-ar ru libboardcore-lib-${BOARD_NAME}.a compiled-${BOARD_NAME}.o
-        DEPENDS libboardcore-target-${BOARD_NAME}
-        COMMAND_EXPAND_LISTS
-        COMMENT "Creating archive: libboardcore-lib-${BOARD_NAME}.a"
-    )
-    add_dependencies(libboardcore-lib-target-${BOARD_NAME} libboardcore-target-${BOARD_NAME})
-
-    # Importing the just built library
     set(BOARDCORE_FINAL boardcore-lib-${BOARD_NAME})
-    add_library(${BOARDCORE_FINAL} STATIC IMPORTED)
-    add_dependencies(${BOARDCORE_FINAL} libboardcore-lib-target-${BOARD_NAME})
-    set_target_properties(${BOARDCORE_FINAL} PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_BINARY_DIR}/libboardcore-lib-${BOARD_NAME}.a)
-    target_link_libraries(${BOARDCORE_FINAL} INTERFACE Miosix::Interface::${BOARD_NAME})
 
-    add_options_boardcore_library(${BOARDCORE_FINAL} INTERFACE)
+    get_property(CXXFLAGS_RET TARGET Miosix::Interface::${BOARD_NAME} PROPERTY TARGET_CXX_FLAGS)
+
+    apply_aspis_passes(${PROTECTED_LIB} ${BOARDCORE_LIB} ${BOARDCORE_FINAL} "${CXXFLAGS_RET}")
+    add_options_boardcore_library(${BOARDCORE_FINAL} INTERFACE ${BOARD_NAME})
 
     # Create a nice alias for the library
     add_library(Skyward::Boardcore::${BOARD_NAME} ALIAS ${BOARDCORE_FINAL})
@@ -276,3 +255,4 @@ endforeach()
 foreach(BOARD_OPTIONS_FILE ${MIOSIX_BOARDS_OPTIONS_FILES} ${BOARDCORE_BOARDS_OPTIONS_FILES})
     add_boardcore_library(${BOARD_OPTIONS_FILE})
 endforeach()
+
diff --git a/cmake/sbs.cmake b/cmake/sbs.cmake
index 25d03aa9b102ff174aed3c42c7b8220f95adbced..7e72aa86614508ddf61c8b7e50e4e4f186a258a0 100644
--- a/cmake/sbs.cmake
+++ b/cmake/sbs.cmake
@@ -41,6 +41,38 @@ add_custom_target(
     VERBATIM
 )
 
+function(obsw_target TARGET OPT_BOARD TO_DUPLICATE_SRCS EXTERNAL_SRCS INCLUDE_DIRS)
+    # Retrieve compilation flags
+    get_property(CXXFLAGS_RET TARGET Miosix::Interface::${OPT_BOARD} PROPERTY TARGET_CXX_FLAGS)
+
+    # Create a library for the duplications
+    set(PROTECTED_LIB obsw-duplication-${TARGET})
+    add_library(${PROTECTED_LIB} STATIC EXCLUDE_FROM_ALL ${${TO_DUPLICATE_SRCS}})
+    target_compile_options(${PROTECTED_LIB} PRIVATE -S -emit-llvm)
+    target_link_libraries(${PROTECTED_LIB} PUBLIC Skyward::Boardcore::${OPT_BOARD})
+    target_include_directories(${PROTECTED_LIB} PRIVATE ${${INCLUDE_DIRS}})
+
+    # Create a library for the board
+    set(EXTERNAL_LIB obsw-external-${TARGET})
+    add_library(${EXTERNAL_LIB} STATIC EXCLUDE_FROM_ALL ${${EXTERNAL_SRCS}})
+    target_compile_options(${EXTERNAL_LIB} PRIVATE -S -emit-llvm)
+    target_link_libraries(${EXTERNAL_LIB} PUBLIC Skyward::Boardcore::${OPT_BOARD})
+    target_include_directories(${EXTERNAL_LIB} PRIVATE ${${INCLUDE_DIRS}})
+
+    # Create the OBSW library
+    set(OBSW_LIB obsw-lib-${TARGET})
+    apply_aspis_passes(${PROTECTED_LIB} ${EXTERNAL_LIB} ${OBSW_LIB} "${CXXFLAGS_RET}")
+    target_include_directories(${PROTECTED_LIB} PRIVATE ${${INCLUDE_DIRS}})
+    target_link_libraries(${OBSW_LIB} INTERFACE Skyward::Boardcore::${OPT_BOARD})
+
+    # Create a nice alias for the library
+    add_library(Skyward::OBSW::${OPT_BOARD} ALIAS ${OBSW_LIB})
+    
+    target_link_libraries(${TARGET} PRIVATE Skyward::OBSW::${OPT_BOARD})
+
+    sbs_target(${TARGET} ${OPT_BOARD})
+endfunction()
+
 # Function to link the Boardcore library to the target
 function(sbs_target TARGET OPT_BOARD)
     if(NOT OPT_BOARD)
diff --git a/libs/miosix-kernel b/libs/miosix-kernel
index c38939b1a5538973b27cd8903aef1525fa8c1bc5..36f524fe87f75655c454ad2f228798dbe57f68c6 160000
--- a/libs/miosix-kernel
+++ b/libs/miosix-kernel
@@ -1 +1 @@
-Subproject commit c38939b1a5538973b27cd8903aef1525fa8c1bc5
+Subproject commit 36f524fe87f75655c454ad2f228798dbe57f68c6