diff --git a/cmake/boardcore.cmake b/cmake/boardcore.cmake
index 4f3bbd20ffbd90bb706f15c2e0ae8cc89c0dfee8..e0ee49b617aabc6b157eff7769f7f0dff8918796 100644
--- a/cmake/boardcore.cmake
+++ b/cmake/boardcore.cmake
@@ -26,6 +26,7 @@ cmake_path(GET CMAKE_CURRENT_LIST_DIR PARENT_PATH BOARDCORE_PATH)
 include(${BOARDCORE_PATH}/cmake/dependencies.cmake)
 include(${BOARDCORE_PATH}/cmake/boardcore-host.cmake)
 include(${BOARDCORE_PATH}/cmake/boards.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)
@@ -148,6 +149,33 @@ set(DUPLICATE_SRC
 # set(CMAKE_LINKER       "${BASE_MIOSIX_TOOLCHAIN}/bin/arm-miosix-eabi-ld") # using patched miosix linker
 # add_link_options("-fuse-ld=${CMAKE_LINKER}")
 
+function(add_options_boardcore_library LIB)
+    # Only one include directory for Boardcore!
+    target_include_directories(${LIB} PUBLIC ${BOARDCORE_PATH}/src/shared)
+
+    # Define DEBUG when in Debug mode
+    target_compile_definitions(${LIB} PUBLIC $<$<CONFIG:Debug>:DEBUG>)
+    target_compile_options(${LIB} PUBLIC -gdwarf-4) 
+
+    # Link libraries
+    target_link_libraries(${LIB} PUBLIC
+        $<TARGET_OBJECTS:Miosix::Boot::${BOARD_NAME}>
+        $<LINK_GROUP:RESCAN,Miosix::Kernel::${BOARD_NAME},stdc++,c,m,gcc,atomic>
+        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(${LIB} PUBLIC MxGui::${MXGUI_BASE_BOARD_NAME})
+    elseif(TARGET MxGui::${BOARD_NAME})
+        target_link_libraries(${LIB} PUBLIC MxGui::${BOARD_NAME})
+    endif()
+endfunction()
+
 # Creates the Skyward::Boardcore::${BOARD_NAME} library
 function(add_boardcore_library BOARD_OPTIONS_FILE)
     # Get board options
@@ -156,118 +184,84 @@ function(add_boardcore_library 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)
+    target_compile_options(${DUPLICATION_LIB} PRIVATE -S -emit-llvm)
+    target_link_libraries(${DUPLICATION_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} PUBLIC ${CMAKE_CXX_FLAGS} -flto)
+    target_compile_options(${BOARDCORE_LIB} PRIVATE -S -emit-llvm)
+    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 ${BOARDCORE_PATH}/build/CMakeFiles/${DUPLICATION_LIB}.dir)
+    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 ${BOARDCORE_PATH}/build/CMakeFiles/${BOARDCORE_LIB}.dir)
+    list(TRANSFORM BOARDCORE_COMPILED_SOURCES PREPEND ${CMAKE_CURRENT_BINARY_DIR}/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)
-
-    # Define DEBUG when in Debug mode
-    target_compile_definitions(${BOARDCORE_LIB} PUBLIC $<$<CONFIG:Debug>:DEBUG>) 
-
-    # Link libraries
-    target_link_libraries(${BOARDCORE_LIB} PUBLIC
-        $<TARGET_OBJECTS:Miosix::Boot::${BOARD_NAME}>
-        $<LINK_GROUP:RESCAN,Miosix::Kernel::${BOARD_NAME},stdc++,c,m,gcc,atomic>
-        TSCPP::TSCPP
-        Eigen3::Eigen
-        fmt::fmt-header-only
-        Catch2::Catch2
-        Mavlink::Mavlink
-        ${DUPLICATION_LIB}
-    )
-
-    # Link MxGui if supported by the target
-    if(DEFINED MXGUI_BASE_BOARD_NAME)
-        target_link_libraries(${BOARDCORE_LIB} PUBLIC MxGui::${MXGUI_BASE_BOARD_NAME})
-    elseif(TARGET MxGui::${BOARD_NAME})
-        target_link_libraries(${BOARDCORE_LIB} PUBLIC MxGui::${BOARD_NAME})
-    endif()
-
+    add_options_boardcore_library(${BOARDCORE_LIB})
+    add_options_boardcore_library(${DUPLICATION_LIB})
+    target_link_libraries(${BOARDCORE_LIB} PUBLIC ${DUPLICATION_LIB})
+    
     add_custom_command(
-        OUTPUT out-${BOARD_NAME}.ll
+        OUTPUT out-${BOARD_NAME}.bc
         # 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 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}.ll.bak out-${BOARD_NAME}.ll
+        COMMAND mv out-${BOARD_NAME}.bc.bak out-${BOARD_NAME}.bc
+        # COMMAND clang ${COMPILE_FLAGS} ${COMPILE_DEFINITIONS} ${INCLUDE_DIRECTORIES} -c -o compiled-${BOARD_NAME}.o out-${BOARD_NAME}.bc
+        # COMMAND llvm-ar r libboardcore-lib-${BOARD_NAME}.a compiled-${BOARD_NAME}.o
+        # COMMAND llc -filetype=obj -o compiled-${BOARD_NAME} out-${BOARD_NAME}.bc
         DEPENDS duplicated-${BOARD_NAME}.ll.bak $<TARGET_FILE:${BOARDCORE_LIB}> 
-        COMMENT "Applying ASPIS passes: out-${BOARD_NAME}.ll"
+        COMMENT "Applying ASPIS passes: out-${BOARD_NAME}.bc"
     )
