diff --git a/intern/cycles/CMakeLists.txt b/intern/cycles/CMakeLists.txt
index 003f75267ce757d1ec16bf1c43ae17d6754a9449..f5d717e70fc0ad2e6f911286fdea1c8844156a2f 100644
--- a/intern/cycles/CMakeLists.txt
+++ b/intern/cycles/CMakeLists.txt
@@ -18,8 +18,10 @@ endif()
 
 # External Libraries
 
-include(cmake/external_libs.cmake)
-include(cmake/macros.cmake)
+if(NOT CYCLES_STANDALONE_REPOSITORY)
+  include(cmake/external_libs.cmake)
+  include(cmake/macros.cmake)
+endif()
 
 # Build Flags
 # todo: this code could be refactored a bit to avoid duplication
@@ -221,7 +223,6 @@ include_directories(
   ${OPENIMAGEIO_INCLUDE_DIRS}
   ${OPENEXR_INCLUDE_DIRS}
   ${PUGIXML_INCLUDE_DIR}
-  ${TBB_INCLUDE_DIRS}
 )
 
 if(WITH_CYCLES_DEBUG)
@@ -270,6 +271,49 @@ if(WITH_CYCLES_EMBREE)
   )
 endif()
 
+if(WITH_OPENIMAGEDENOISE)
+  add_definitions(-DWITH_OPENIMAGEDENOISE)
+  include_directories(
+    SYSTEM
+    ${OPENIMAGEDENOISE_INCLUDE_DIRS}
+  )
+endif()
+
+# Logging capabilities using GLog library.
+if(WITH_CYCLES_LOGGING)
+  add_definitions(-DWITH_CYCLES_LOGGING)
+  add_definitions(${GLOG_DEFINES})
+  add_definitions(-DCYCLES_GFLAGS_NAMESPACE=${GFLAGS_NAMESPACE})
+  include_directories(
+    SYSTEM
+    ${GLOG_INCLUDE_DIRS}
+    ${GFLAGS_INCLUDE_DIRS}
+  )
+endif()
+
+if(WITH_ALEMBIC)
+  add_definitions(-DWITH_ALEMBIC)
+  include_directories(
+    SYSTEM
+    ${ALEMBIC_INCLUDE_DIRS}
+  )
+endif()
+
+# Includes that might be overrides by USD last, to avoid compiling
+# against the wrong versions of other libraries.
+include_directories(
+  SYSTEM
+  ${TBB_INCLUDE_DIRS}
+)
+
+if(WITH_OPENVDB)
+  add_definitions(-DWITH_OPENVDB ${OPENVDB_DEFINITIONS})
+  include_directories(
+    SYSTEM
+    ${OPENVDB_INCLUDE_DIRS}
+  )
+endif()
+
 if(WITH_NANOVDB)
   add_definitions(-DWITH_NANOVDB)
   include_directories(
@@ -286,23 +330,11 @@ if(WITH_OPENSUBDIV)
   )
 endif()
 
-if(WITH_OPENIMAGEDENOISE)
-  add_definitions(-DWITH_OPENIMAGEDENOISE)
-  include_directories(
-    SYSTEM
-    ${OPENIMAGEDENOISE_INCLUDE_DIRS}
-  )
-endif()
-
-# Logging capabilities using GLog library.
-if(WITH_CYCLES_LOGGING)
-  add_definitions(-DWITH_CYCLES_LOGGING)
-  add_definitions(${GLOG_DEFINES})
-  add_definitions(-DCYCLES_GFLAGS_NAMESPACE=${GFLAGS_NAMESPACE})
+if(WITH_OPENCOLORIO)
+  add_definitions(-DWITH_OCIO)
   include_directories(
     SYSTEM
-    ${GLOG_INCLUDE_DIRS}
-    ${GFLAGS_INCLUDE_DIRS}
+    ${OPENCOLORIO_INCLUDE_DIRS}
   )
 endif()
 
@@ -395,7 +427,7 @@ if(WITH_GTESTS)
   add_subdirectory(test)
 endif()
 
-if(WITH_CYCLES_HYDRA_RENDER_DELEGATE)
+if(WITH_CYCLES_HYDRA_RENDER_DELEGATE OR (WITH_CYCLES_STANDALONE AND WITH_USD))
   add_subdirectory(hydra)
 endif()
 
