diff --git a/CMake/PackageDepends/MITK_OpenGL_Config.cmake b/CMake/PackageDepends/MITK_OpenGL_Config.cmake
index 0925ef472b..41e4f41c91 100644
--- a/CMake/PackageDepends/MITK_OpenGL_Config.cmake
+++ b/CMake/PackageDepends/MITK_OpenGL_Config.cmake
@@ -1,3 +1,17 @@
-set(OpenGL_GL_PREFERENCE LEGACY)
-find_package(OpenGL REQUIRED)
-list(APPEND ALL_LIBRARIES OpenGL::GL)
+if(WIN32 OR APPLE OR (DEFINED OpenGL_GL_PREFERENCE AND OpenGL_GL_PREFERENCE STREQUAL LEGACY))
+  find_package(OpenGL REQUIRED)
+  list(APPEND ALL_LIBRARIES OpenGL::GL)
+else()
+  find_package(OpenGL REQUIRED OPTIONAL_COMPONENTS EGL GLX)
+  list(APPEND ALL_LIBRARIES OpenGL::OpenGL)
+
+  if(TARGET OpenGL::EGL)
+    list(APPEND ALL_LIBRARIES OpenGL::EGL)
+  elseif(TARGET OpenGL::GLX)
+    list(APPEND ALL_LIBRARIES OpenGL::GLX)
+  else()
+    set(OpenGL_GL_PREFERENCE LEGACY)
+    find_package(OpenGL REQUIRED)
+    list(APPEND ALL_LIBRARIES OpenGL::GL)
+  endif()
+endif()
diff --git a/CMakeExternals/VTK.cmake b/CMakeExternals/VTK.cmake
index 2fc0c6a6e5..0fd5609fba 100644
--- a/CMakeExternals/VTK.cmake
+++ b/CMakeExternals/VTK.cmake
@@ -1,87 +1,99 @@
 #-----------------------------------------------------------------------------
 # VTK
 #-----------------------------------------------------------------------------
 
 # Sanity checks
 if(DEFINED VTK_DIR AND NOT EXISTS ${VTK_DIR})
   message(FATAL_ERROR "VTK_DIR variable is defined but corresponds to non-existing directory")
 endif()
 
 set(proj VTK)
 set(proj_DEPENDENCIES )
 set(VTK_DEPENDS ${proj})
 
 if(NOT DEFINED VTK_DIR)
 
   set(additional_cmake_args )
 
   if(WIN32)
     list(APPEND additional_cmake_args
       -DCMAKE_CXX_MP_FLAG:BOOL=ON
       )
   else()
     list(APPEND additional_cmake_args
       -DVTK_MODULE_USE_EXTERNAL_VTK_freetype:BOOL=ON
       )
+
+    if(NOT APPLE)
+      if(NOT DEFINED OpenGL_GL_PREFERENCE OR OpenGL_GL_PREFERENCE STREQUAL GLVND)
+        find_package(OpenGL REQUIRED OPTIONAL_COMPONENTS EGL)
+        if(TARGET OpenGL::EGL)
+          list(APPEND additional_cmake_args "-DVTK_OPENGL_HAS_EGL:BOOL=ON")
+        endif()
+      endif()
+      if(DEFINED OpenGL_GL_PREFERENCE)
+        list(APPEND additional_cmake_args "-DOpenGL_GL_PREFERENCE:STRING=${OpenGL_GL_PREFERENCE}")
+      endif()
+    endif()
+
   endif()
 
   # Optionally enable memory leak checks for any objects derived from vtkObject. This
   # will force unit tests to fail if they have any of these memory leaks.
   option(MITK_VTK_DEBUG_LEAKS OFF)
   mark_as_advanced(MITK_VTK_DEBUG_LEAKS)
   list(APPEND additional_cmake_args
     -DVTK_DEBUG_LEAKS:BOOL=${MITK_VTK_DEBUG_LEAKS}
     )
 
   if(MITK_USE_Qt6)
     list(APPEND additional_cmake_args
       -DVTK_GROUP_ENABLE_Qt:STRING=YES
       )
   endif()
 
   if(CTEST_USE_LAUNCHERS)
     list(APPEND additional_cmake_args
       "-DCMAKE_PROJECT_${proj}_INCLUDE:FILEPATH=${CMAKE_ROOT}/Modules/CTestUseLaunchers.cmake"
       )
   endif()
 
   mitk_query_custom_ep_vars()
 
   ExternalProject_Add(${proj}
     LIST_SEPARATOR ${sep}
     GIT_REPOSITORY https://github.com/Kitware/VTK.git
     GIT_TAG v9.2.6
     GIT_SUBMODULES ""
     CMAKE_GENERATOR ${gen}
     CMAKE_GENERATOR_PLATFORM ${gen_platform}
     CMAKE_ARGS
       ${ep_common_args}
-      -DOpenGL_GL_PREFERENCE:STRING=LEGACY
       -DVTK_ENABLE_WRAPPING:BOOL=OFF
       -DVTK_LEGACY_REMOVE:BOOL=ON
       -DVTK_MODULE_ENABLE_VTK_TestingRendering:STRING=YES
       -DVTK_MODULE_ENABLE_VTK_RenderingContextOpenGL2:STRING=YES
       -DVTK_MODULE_ENABLE_VTK_RenderingVolumeOpenGL2:STRING=YES
       -DVTK_MODULE_ENABLE_VTK_GUISupportQtQuick:STRING=NO
       -DVTK_MODULE_ENABLE_VTK_IOIOSS:STRING=NO # See T29633
       -DVTK_MODULE_ENABLE_VTK_ioss:STRING=NO   # See T29633
       -DVTK_QT_VERSION:STRING=6
       ${additional_cmake_args}
       ${${proj}_CUSTOM_CMAKE_ARGS}
     CMAKE_CACHE_ARGS
       ${ep_common_cache_args}
       ${${proj}_CUSTOM_CMAKE_CACHE_ARGS}
     CMAKE_CACHE_DEFAULT_ARGS
       ${ep_common_cache_default_args}
       ${${proj}_CUSTOM_CMAKE_CACHE_DEFAULT_ARGS}
     DEPENDS ${proj_DEPENDENCIES}
     )
 
   set(VTK_DIR ${ep_prefix})
   mitkFunctionInstallExternalCMakeProject(${proj})
 
 else()
 
   mitkMacroEmptyExternalProject(${proj} "${proj_DEPENDENCIES}")
 
 endif()