diff --git a/CMakeLists.txt b/CMakeLists.txt
index 2a0858b970dead0233261c4f3c126a0bf64732f7..f87073892cda90d1c6ae8340c5c7597cf0003f34 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -88,5 +88,5 @@ add_subdirectory(projects)
 
 if (NOT WIN32)
 	# add doxygen as target if installed
-	include(${vkcv_config}/ext/Doxygen.cmake)
+	include(${vkcv_config_ext}/Doxygen.cmake)
 endif()
\ No newline at end of file
diff --git a/config/Libraries.cmake b/config/Libraries.cmake
index 512669ce85a96f8cc94d8181994cfe458fa8b604..9ad756c0d7a82cb68d0dfc1d7e7c33a132892208 100644
--- a/config/Libraries.cmake
+++ b/config/Libraries.cmake
@@ -16,6 +16,12 @@ if(NOT WIN32)
 	list(APPEND vkcv_flags -fopenmp)
 endif()
 
+# add custom functions to use git automatically
+include(${vkcv_config_ext}/Git.cmake)
+
+init_git_lfs()
+init_git_submodules()
+
 list(APPEND vkcv_definitions _USE_MATH_DEFINES)
 
 # some formatted printing
diff --git a/config/ext/Git.cmake b/config/ext/Git.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..01df5176fa6c4a225d888d5f1b65e4c4a5b81a91
--- /dev/null
+++ b/config/ext/Git.cmake
@@ -0,0 +1,74 @@
+
+function(init_git_lfs)
+    find_program(git_program "git")
+
+    if (EXISTS ${git_program})
+        add_custom_target(
+                init_git_lfs
+                WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}"
+        )
+
+        add_custom_command(
+                TARGET init_git_lfs
+                PRE_BUILD
+                WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}"
+                COMMAND git lfs install
+                COMMENT "Initializing Git LFS"
+        )
+    endif()
+endfunction()
+
+function(init_git_submodules)
+    find_program(git_program "git")
+
+    if (EXISTS ${git_program})
+        add_custom_target(
+                init_git_submodules
+                WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}"
+        )
+
+        add_custom_command(
+                TARGET init_git_submodules
+                PRE_BUILD
+                WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}"
+                COMMAND git submodule init
+                COMMENT "Initializing Git Submodules"
+        )
+    endif()
+endfunction()
+
+function(use_git_submodule submodule_path submodule_status)
+    if (EXISTS "${submodule_path}")
+        set(${submodule_status} TRUE PARENT_SCOPE)
+        return()
+    endif()
+
+    get_filename_component(submodule_directory ${submodule_path} DIRECTORY)
+    get_filename_component(submodule_name ${submodule_path} NAME)
+
+    find_program(git_program "git")
+
+    if (EXISTS ${git_program})
+        add_custom_target(
+                "git_submodule_${submodule_name}"
+                WORKING_DIRECTORY "${submodule_directory}"
+        )
+
+        add_custom_command(
+                TARGET "git_submodule_${submodule_name}"
+                PRE_BUILD
+                WORKING_DIRECTORY "${submodule_directory}"
+                COMMAND git submodule update
+                COMMENT "Updating Git Submodules"
+        )
+
+        if (EXISTS "${submodule_path}")
+            set(${submodule_status} TRUE PARENT_SCOPE)
+            return()
+        endif()
+    endif()
+
+    message(WARNING "${submodule_name} is required..! Update the submodules!")
+
+    set(${submodule_status} FALSE PARENT_SCOPE)
+endfunction()
diff --git a/config/lib/GLFW.cmake b/config/lib/GLFW.cmake
index 9668694de5b6887c163f74b626c71873e3f611f8..977eabc8c3916da694420eb8b069e058b94c15f2 100644
--- a/config/lib/GLFW.cmake
+++ b/config/lib/GLFW.cmake
@@ -6,14 +6,14 @@ if (glfw3_FOUND)
 
     message(${vkcv_config_msg} " GLFW    -   " ${glfw3_VERSION})
 else()