diff --git a/intern/cycles/app/CMakeLists.txt b/intern/cycles/app/CMakeLists.txt
index 872a95ed5a6ce9654ad113e6263c185922355d94..6aea962eab58fb8c93940faab18601b76a3e2cd1 100644
--- a/intern/cycles/app/CMakeLists.txt
+++ b/intern/cycles/app/CMakeLists.txt
@@ -83,13 +83,6 @@ if(WITH_CYCLES_STANDALONE)
   target_link_libraries(cycles PRIVATE ${LIB})
 
   if(APPLE)
-    if(WITH_OPENCOLORIO)
-      set_property(TARGET cycles APPEND_STRING PROPERTY LINK_FLAGS " -framework IOKit -framework Carbon")
-    endif()
-    if(WITH_OPENIMAGEDENOISE AND "${CMAKE_OSX_ARCHITECTURES}" STREQUAL "arm64")
-      # OpenImageDenoise uses BNNS from the Accelerate framework.
-      set_property(TARGET cycles APPEND_STRING PROPERTY LINK_FLAGS " -framework Accelerate")
-    endif()
     if(WITH_CYCLES_STANDALONE_GUI)
       set_property(TARGET cycles APPEND_STRING PROPERTY LINK_FLAGS
         " -framework Cocoa -framework CoreAudio -framework AudioUnit -framework AudioToolbox -framework ForceFeedback -framework CoreVideo")
@@ -103,6 +96,10 @@ if(WITH_CYCLES_STANDALONE)
   if(CYCLES_STANDALONE_REPOSITORY)
     cycles_install_libraries(cycles)
   endif()
+
+  install(PROGRAMS
+    $<TARGET_FILE:cycles>
+    DESTINATION ${CMAKE_INSTALL_PREFIX})
 endif()
 
 #####################################################################
diff --git a/intern/cycles/cmake/external_libs.cmake b/intern/cycles/cmake/external_libs.cmake
index 05c0980bdfbd41834710c6d7db8355ec72ba6046..f4186374d10ae33d7dcd9d23d822eb43fde3b78b 100644
--- a/intern/cycles/cmake/external_libs.cmake
+++ b/intern/cycles/cmake/external_libs.cmake
@@ -24,6 +24,9 @@ if(CYCLES_STANDALONE_REPOSITORY)
     else()
       set(_cycles_lib_dir "${CMAKE_SOURCE_DIR}/../lib/darwin_arm64")
     endif()
+
+    # Always use system zlib
+    find_package(ZLIB REQUIRED)
   elseif(WIN32)
     if(CMAKE_CL_64)
       set(_cycles_lib_dir "${CMAKE_SOURCE_DIR}/../lib/win64_vc15")
@@ -66,10 +69,12 @@ if(CYCLES_STANDALONE_REPOSITORY)
     _set_default(BOOST_ROOT "${_cycles_lib_dir}/boost")
     _set_default(BLOSC_ROOT_DIR "${_cycles_lib_dir}/blosc")
     _set_default(EMBREE_ROOT_DIR "${_cycles_lib_dir}/embree")
+    _set_default(IMATH_ROOT_DIR "${_cycles_lib_dir}/imath")
     _set_default(GLEW_ROOT_DIR "${_cycles_lib_dir}/glew")
     _set_default(JPEG_ROOT "${_cycles_lib_dir}/jpeg")
     _set_default(LLVM_ROOT_DIR "${_cycles_lib_dir}/llvm")
     _set_default(CLANG_ROOT_DIR "${_cycles_lib_dir}/llvm")
+    _set_default(NANOVDB_ROOT_DIR "${_cycles_lib_dir}/openvdb")
     _set_default(OPENCOLORIO_ROOT_DIR "${_cycles_lib_dir}/opencolorio")
     _set_default(OPENEXR_ROOT_DIR "${_cycles_lib_dir}/openexr")
     _set_default(OPENIMAGEDENOISE_ROOT_DIR "${_cycles_lib_dir}/openimagedenoise")