-    # 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(
+        libboardcore-target-${BOARD_NAME}
+        DEPENDS out-${BOARD_NAME}.bc
+    )
+    # IMPORTANT! $<TARGET_PROPERTY:${BOARDCORE_LIB},COMPILE_OPTIONS>
 
-    # add_custom_target(duplicated-target-${BOARD_NAME} DEPENDS duplicated-${BOARD_NAME}.ll.bak)
-    # add_dependencies(duplicated-target-${BOARD_NAME} ${BOARDCORE_LIB})
+    set(BOARDCORE_FINAL boardcore-lib-${BOARD_NAME})
+    add_library(${BOARDCORE_FINAL} STATIC EXCLUDE_FROM_ALL ${CMAKE_CURRENT_BINARY_DIR}/out-${BOARD_NAME}.bc)
+    target_link_libraries(${BOARDCORE_FINAL} PUBLIC Miosix::Interface::${BOARD_NAME})
+    add_options_boardcore_library(${BOARDCORE_FINAL})
+    add_dependencies(libboardcore-target-${BOARD_NAME} ${BOARDCORE_LIB})
+    add_dependencies(${BOARDCORE_FINAL} libboardcore-target-${BOARD_NAME})
+    add_dependencies(${BOARDCORE_FINAL} ${BOARDCORE_LIB})
+
+    ### Trying imported library
+    # add_library(${BOARDCORE_FINAL} STATIC IMPORTED)
+    # add_dependencies(${BOARDCORE_FINAL} libboardcore-target-${BOARD_NAME})
+    # set_target_properties(${BOARDCORE_FINAL} PROPERTIES IMPORTED_LOCATION libboardcore-lib-${BOARD_NAME}.a)
+    # target_link_libraries(${BOARDCORE_FINAL} INTERFACE Miosix::Interface::${BOARD_NAME})
+
+    ### Trying using the utility
+    # llvmir_attach_library(${BOARDCORE_FINAL} out-${BOARD_NAME}.bc STATIC EXCLUDE_FROM_ALL)
+
+    # add_library(${BOARDCORE_FINAL} STATIC EXCLUDE_FROM_ALL compiled-${BOARD_NAME})
+    # add_dependencies(${BOARDCORE_FINAL} ${BOARDCORE_LIB})
+    # target_link_libraries(${BOARDCORE_FINAL} PUBLIC ${BOARDCORE_LIB} ${CMAKE_CURRENT_BINARY_DIR}/out-${BOARD_NAME}.bc)
+    # set_target_properties(${BOARDCORE_FINAL} PROPERTIES LINKER_LANGUAGE CXX)
 
     # Create a nice alias for the library
     add_library(Skyward::Boardcore::${BOARD_NAME} ALIAS ${BOARDCORE_FINAL})