-    if (EXISTS "${vkcv_lib_path}/glfw")
+    use_git_submodule("${vkcv_lib_path}/glfw" glfw_status)
+
+    if (${glfw_status})
         add_subdirectory(${vkcv_lib}/glfw)
 
         list(APPEND vkcv_libraries glfw)
         list(APPEND vkcv_includes ${vkcv_lib_path}/glfw/include)
 
         message(${vkcv_config_msg} " GLFW    -   " ${glfw3_VERSION})
-    else()
-        message(WARNING "GLFW is required..! Update the submodules!")
     endif ()
 endif ()
diff --git a/config/lib/SPIRV_Cross.cmake b/config/lib/SPIRV_Cross.cmake
index 00ae45527d0f49c5632d71e19509871d437ae691..ce4b2e437467436daa7e1bc04975be4fa9609fef 100644
--- a/config/lib/SPIRV_Cross.cmake
+++ b/config/lib/SPIRV_Cross.cmake
@@ -5,7 +5,9 @@ if (spirv-cross_FOUND)
 
     message(${vkcv_config_msg} " SPIRV Cross    - " ${SPIRV_CROSS_VERSION})
 else()
-    if (EXISTS "${vkcv_lib_path}/SPIRV-Cross")
+    use_git_submodule("${vkcv_lib_path}/SPIRV-Cross" spirv_cross_status)
+
+    if (${spirv_cross_status})
         set(SPIRV_CROSS_EXCEPTIONS_TO_ASSERTIONS OFF CACHE INTERNAL "")
         set(SPIRV_CROSS_SHARED OFF CACHE INTERNAL "")
         set(SPIRV_CROSS_STATIC ON CACHE INTERNAL "")
@@ -28,7 +30,5 @@ else()
         list(APPEND vkcv_includes ${vkcv_lib_path}/SPIV-Cross/include)
 
         message(${vkcv_config_msg} " SPIRV Cross    - " ${SPIRV_CROSS_VERSION})
-    else()
-        message(WARNING "SPIRV-Cross is required..! Update the submodules!")
     endif ()
 endif ()
\ No newline at end of file
diff --git a/config/lib/VulkanMemoryAllocator.cmake b/config/lib/VulkanMemoryAllocator.cmake
index 5f670ff04633e1747accb8f1598fee028a287168..2a11f936baab99186db3ac503874e490ee69f422 100644
--- a/config/lib/VulkanMemoryAllocator.cmake
+++ b/config/lib/VulkanMemoryAllocator.cmake
@@ -1,5 +1,7 @@
 
-if (EXISTS "${vkcv_lib_path}/VulkanMemoryAllocator-Hpp")
+use_git_submodule("${vkcv_lib_path}/VulkanMemoryAllocator-Hpp" vma_hpp_status)
+
+if (${vma_hpp_status})
 	set(VMA_HPP_PATH "${vkcv_lib_path}/VulkanMemoryAllocator-Hpp" CACHE INTERNAL "")
 	
 	set(VMA_RECORDING_ENABLED OFF CACHE INTERNAL "")
@@ -17,6 +19,4 @@ if (EXISTS "${vkcv_lib_path}/VulkanMemoryAllocator-Hpp")
 	list(APPEND vkcv_includes ${vkcv_lib_path}/VulkanMemoryAllocator-Hpp)
 	
 	message(${vkcv_config_msg} " VMA     - ")
-else()
-	message(WARNING "VulkanMemoryAllocator is required..! Update the submodules!")
 endif ()
diff --git a/modules/asset_loader/config/FX_GLTF.cmake b/modules/asset_loader/config/FX_GLTF.cmake
index 37cd162422d8277022067498f5d5ba3e26e2ae1b..4164c2786d9ada53c979b98bf23f973113edfda5 100644
--- a/modules/asset_loader/config/FX_GLTF.cmake
+++ b/modules/asset_loader/config/FX_GLTF.cmake
@@ -1,5 +1,7 @@
 
-if (EXISTS "${vkcv_asset_loader_lib_path}/fx-gltf")
+use_git_submodule("${vkcv_asset_loader_lib_path}/fx-gltf" fx_gltf_status)
+
+if (${fx_gltf_status})
 	set(FX_GLTF_INSTALL OFF CACHE INTERNAL "")
 	set(FX_GLTF_USE_INSTALLED_DEPS OFF CACHE INTERNAL "")
 	set(BUILD_TESTING OFF CACHE INTERNAL "")