@@ -80,8 +85,11 @@ if(CYCLES_STANDALONE_REPOSITORY)
     _set_default(OSL_ROOT_DIR "${_cycles_lib_dir}/osl")
     _set_default(PNG_ROOT "${_cycles_lib_dir}/png")
     _set_default(PUGIXML_ROOT_DIR "${_cycles_lib_dir}/pugixml")
+    _set_default(SDL2_ROOT_DIR "${_cycles_lib_dir}/sdl")
     _set_default(TBB_ROOT_DIR "${_cycles_lib_dir}/tbb")
     _set_default(TIFF_ROOT "${_cycles_lib_dir}/tiff")
+    _set_default(USD_ROOT_DIR "${_cycles_lib_dir}/usd")
+    _set_default(WEBP_ROOT_DIR "${_cycles_lib_dir}/webp")
     _set_default(ZLIB_ROOT "${_cycles_lib_dir}/zlib")
 
     # Ignore system libraries
@@ -91,23 +99,6 @@ if(CYCLES_STANDALONE_REPOSITORY)
   endif()
 endif()
 
-###########################################################################
-# USD
-###########################################################################
-
-if(CYCLES_STANDALONE_REPOSITORY AND WITH_CYCLES_HYDRA_RENDER_DELEGATE)
-  set(WITH_USD ON)
-endif()
-if(WITH_CYCLES_HYDRA_RENDER_DELEGATE)
-  find_package(pxr CONFIG REQUIRED PATHS ${PXR_ROOT} ${USD_ROOT} NO_DEFAULT_PATH)
-  if(pxr_FOUND)
-    set(PXR_LIBRARY_DIR ${PXR_CMAKE_DIR}/lib)
-    set(USD_INCLUDE_DIRS ${PXR_INCLUDE_DIRS})
-  else()
-    set(WITH_USD OFF)
-  endif()
-endif()
-
 ###########################################################################
 # Zlib
 ###########################################################################
@@ -189,6 +180,7 @@ if(CYCLES_STANDALONE_REPOSITORY)
 
   find_package(JPEG REQUIRED)
   find_package(TIFF REQUIRED)
+  find_package(WebP)
 
   if(EXISTS ${_cycles_lib_dir})
     set(PNG_NAMES png16 libpng16 png libpng)
@@ -277,20 +269,22 @@ endif()
 if(CYCLES_STANDALONE_REPOSITORY AND WITH_CYCLES_OPENCOLORIO)
   set(WITH_OPENCOLORIO ON)
 
-  if(MSVC AND EXISTS ${_cycles_lib_dir})
-    set(OPENCOLORIO_INCLUDE_DIRS ${OPENCOLORIO_ROOT_DIR}/include)
-    set(OPENCOLORIO_LIBRARIES
-      optimized ${OPENCOLORIO_ROOT_DIR}/lib/OpenColorIO.lib
-      optimized ${OPENCOLORIO_ROOT_DIR}/lib/libyaml-cpp.lib
-      optimized ${OPENCOLORIO_ROOT_DIR}/lib/libexpatMD.lib
-      optimized ${OPENCOLORIO_ROOT_DIR}/lib/pystring.lib
-      debug ${OPENCOLORIO_ROOT_DIR}/lib/OpencolorIO_d.lib
-      debug ${OPENCOLORIO_ROOT_DIR}/lib/libyaml-cpp_d.lib
-      debug ${OPENCOLORIO_ROOT_DIR}/lib/libexpatdMD.lib
-      debug ${OPENCOLORIO_ROOT_DIR}/lib/pystring_d.lib
-    )
-  else()
-    find_package(OpenColorIO REQUIRED)
+  if(NOT USD_OVERRIDE_OPENCOLORIO)
+    if(MSVC AND EXISTS ${_cycles_lib_dir})
+      set(OPENCOLORIO_INCLUDE_DIRS ${OPENCOLORIO_ROOT_DIR}/include)
+      set(OPENCOLORIO_LIBRARIES
+        optimized ${OPENCOLORIO_ROOT_DIR}/lib/OpenColorIO.lib
+        optimized ${OPENCOLORIO_ROOT_DIR}/lib/libyaml-cpp.lib
+        optimized ${OPENCOLORIO_ROOT_DIR}/lib/libexpatMD.lib
+        optimized ${OPENCOLORIO_ROOT_DIR}/lib/pystring.lib
+        debug ${OPENCOLORIO_ROOT_DIR}/lib/OpencolorIO_d.lib
+        debug ${OPENCOLORIO_ROOT_DIR}/lib/libyaml-cpp_d.lib
+        debug ${OPENCOLORIO_ROOT_DIR}/lib/libexpatdMD.lib
+        debug ${OPENCOLORIO_ROOT_DIR}/lib/pystring_d.lib
+      )
+    else()
+      find_package(OpenColorIO REQUIRED)
+    endif()
   endif()
 endif()
 
