diff --git a/cmake/DetectOptions.cmake b/cmake/DetectOptions.cmake
index bc9d2aba3d626565c2858d842089010d96376dfb..990fc3f3cec5a8d171e701737eebf2eaa511e324 100644
--- a/cmake/DetectOptions.cmake
+++ b/cmake/DetectOptions.cmake
@@ -16,30 +16,30 @@ set(adios2_find_modules)
 # BZip2
 if(ADIOS2_USE_BZip2 STREQUAL AUTO)
   find_package(BZip2)
-  if(BZIP2_FOUND)
-    set(ADIOS2_HAVE_BZip2 TRUE)
-  endif()
 elseif(ADIOS2_USE_BZip2)
+  find_package(BZip2 REQUIRED)
+endif()
+if(BZIP2_FOUND)
   set(ADIOS2_HAVE_BZip2 TRUE)
 endif()
 
 # ZFP
 if(ADIOS2_USE_ZFP STREQUAL AUTO)
   find_package(ZFP)
-  if(ZFP_FOUND)
-    set(ADIOS2_HAVE_ZFP TRUE)
-  endif()
 elseif(ADIOS2_USE_ZFP)
+  find_package(ZFP REQUIRED)
+endif()
+if(ZFP_FOUND)
   set(ADIOS2_HAVE_ZFP TRUE)
 endif()
 
 # MPI
 if(ADIOS2_USE_MPI STREQUAL AUTO)
-  find_package(MPI COMPONENTS C)
-  if(MPI_FOUND)
-    set(ADIOS2_HAVE_MPI TRUE)
-  endif()
+  find_package(MPI)
 elseif(ADIOS2_USE_MPI)
+  find_package(MPI REQUIRED)
+endif()
+if(MPI_FOUND)
   set(ADIOS2_HAVE_MPI TRUE)
 endif()
 
@@ -49,47 +49,42 @@ if(ADIOS2_USE_C)
 endif()
 
 # DataMan
-if(ADIOS2_USE_DataMan STREQUAL AUTO)
-  if(SHARED_LIBS_SUPPORTED AND NOT MSVC)
-    set(ADIOS2_HAVE_DataMan TRUE)
-  endif()
-elseif(ADIOS2_USE_DataMan)
+if(SHARED_LIBS_SUPPORTED AND NOT MSVC)
   set(ADIOS2_HAVE_DataMan TRUE)
 endif()
 
 # ZeroMQ
 if(ADIOS2_USE_ZeroMQ STREQUAL AUTO)
   find_package(ZeroMQ)
-  if(ZeroMQ_FOUND)
-    set(ADIOS2_HAVE_ZeroMQ TRUE)
-  endif()
 elseif(ADIOS2_USE_ZeroMQ)
+  find_package(ZeroMQ REQUIRED)
+endif()
+if(ZeroMQ_FOUND)
   set(ADIOS2_HAVE_ZeroMQ TRUE)
 endif()
 
 # HDF5
 if(ADIOS2_USE_HDF5 STREQUAL AUTO)
   find_package(HDF5 COMPONENTS C)
-  if(HDF5_FOUND AND
-     ((ADIOS2_HAVE_MPI AND HDF5_IS_PARALLEL) OR
-      NOT (ADIOS2_HAVE_MPI OR HDF5_IS_PARALLEL)))
-    set(ADIOS2_HAVE_HDF5 TRUE)
-  endif()
 elseif(ADIOS2_USE_HDF5)
+  find_package(HDF5 REQUIRED COMPONENTS C)
+endif()
+if(HDF5_FOUND AND
+   ((ADIOS2_HAVE_MPI AND HDF5_IS_PARALLEL) OR
+    NOT (ADIOS2_HAVE_MPI OR HDF5_IS_PARALLEL)))
   set(ADIOS2_HAVE_HDF5 TRUE)
 endif()
 
 # ADIOS1
+if(NOT ADIOS2_HAVE_MPI)
+  set(adios1_find_args COMPONENTS sequential)
+endif()
 if(ADIOS2_USE_ADIOS1 STREQUAL AUTO)
-  if(NOT ADIOS2_HAVE_MPI)
-    set(adios1_args COMPONENTS sequential)
-  endif()
   find_package(ADIOS1 1.12.0 ${adios1_args})
-  unset(adios1_args)
-  if(ADIOS1_FOUND)
-    set(ADIOS2_HAVE_ADIOS1 TRUE)
-  endif()
 elseif(ADIOS2_USE_ADIOS1)
+  find_package(ADIOS1 1.12.0 REQUIRED ${adios1_args})
+endif()
+if(ADIOS1_FOUND)
   set(ADIOS2_HAVE_ADIOS1 TRUE)
 endif()
 
@@ -98,39 +93,35 @@ endif()
 list(INSERT CMAKE_MODULE_PATH 0
   "${ADIOS2_SOURCE_DIR}/thirdparty/pybind11/pybind11/tools"
 )
-if(ADIOS2_USE_Python STREQUAL AUTO)
+if(ADIOS2_USE_Python)
+  if(NOT (ADIOS2_USE_Python STREQUAL AUTO))
+    set(python_find_args REQUIRED)
+  endif()
   if(SHARED_LIBS_SUPPORTED AND ADIOS2_ENABLE_PIC)
     set(Python_ADDITIONAL_VERSIONS 3 2.7)
-    find_package(PythonInterp)
-    find_package(PythonLibsNew)
-    if(PYTHONLIBS_FOUND)
-      if(ADIOS2_HAVE_MPI)
-        find_package(PythonModule COMPONENTS mpi4py mpi4py/mpi4py.h)
-        if(PythonModule_mpi4py_FOUND)
-          set(ADIOS2_HAVE_Python TRUE)
-        endif()
-      else()
-        set(ADIOS2_HAVE_Python TRUE)
-      endif()
+    list(APPEND python_find_args COMPONENTS Interp Libs numpy)
+    if(ADIOS2_HAVE_MPI)
+      list(APPEND python_find_args "mpi4py\\\;mpi4py/mpi4py.h")
     endif()
+    find_package(PythonFull ${python_find_args})
   endif()
-elseif(ADIOS2_USE_Python)
-  set(ADIOS2_HAVE_Python TRUE)
+endif()
+if(PythonFull_FOUND)
+  set(ADIOS2_HAVE_Python ON)
 endif()
 
 #SysV IPC
-if(ADIOS2_USE_SysVShMem STREQUAL AUTO)
-  if(UNIX)
-    include(CheckSymbolExists)
-    CHECK_SYMBOL_EXISTS(shmget "sys/ipc.h;sys/shm.h" HAVE_shmget)
-    if(HAVE_shmget)
-      set(ADIOS2_HAVE_SysVShMem ON)
-    else()
-      set(ADIOS2_HAVE_SysVShMem OFF)
-    endif()
+if(UNIX)
+  include(CheckSymbolExists)
+  CHECK_SYMBOL_EXISTS(shmget "sys/ipc.h;sys/shm.h" HAVE_shmget)
+  if(HAVE_shmget)
+    set(ADIOS2_HAVE_SysVShMem ON)
   else()
     set(ADIOS2_HAVE_SysVShMem OFF)
   endif()
-elseif(ADIOS2_USE_SysVShMem)
-  set(ADIOS2_HAVE_SysVShMem TRUE)
+else()
+  set(ADIOS2_HAVE_SysVShMem OFF)
 endif()
+
+# Multithreading
+find_package(Threads REQUIRED)