@@ -7,6 +9,4 @@ if (EXISTS "${vkcv_asset_loader_lib_path}/fx-gltf")
 	add_subdirectory(${vkcv_asset_loader_lib}/fx-gltf)
 	
 	list(APPEND vkcv_asset_loader_libraries fx-gltf)
-else()
-	message(WARNING "FX-GLTF is required..! Update the submodules!")
 endif ()
diff --git a/modules/asset_loader/config/NLOHMANN_JSON.cmake b/modules/asset_loader/config/NLOHMANN_JSON.cmake
index 018f6a19809fd3e53e6e790a6fe6447348e43c09..4bd7f4475ef1e748e109814d440762e27948f495 100644
--- a/modules/asset_loader/config/NLOHMANN_JSON.cmake
+++ b/modules/asset_loader/config/NLOHMANN_JSON.cmake
@@ -1,10 +1,10 @@
 
-if (EXISTS "${vkcv_asset_loader_lib_path}/json")
+use_git_submodule("${vkcv_asset_loader_lib_path}/json" json_status)
+
+if (${json_status})
 	set(JSON_BuildTests OFF CACHE INTERNAL "")
 	
 	add_subdirectory(${vkcv_asset_loader_lib}/json)
 	
 	list(APPEND vkcv_asset_loader_libraries nlohmann_json::nlohmann_json)
-else()
-	message(WARNING "NLOHMANN_JSON is required..! Update the submodules!")
 endif ()
diff --git a/modules/asset_loader/config/STB.cmake b/modules/asset_loader/config/STB.cmake
index 1287d0a9ddda559e061ddd680bc815e24b3e2075..61b7cc929b2b5ae96fbbbe479f6e9d48d9db5c69 100644
--- a/modules/asset_loader/config/STB.cmake
+++ b/modules/asset_loader/config/STB.cmake
@@ -1,10 +1,10 @@
 
-if (EXISTS "${vkcv_asset_loader_lib_path}/stb")
+use_git_submodule("${vkcv_asset_loader_lib_path}/stb" stb_status)
+
+if (${stb_status})
 	list(APPEND vkcv_asset_loader_includes ${vkcv_asset_loader_lib}/stb)
 	
 	list(APPEND vkcv_asset_loader_definitions STB_IMAGE_IMPLEMENTATION)
 	list(APPEND vkcv_asset_loader_definitions STBI_ONLY_JPEG)
 	list(APPEND vkcv_asset_loader_definitions STBI_ONLY_PNG)
-else()
-	message(WARNING "STB is required..! Update the submodules!")
 endif ()
diff --git a/modules/camera/config/GLM.cmake b/modules/camera/config/GLM.cmake
index f256ccade8c4f44a89744bb7875371324cf2369d..53960241b8c147f522afd7afa3bfedb20f4f0761 100644
--- a/modules/camera/config/GLM.cmake
+++ b/modules/camera/config/GLM.cmake
@@ -5,13 +5,13 @@ if (glm_FOUND)
     list(APPEND vkcv_camera_includes ${GLM_INCLUDE_DIRS})
     list(APPEND vkcv_camera_libraries glm)
 else()
-    if (EXISTS "${vkcv_camera_lib_path}/glm")
+    use_git_submodule("${vkcv_camera_lib_path}/glm" glm_status)
+
+    if (${glm_status})
         add_subdirectory(${vkcv_camera_lib}/glm)
 
         list(APPEND vkcv_camera_includes ${vkcv_camera_lib_path}/glm)
         list(APPEND vkcv_camera_libraries glm)
-    else()
-        message(WARNING "GLM is required..! Update the submodules!")
     endif ()
 endif ()
 
diff --git a/modules/gui/config/ImGui.cmake b/modules/gui/config/ImGui.cmake
index 90cdafdeee355af9e63723632572799e135b04da..624ea7701e245ab8c20731d2b226896667c18f89 100644
--- a/modules/gui/config/ImGui.cmake
+++ b/modules/gui/config/ImGui.cmake
@@ -1,5 +1,7 @@
 