@@ -366,7 +360,7 @@ if(CYCLES_STANDALONE_REPOSITORY)
     set(BOOST_LIBPATH ${Boost_LIBRARY_DIRS})
   endif()
 
-  set(BOOST_DEFINITIONS "-DBOOST_ALL_NO_LIB")
+  set(BOOST_DEFINITIONS "-DBOOST_ALL_NO_LIB ${BOOST_DEFINITIONS}")
 endif()
 
 ###########################################################################
@@ -414,26 +408,10 @@ endif()
 # OpenSubdiv
 ###########################################################################
 
-if(WITH_CYCLES_HYDRA_RENDER_DELEGATE AND PXR_LIBRARY_DIR AND (WITH_OPENSUBDIV OR WITH_CYCLES_OPENSUBDIV))
-  find_library(OPENSUBDIV_LIBRARY_CPU_DEBUG_PXR NAMES osdCPU_d osdCPU PATHS ${PXR_LIBRARY_DIR} NO_CACHE NO_DEFAULT_PATH)
-  find_library(OPENSUBDIV_LIBRARY_GPU_DEBUG_PXR NAMES osdGPU_d osdGPU PATHS ${PXR_LIBRARY_DIR} NO_CACHE NO_DEFAULT_PATH)
-  find_library(OPENSUBDIV_LIBRARY_CPU_RELEASE_PXR NAMES osdCPU PATHS ${PXR_LIBRARY_DIR} NO_CACHE NO_DEFAULT_PATH)
-  find_library(OPENSUBDIV_LIBRARY_GPU_RELEASE_PXR NAMES osdGPU PATHS ${PXR_LIBRARY_DIR} NO_CACHE NO_DEFAULT_PATH)
-  if(OPENSUBDIV_LIBRARY_CPU_RELEASE_PXR AND OPENSUBDIV_LIBRARY_GPU_RELEASE_PXR)
-    set(OPENSUBDIV_INCLUDE_DIRS ${PXR_INCLUDE_DIRS})
-    set(OPENSUBDIV_LIBRARIES
-      optimized ${OPENSUBDIV_LIBRARY_CPU_RELEASE_PXR}
-      optimized ${OPENSUBDIV_LIBRARY_GPU_RELEASE_PXR}
-      debug ${OPENSUBDIV_LIBRARY_CPU_DEBUG_PXR}
-      debug ${OPENSUBDIV_LIBRARY_GPU_DEBUG_PXR}
-    )
-  endif()
-endif()
-
 if(CYCLES_STANDALONE_REPOSITORY AND WITH_CYCLES_OPENSUBDIV)
   set(WITH_OPENSUBDIV ON)
 