-if (EXISTS "${vkcv_gui_lib_path}/imgui")
+use_git_submodule("${vkcv_gui_lib_path}/imgui" imgui_status)
+
+if (${imgui_status})
 	list(APPEND vkcv_imgui_sources ${vkcv_gui_lib_path}/imgui/backends/imgui_impl_glfw.cpp)
 	list(APPEND vkcv_imgui_sources ${vkcv_gui_lib_path}/imgui/backends/imgui_impl_glfw.h)
 	list(APPEND vkcv_imgui_sources ${vkcv_gui_lib_path}/imgui/backends/imgui_impl_vulkan.cpp)
@@ -22,6 +24,4 @@ if (EXISTS "${vkcv_gui_lib_path}/imgui")
 	list(APPEND vkcv_gui_include ${vkcv_gui_lib})
 	
 	list(APPEND vkcv_gui_defines IMGUI_DISABLE_WIN32_FUNCTIONS=1)
-else()
-	message(WARNING "IMGUI is required..! Update the submodules!")
 endif ()
diff --git a/modules/shader_compiler/config/GLSLANG.cmake b/modules/shader_compiler/config/GLSLANG.cmake
index 50b9fd46bd0db9421c632aa0b80fb8df7e3f2123..98bd45497f9d7ed5196dbed486921f8e6ada12da 100644
--- a/modules/shader_compiler/config/GLSLANG.cmake
+++ b/modules/shader_compiler/config/GLSLANG.cmake
@@ -1,5 +1,7 @@
 
-if (EXISTS "${vkcv_shader_compiler_lib_path}/glslang")
+use_git_submodule("${vkcv_shader_compiler_lib_path}/glslang" glslang_status)
+
+if (${glslang_status})
 	set(SKIP_GLSLANG_INSTALL ON CACHE INTERNAL "")
 	set(ENABLE_SPVREMAPPER OFF CACHE INTERNAL "")
 	set(ENABLE_GLSLANG_BINARIES OFF CACHE INTERNAL "")
@@ -23,6 +25,4 @@ if (EXISTS "${vkcv_shader_compiler_lib_path}/glslang")
 	
 	list(APPEND vkcv_shader_compiler_libraries glslang SPIRV)
 	list(APPEND vkcv_shader_compiler_includes ${vkcv_shader_compiler_lib})
-else()
-	message(WARNING "GLSLANG is required..! Update the submodules!")
 endif ()
diff --git a/modules/upscaling/config/FidelityFX_FSR.cmake b/modules/upscaling/config/FidelityFX_FSR.cmake
index cc52b4189f781f534a933feb7b782b6bec333e5a..780f1d441abe2a567db7491ce5e2f4821a396b89 100644
--- a/modules/upscaling/config/FidelityFX_FSR.cmake
+++ b/modules/upscaling/config/FidelityFX_FSR.cmake
@@ -1,5 +1,7 @@
 
-if (EXISTS "${vkcv_upscaling_lib_path}/FidelityFX-FSR")
+use_git_submodule("${vkcv_upscaling_lib_path}/FidelityFX-FSR" ffx_fsr_status)
+
+if (${ffx_fsr_status})
 	include_shader(${vkcv_upscaling_lib_path}/FidelityFX-FSR/ffx-fsr/ffx_a.h ${vkcv_upscaling_include} ${vkcv_upscaling_source})
 	include_shader(${vkcv_upscaling_lib_path}/FidelityFX-FSR/ffx-fsr/ffx_fsr1.h ${vkcv_upscaling_include} ${vkcv_upscaling_source})
 	include_shader(${vkcv_upscaling_lib_path}/FidelityFX-FSR/sample/src/VK/FSR_Pass.glsl ${vkcv_upscaling_include} ${vkcv_upscaling_source})
@@ -13,6 +15,4 @@ if (EXISTS "${vkcv_upscaling_lib_path}/FidelityFX-FSR")
 	list(APPEND vkcv_upscaling_sources ${vkcv_upscaling_include}/ffx_a.h.hxx)
 	list(APPEND vkcv_upscaling_sources ${vkcv_upscaling_include}/ffx_fsr1.h.hxx)
 	list(APPEND vkcv_upscaling_sources ${vkcv_upscaling_include}/FSR_Pass.glsl.hxx)
-else()
-	message(WARNING "FidelityFX-FSR is required..! Update the submodules!")
 endif ()