-  if(NOT OPENSUBDIV_LIBRARY_CPU_RELEASE_PXR OR NOT OPENSUBDIV_LIBRARY_GPU_RELEASE_PXR)
+  if(NOT USD_OVERRIDE_OPENSUBDIV)
     if(MSVC AND EXISTS ${_cycles_lib_dir})
       set(OPENSUBDIV_INCLUDE_DIRS ${OPENSUBDIV_ROOT_DIR}/include)
       set(OPENSUBDIV_LIBRARIES
@@ -452,19 +430,11 @@ endif()
 # OpenVDB
 ###########################################################################
 
-if(WITH_CYCLES_HYDRA_RENDER_DELEGATE AND PXR_LIBRARY_DIR AND (WITH_OPENVDB OR WITH_CYCLES_OPENVDB))
-  find_library(OPENVDB_LIBRARY_PXR NAMES openvdb PATHS ${PXR_LIBRARY_DIR} NO_CACHE NO_DEFAULT_PATH)
-  if(OPENVDB_LIBRARY_PXR)
-    set(OPENVDB_INCLUDE_DIRS ${PXR_INCLUDE_DIRS})
-    set(OPENVDB_LIBRARIES ${OPENVDB_LIBRARY_PXR})
-  endif()
-endif()
-
 if(CYCLES_STANDALONE_REPOSITORY AND WITH_CYCLES_OPENVDB)
   set(WITH_OPENVDB ON)
   set(OPENVDB_DEFINITIONS -DNOMINMAX -D_USE_MATH_DEFINES)
 
-  if(NOT OPENVDB_LIBRARY_PXR)
+  if(NOT USD_OVERRIDE_OPENVDB)
     find_package(OpenVDB REQUIRED)
 
     if(MSVC AND EXISTS ${_cycles_lib_dir})
@@ -478,6 +448,20 @@ if(CYCLES_STANDALONE_REPOSITORY AND WITH_CYCLES_OPENVDB)
   endif()
 endif()
 
+###########################################################################
+# NanoVDB
+###########################################################################
+
+if(CYCLES_STANDALONE_REPOSITORY AND WITH_CYCLES_NANOVDB)
+  set(WITH_NANOVDB ON)
+
+  if(MSVC AND EXISTS ${_cycles_lib_dir})
+    set(NANOVDB_INCLUDE_DIR ${NANOVDB_ROOT_DIR}/include)
+  else()
+    find_package(NanoVDB REQUIRED)
+  endif()
+endif()
+
 ###########################################################################
 # OpenImageDenoise
 ###########################################################################
@@ -504,20 +488,8 @@ endif()
 # TBB
 ###########################################################################
 
-if(WITH_CYCLES_HYDRA_RENDER_DELEGATE AND PXR_LIBRARY_DIR)
-  find_library(TBB_LIBRARY_DEBUG_PXR NAMES tbb_debug tbb PATHS ${PXR_LIBRARY_DIR} NO_CACHE NO_DEFAULT_PATH)
-  find_library(TBB_LIBRARY_RELEASE_PXR NAMES tbb PATHS ${PXR_LIBRARY_DIR} NO_CACHE NO_DEFAULT_PATH)
-  if(TBB_LIBRARY_RELEASE_PXR)
-    set(TBB_INCLUDE_DIRS ${PXR_INCLUDE_DIRS})
-    set(TBB_LIBRARIES
-      optimized ${TBB_LIBRARY_RELEASE_PXR}
-      debug ${TBB_LIBRARY_DEBUG_PXR}
-    )
-  endif()
-endif()
-
 if(CYCLES_STANDALONE_REPOSITORY)
-  if(NOT TBB_LIBRARY_RELEASE_PXR)
+  if(NOT USD_OVERRIDE_TBB)
     if(MSVC AND EXISTS ${_cycles_lib_dir})
       set(TBB_INCLUDE_DIRS ${TBB_ROOT_DIR}/include)
       set(TBB_LIBRARIES
@@ -586,7 +558,8 @@ endif()
 # OpenGL
 ###########################################################################
 
-if(WITH_CYCLES_STANDALONE AND WITH_CYCLES_STANDALONE_GUI)
+if((WITH_CYCLES_STANDALONE AND WITH_CYCLES_STANDALONE_GUI) OR
+   WITH_CYCLES_HYDRA_RENDER_DELEGATE)
   if(CYCLES_STANDALONE_REPOSITORY)
     if(NOT DEFINED OpenGL_GL_PREFERENCE)
       set(OpenGL_GL_PREFERENCE "LEGACY")
@@ -624,7 +597,7 @@ endif()
 # CUDA
 ###########################################################################
 
-if(WITH_CYCLES_CUDA_BINARIES OR NOT WITH_CUDA_DYNLOAD)
+if(WITH_CYCLES_DEVICE_CUDA AND (WITH_CYCLES_CUDA_BINARIES OR NOT WITH_CUDA_DYNLOAD))
   find_package(CUDA) # Try to auto locate CUDA toolkit
   if(CUDA_FOUND)
     message(STATUS "Found CUDA ${CUDA_NVCC_EXECUTABLE} (${CUDA_VERSION})")
@@ -674,16 +647,3 @@ if(WITH_CYCLES_DEVICE_METAL)
     message(STATUS "Found Metal: ${METAL_LIBRARY}")
   endif()
 endif()
-
-###########################################################################
-# macOS
-###########################################################################
-
-if(CYCLES_STANDALONE_REPOSITORY)
-  # On macOS, always use zlib from system.
-  if(APPLE)
-    set(ZLIB_ROOT /usr)
-    find_package(ZLIB REQUIRED)
-    find_package(PNG REQUIRED)
-  endif()
-endif()
diff --git a/intern/cycles/cmake/macros.cmake b/intern/cycles/cmake/macros.cmake
index cd1db8e95a9a6380d67622cd534481f1fb498212..abadfc2c1ace6b333ad72c7011a04ac8c7d76e2e 100644
--- a/intern/cycles/cmake/macros.cmake
+++ b/intern/cycles/cmake/macros.cmake
@@ -74,6 +74,19 @@ macro(cycles_add_library target library_deps)
 endmacro()
 
 macro(cycles_external_libraries_append libraries)
+  if(APPLE)
+    list(APPEND ${libraries} "-framework Foundation")
+    if(WITH_USD)
+      list(APPEND ${libraries} "-framework CoreVideo -framework Cocoa")
+    endif()
+    if(WITH_CYCLES_STANDALONE_GUI OR WITH_USD)
+      list(APPEND ${libraries} "-framework OpenGL")
+    endif()
+  elseif(UNIX)
+    if(WITH_USD)
+      list(APPEND ${libraries} "X11")
+    endif()
+  endif()
   if(WITH_CYCLES_LOGGING)
     list(APPEND ${libraries} ${GLOG_LIBRARIES} ${GFLAGS_LIBRARIES})
   endif()
@@ -90,6 +103,7 @@ macro(cycles_external_libraries_append libraries)
     list(APPEND ${libraries} ${OPENCOLORIO_LIBRARIES})
     if(APPLE)
       list(APPEND ${libraries} "-framework IOKit")
+      list(APPEND ${libraries} "-framework Carbon")
     endif()
   endif()
   if(WITH_OPENVDB)
diff --git a/intern/cycles/hydra/CMakeLists.txt b/intern/cycles/hydra/CMakeLists.txt
index 7b7ea43cfe5c39b216f7aecda0278bb29bbca630..17a7f897ac69c8fb6ac1075ba34cae98d5719394 100644
--- a/intern/cycles/hydra/CMakeLists.txt
+++ b/intern/cycles/hydra/CMakeLists.txt
@@ -81,18 +81,18 @@ endif()
 include_directories(${INC})
 include_directories(SYSTEM ${INC_SYS})
 
-add_library(hdCyclesStatic STATIC
+add_library(cycles_hydra STATIC
   ${SRC_HD_CYCLES}
   ${INC_HD_CYCLES}
 )
 
-target_compile_options(hdCyclesStatic
+target_compile_options(cycles_hydra
   PRIVATE
   $<$<CXX_COMPILER_ID:MSVC>:/wd4003 /wd4244 /wd4506>
   $<$<CXX_COMPILER_ID:GNU>:-Wno-float-conversion -Wno-double-promotion -Wno-deprecated>
 )
 
-target_compile_definitions(hdCyclesStatic
+target_compile_definitions(cycles_hydra
   PRIVATE
   GLOG_NO_ABBREVIATED_SEVERITIES=1
   OSL_DEBUG=$<CONFIG:DEBUG>
@@ -100,57 +100,93 @@ target_compile_definitions(hdCyclesStatic
   $<$<CXX_COMPILER_ID:MSVC>:NOMINMAX=1>
 )
 
-target_link_libraries(hdCyclesStatic
+target_link_libraries(cycles_hydra
   PUBLIC
-  hd
-  hgi
-  hgiGL
+  ${USD_LIBRARIES}
   PRIVATE
   ${LIB}
 )
 
-set(HdCyclesPluginName hdCycles)
-add_library(${HdCyclesPluginName} SHARED
-  plugin.h
-  plugin.cpp
-)
-
-set_target_properties(${HdCyclesPluginName}
-  PROPERTIES PREFIX ""
-)
-
-target_compile_definitions(${HdCyclesPluginName}
-  PRIVATE
-  MFB_PACKAGE_NAME=${HdCyclesPluginName}
-  MFB_ALT_PACKAGE_NAME=${HdCyclesPluginName}
-  GLOG_NO_ABBREVIATED_SEVERITIES=1
-  OSL_DEBUG=$<CONFIG:DEBUG>
-  TBB_USE_DEBUG=$<CONFIG:DEBUG>
-  $<$<CXX_COMPILER_ID:MSVC>:NOMINMAX=1>
-)
-
-target_link_libraries(${HdCyclesPluginName}
-  hdCyclesStatic
-)
+if(WITH_CYCLES_HYDRA_RENDER_DELEGATE)
+  set(HdCyclesPluginName hdCycles)
+  add_library(${HdCyclesPluginName} SHARED
+    plugin.h
+    plugin.cpp
+  )
 
-if(WITH_CYCLES_BLENDER)
-  set(CYCLES_HYDRA_INSTALL_PATH "../")
-else()
-  set(CYCLES_HYDRA_INSTALL_PATH ${CMAKE_INSTALL_PREFIX})
-  # Put the root plugInfo.json one level up
-  delayed_install("${CMAKE_CURRENT_SOURCE_DIR}" "plugInfo.json" ${CMAKE_INSTALL_PREFIX})
-endif()
+  set_target_properties(${HdCyclesPluginName}
+    PROPERTIES PREFIX ""
+  )
 
-delayed_install("" $<TARGET_FILE:${HdCyclesPluginName}> ${CYCLES_HYDRA_INSTALL_PATH})
+  target_compile_definitions(${HdCyclesPluginName}
+    PRIVATE
+    MFB_PACKAGE_NAME=${HdCyclesPluginName}
+    MFB_ALT_PACKAGE_NAME=${HdCyclesPluginName}
+    GLOG_NO_ABBREVIATED_SEVERITIES=1
+    OSL_DEBUG=$<CONFIG:DEBUG>
+    TBB_USE_DEBUG=$<CONFIG:DEBUG>
+    $<$<CXX_COMPILER_ID:MSVC>:NOMINMAX=1>
+  )
 
-set(PLUG_INFO_ROOT "..")
+  target_link_libraries(${HdCyclesPluginName}
+    cycles_hydra
+  )
 
-file(RELATIVE_PATH PLUG_INFO_LIBRARY_PATH "${CYCLES_HYDRA_INSTALL_PATH}/${HdCyclesPluginName}" "${CYCLES_HYDRA_INSTALL_PATH}/${HdCyclesPluginName}${CMAKE_SHARED_LIBRARY_SUFFIX}")
-file(RELATIVE_PATH PLUG_INFO_RESOURCE_PATH "${CYCLES_HYDRA_INSTALL_PATH}/${HdCyclesPluginName}" "${CYCLES_INSTALL_PATH}")
+  if(APPLE)
+    set_property(
+      TARGET
+      ${HdCyclesPluginName}
+      APPEND_STRING PROPERTY LINK_FLAGS
+      " -Wl,-exported_symbols_list,'${CMAKE_CURRENT_SOURCE_DIR}/resources/apple_symbols.map'"
+    )
+  elseif(UNIX)
+    set_property(
+      TARGET
+      ${HdCyclesPluginName}
+      APPEND_STRING PROPERTY LINK_FLAGS
+      " -Wl,--version-script='${CMAKE_CURRENT_SOURCE_DIR}/resources/linux_symbols.map'"
+    )
+  endif()
+
+
+  if(WITH_CYCLES_BLENDER)
+    # Install inside add-on
+    set(CYCLES_HYDRA_INSTALL_PATH ${CYCLES_INSTALL_PATH}/hydra)
+  else()
+    # Install next to cycles executable
+    set(CYCLES_HYDRA_INSTALL_PATH ${CMAKE_INSTALL_PREFIX}/hydra)
+  endif()
 
-configure_file(resources/plugInfo.json
-  ${CMAKE_CURRENT_BINARY_DIR}/resources/plugInfo.json
-  @ONLY
-)
+  # Put the root plugInfo.json one level up
+  delayed_install("${CMAKE_CURRENT_SOURCE_DIR}" "plugInfo.json" ${CYCLES_HYDRA_INSTALL_PATH})
+  delayed_install("" $<TARGET_FILE:${HdCyclesPluginName}> ${CYCLES_HYDRA_INSTALL_PATH})
+
+  set_target_properties(${HdCyclesPluginName}
+    PROPERTIES
+    RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+    LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
+
+  set(PLUG_INFO_ROOT "..")
+
+  if(WITH_CYCLES_BLENDER)
+    # Full path not yet know at this point and RELATIVE_PATH requires
+    # absolute path as input. So just set manually.
+    set(PLUG_INFO_LIBRARY_PATH "../${HdCyclesPluginName}${CMAKE_SHARED_LIBRARY_SUFFIX}")
+    set(PLUG_INFO_RESOURCE_PATH "../..")
+  else()
+    file(RELATIVE_PATH
+      PLUG_INFO_LIBRARY_PATH
+      "${CYCLES_HYDRA_INSTALL_PATH}/${HdCyclesPluginName}"
+      "${CYCLES_HYDRA_INSTALL_PATH}/${HdCyclesPluginName}${CMAKE_SHARED_LIBRARY_SUFFIX}")
+    file(RELATIVE_PATH PLUG_INFO_RESOURCE_PATH
+      "${CYCLES_HYDRA_INSTALL_PATH}/${HdCyclesPluginName}"
+      "${CYCLES_INSTALL_PATH}")
+  endif()
+
+  configure_file(resources/plugInfo.json
+    ${CMAKE_CURRENT_BINARY_DIR}/resources/plugInfo.json
+    @ONLY
+  )
 
-delayed_install("${CMAKE_CURRENT_BINARY_DIR}/resources" "plugInfo.json" "${CYCLES_HYDRA_INSTALL_PATH}/${HdCyclesPluginName}/resources")
+  delayed_install("${CMAKE_CURRENT_BINARY_DIR}/resources" "plugInfo.json" "${CYCLES_HYDRA_INSTALL_PATH}/${HdCyclesPluginName}/resources")
+endif()
diff --git a/intern/cycles/hydra/resources/apple_symbols.map b/intern/cycles/hydra/resources/apple_symbols.map
new file mode 100644
index 0000000000000000000000000000000000000000..85be5ae55fe3db1ae752e96722c33b4223ec9711
--- /dev/null
+++ b/intern/cycles/hydra/resources/apple_symbols.map
@@ -0,0 +1 @@
+*PXR*
diff --git a/intern/cycles/hydra/resources/linux_symbols.map b/intern/cycles/hydra/resources/linux_symbols.map
new file mode 100644
index 0000000000000000000000000000000000000000..397422c98549355b332fa89b6a74655d498be804
--- /dev/null
+++ b/intern/cycles/hydra/resources/linux_symbols.map
@@ -0,0 +1,8 @@
+/* Hide everything except USD / Hydra symbols, to avoid conflicts with other
+ * application using different library versions. */
+{
+global:
+  PXR*;
+local:
+  *;
+};
diff --git a/intern/cycles/scene/CMakeLists.txt b/intern/cycles/scene/CMakeLists.txt
index ddb7ff6f9061fe29e8fbe4d27cac767a33a956e4..4904bf247baeb9f869eeed5c2b5b470422d2fb5c 100644
--- a/intern/cycles/scene/CMakeLists.txt
+++ b/intern/cycles/scene/CMakeLists.txt
@@ -108,14 +108,13 @@ endif()
 
 if(WITH_OPENCOLORIO)
   add_definitions(-DWITH_OCIO)
-  include_directories(
-    SYSTEM
+  list(APPEND INC_SYS
     ${OPENCOLORIO_INCLUDE_DIRS}
   )
   list(APPEND LIB
     ${OPENCOLORIO_LIBRARIES}
   )
-  if(WIN32)
+  if(WIN32 AND NOT USD_OVERRIDE_OPENCOLORIO)
     add_definitions(-DOpenColorIO_SKIP_IMPORTS)
   endif()
 endif()