diff --git a/CMakeLists.txt b/CMakeLists.txt
index 56241c740fc6d15948492f151ceca3d5f96dd7a5..cc45199357af33028360c43b664b47549bf22c2e 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -4,7 +4,7 @@
 #
 # @copyright 2009-2014 The University of Tennessee and The University of
 #                      Tennessee Research Foundation. All rights reserved.
-# @copyright 2012-2017 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria,
+# @copyright 2012-2018 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria,
 #                      Univ. Bordeaux. All rights reserved.
 #
 ###
@@ -259,7 +259,16 @@ set(CHAMELEON_DEP "")
 set(CMAKE_THREAD_PREFER_PTHREAD TRUE)
 find_package(Threads REQUIRED)
 if( THREADS_FOUND )
-  list(APPEND EXTRA_LIBRARIES ${CMAKE_THREAD_LIBS_INIT})
+  string(REGEX REPLACE "-l" "" THREAD_LIBS "${CMAKE_THREAD_LIBS_INIT}")
+  set(CMAKE_THREAD_LIBS_INIT)
+  foreach(_lib ${THREAD_LIBS})
+    find_library(THREADS_${_lib}_LIBRARY NAMES ${_lib}
+      HINTS ${CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES} ${CMAKE_C_IMPLICIT_LINK_DIRECTORIES})
+    if (THREADS_${_lib}_LIBRARY)
+      list(APPEND CMAKE_THREAD_LIBS_INIT ${THREADS_${_lib}_LIBRARY})
+    endif()
+  endforeach()
+  list(APPEND EXTRA_LIBRARIES ${THREADS_${_lib}_LIBRARY})
 endif ()
 
 # Add math library to the list of extra
@@ -303,30 +312,22 @@ if(NOT CHAMELEON_SIMULATION)
 
     # CHAMELEON depends on CBLAS
     #---------------------------
-    find_package(CBLAS COMPONENTS BLASEXT)
-    if(BLAS_FOUND)
-        if (BLAS_LIBRARY_DIRS)
-            # the RPATH to be used when installing
-            list(APPEND CMAKE_INSTALL_RPATH "${BLAS_LIBRARY_DIRS}")
+    find_package(CBLAS REQUIRED)
+    if(CBLAS_FOUND)
+        if (CBLAS_INCLUDE_DIRS_DEP)
+            include_directories(${CBLAS_INCLUDE_DIRS_DEP})
         endif()
-        if(BLAS_LINKER_FLAGS)
-            list(APPEND CMAKE_EXE_LINKER_FLAGS "${BLAS_LINKER_FLAGS}")
+        if(CBLAS_CFLAGS_OTHER_DEP)
+            list(APPEND CMAKE_C_FLAGS "${CBLAS_CFLAGS_OTHER_DEP}")
         endif()
-    else()
-        message(FATAL_ERROR "BLAS library has not been found")
-    endif()
-    if(CBLAS_FOUND)
-        include_directories(${CBLAS_INCLUDE_DIRS})
-        if(CBLAS_LIBRARY_DIRS)
-            # the RPATH to be used when installing
-            list(APPEND CMAKE_INSTALL_RPATH "${CBLAS_LIBRARY_DIRS}")
+        if(CBLAS_LDFLAGS_OTHER_DEP)
+            list(APPEND CMAKE_EXE_LINKER_FLAGS "${CBLAS_LDFLAGS_OTHER_DEP}")
         endif()
-        if (CBLAS_LIBRARIES)
-            if (CBLAS_LIBRARIES_DEP)
-                list(INSERT CHAMELEON_DEP 0 ${CBLAS_LIBRARIES_DEP})
-            else()
-                list(INSERT CHAMELEON_DEP 0 ${CBLAS_LIBRARIES})
-            endif()
+        if(CBLAS_LIBRARY_DIRS_DEP)
+            list(APPEND CMAKE_INSTALL_RPATH "${CBLAS_LIBRARY_DIRS_DEP}")
+        endif()
+        if (CBLAS_LIBRARIES_DEP)
+            list(INSERT CHAMELEON_DEP 0 ${CBLAS_LIBRARIES_DEP})
         endif()
     else()
         if(MORSE_VERBOSE_FIND_PACKAGE)
@@ -347,32 +348,22 @@ if(NOT CHAMELEON_SIMULATION)
 
     # CHAMELEON depends on LAPACKE
     #-----------------------------
-    # standalone version of lapacke seems useless for now
-    # let the comment in case we meet some problems of non existing lapacke
-    # functions in lapack library such as mkl, acml, ...
-    #set(LAPACKE_STANDALONE TRUE)
-    find_package(LAPACKE COMPONENTS LAPACKEXT)
-    if(LAPACK_FOUND AND LAPACK_LIBRARY_DIRS)
-        # the RPATH to be used when installing
-        list(APPEND CMAKE_INSTALL_RPATH "${LAPACK_LIBRARY_DIRS}")
-    else()
-        message(FATAL_ERROR "A LAPACK library is required but has not been found")
-    endif()
+    find_package(LAPACKE)
     if(LAPACKE_FOUND)
-        include_directories(${LAPACKE_INCLUDE_DIRS})
-        if(LAPACKE_LIBRARY_DIRS)
-            # the RPATH to be used when installing
-            list(APPEND CMAKE_INSTALL_RPATH "${LAPACKE_LIBRARY_DIRS}")
+        if (LAPACKE_INCLUDE_DIRS_DEP)
+            include_directories(${LAPACKE_INCLUDE_DIRS_DEP})
         endif()
-        if(LAPACKE_LINKER_FLAGS)
-            list(APPEND CMAKE_EXE_LINKER_FLAGS "${LAPACKE_LINKER_FLAGS}")
+        if(LAPACKE_CFLAGS_OTHER_DEP)
+            list(APPEND CMAKE_C_FLAGS "${LAPACKE_CFLAGS_OTHER_DEP}")
         endif()
-        if (LAPACKE_LIBRARIES)
-            if (LAPACKE_LIBRARIES_DEP)
-                list(INSERT CHAMELEON_DEP 0 ${LAPACKE_LIBRARIES_DEP})
-            else()
-                list(INSERT CHAMELEON_DEP 0 ${LAPACKE_LIBRARIES})
-            endif()
+        if(LAPACKE_LDFLAGS_OTHER_DEP)
+            list(APPEND CMAKE_EXE_LINKER_FLAGS "${LAPACKE_LDFLAGS_OTHER_DEP}")
+        endif()
+        if(LAPACKE_LIBRARY_DIRS_DEP)
+            list(APPEND CMAKE_INSTALL_RPATH "${LAPACKE_LIBRARY_DIRS_DEP}")
+        endif()
+        if (LAPACKE_LIBRARIES_DEP)
+            list(INSERT CHAMELEON_DEP 0 ${LAPACKE_LIBRARIES_DEP})
         endif()
     else()
         if(MORSE_VERBOSE_FIND_PACKAGE)
@@ -395,21 +386,20 @@ if(NOT CHAMELEON_SIMULATION)
     #-------------------------
     if (CHAMELEON_ENABLE_TESTING OR CHAMELEON_ENABLE_TIMING)
         find_package(TMG)
-        if(TMG_FOUND AND TMG_LIBRARY_DIRS)
-            # the RPATH to be used when installing
-            list(APPEND CMAKE_INSTALL_RPATH "${TMG_LIBRARY_DIRS}")
-        else()
-            message(FATAL_ERROR "A TMG library is required but has not been found")
+        if (TMG_INCLUDE_DIRS_DEP)
+            include_directories(${TMG_INCLUDE_DIRS_DEP})
         endif()
-        if(TMG_LINKER_FLAGS)
-            list(APPEND CMAKE_EXE_LINKER_FLAGS "${TMG_LINKER_FLAGS}")
+        if(TMG_CFLAGS_OTHER_DEP)
+            list(APPEND CMAKE_C_FLAGS "${TMG_CFLAGS_OTHER_DEP}")
         endif()
-        if (TMG_LIBRARIES)
-            if (TMG_LIBRARIES_DEP)
-                list(INSERT CHAMELEON_DEP 0 ${TMG_LIBRARIES_DEP})
-            else()
-                list(INSERT CHAMELEON_DEP 0 ${TMG_LIBRARIES})
-            endif()
+        if(TMG_LDFLAGS_OTHER_DEP)
+            list(APPEND CMAKE_EXE_LINKER_FLAGS "${TMG_LDFLAGS_OTHER_DEP}")
+        endif()
+        if(TMG_LIBRARY_DIRS_DEP)
+            list(APPEND CMAKE_INSTALL_RPATH "${TMG_LIBRARY_DIRS_DEP}")
+        endif()
+        if (TMG_LIBRARIES_DEP)
+            list(INSERT CHAMELEON_DEP 0 ${TMG_LIBRARIES_DEP})
         endif()
     endif()
 
@@ -642,19 +632,24 @@ if( CHAMELEON_SCHED_STARPU )
         message("-- ${Blue}Add definition CHAMELEON_SCHED_STARPU"
         " - Activate StarPU in Chameleon${ColourReset}")
         set(CHAMELEON_SCHED_STARPU 1)
-        include_directories(${STARPU_INCLUDE_DIRS_DEP})
-        if(STARPU_LINKER_FLAGS)
-            list(APPEND CMAKE_EXE_LINKER_FLAGS "${STARPU_LINKER_FLAGS}")
+        if (STARPU_INCLUDE_DIRS_DEP)
+            include_directories(${STARPU_INCLUDE_DIRS_DEP})
+            set(CMAKE_REQUIRED_INCLUDES "${STARPU_INCLUDE_DIRS_DEP}")
         endif()
-        set(CMAKE_REQUIRED_INCLUDES "${STARPU_INCLUDE_DIRS_DEP}")
-        foreach(libdir ${STARPU_LIBRARY_DIRS_DEP})
-            list(APPEND CMAKE_REQUIRED_FLAGS "-L${libdir}")
-        endforeach()
-        set(CMAKE_REQUIRED_LIBRARIES "${STARPU_LIBRARIES_DEP}")
-        if (CHAMELEON_USE_MPI)
-            list(APPEND CMAKE_REQUIRED_INCLUDES "${MPI_C_INCLUDE_PATH}")
-            list(APPEND CMAKE_REQUIRED_FLAGS "${MPI_C_LINK_FLAGS}")
-            list(APPEND CMAKE_REQUIRED_LIBRARIES "${MPI_C_LIBRARIES}")
+        if(STARPU_CFLAGS_OTHER_DEP)
+            list(APPEND CMAKE_C_FLAGS "${STARPU_CFLAGS_OTHER_DEP}")
+            set(CMAKE_REQUIRED_FLAGS "${STARPU_CFLAGS_OTHER_DEP}")
+        endif()
+        if(STARPU_LDFLAGS_OTHER_DEP)
+            list(APPEND CMAKE_EXE_LINKER_FLAGS "${STARPU_LDFLAGS_OTHER_DEP}")
+            set(CMAKE_REQUIRED_LDFLAGS "${STARPU_LDFLAGS_OTHER_DEP}")
+        endif()
+        if(STARPU_LIBRARY_DIRS_DEP)
+            list(APPEND CMAKE_INSTALL_RPATH "${STARPU_LIBRARY_DIRS_DEP}")
+        endif()
+        if (STARPU_LIBRARIES_DEP)
+            list(INSERT CHAMELEON_DEP 0 ${STARPU_LIBRARIES_DEP})
+            set(CMAKE_REQUIRED_LIBRARIES "${STARPU_LIBRARIES_DEP}")
         endif()
         if (CHAMELEON_SIMULATION)
             list(APPEND CMAKE_REQUIRED_FLAGS "-include" "starpu_simgrid_wrap.h")
@@ -721,32 +716,6 @@ if( CHAMELEON_SCHED_STARPU )
                 message("-- ${Blue}Add definition HAVE_STARPU_MPI_COMM_GET_ATTR${ColourReset}")
             endif()
         endif()
-        if(HWLOC_FOUND AND HWLOC_LIBRARY_DIRS)
-            # the RPATH to be used when installing
-            list(APPEND CMAKE_INSTALL_RPATH "${HWLOC_LIBRARY_DIRS}")
-        endif()
-        if(FXT_FOUND AND FXT_LIBRARY_DIRS)
-            # the RPATH to be used when installing
-            list(APPEND CMAKE_INSTALL_RPATH "${FXT_LIBRARY_DIRS}")
-        endif()
-        if(SIMGRID_FOUND AND SIMGRID_LIBRARY_DIRS)
-            # the RPATH to be used when installing
-            list(APPEND CMAKE_INSTALL_RPATH "${SIMGRID_LIBRARY_DIRS}")
-        endif()
-        if(STARPU_FOUND AND STARPU_LIBRARY_DIRS)
-            # the RPATH to be used when installing
-            list(APPEND CMAKE_INSTALL_RPATH "${STARPU_LIBRARY_DIRS}")
-        endif()
-        if (STARPU_LIBRARIES)
-            if (STARPU_LIBRARIES_DEP)
-                list(INSERT CHAMELEON_DEP 0 ${STARPU_LIBRARIES_DEP})
-            else()
-                list(INSERT CHAMELEON_DEP 0 ${STARPU_LIBRARIES})
-            endif()
-        endif()
-        unset(CMAKE_REQUIRED_FLAGS)
-        unset(CMAKE_REQUIRED_INCLUDES)
-        unset(CMAKE_REQUIRED_LIBRARIES)
     else ( STARPU_FOUND )
         if(MORSE_VERBOSE_FIND_PACKAGE)
             if(NOT HWLOC_FOUND OR NOT HWLOC_LIBRARIES)
@@ -825,46 +794,34 @@ if( CHAMELEON_SCHED_PARSEC )
     #if(CHAMELEON_WITH_PROFILING)
     #    list(APPEND PARSEC_COMPONENT_LIST "PAPI")
     #endif()
-
     find_package(PARSEC COMPONENTS ${PARSEC_COMPONENT_LIST})
-
-    # Add definition and include_dir if found
     if(PARSEC_FOUND)
         message("-- ${Blue}Add definition CHAMELEON_SCHED_PARSEC"
         " - Activate PaRSEC in Chameleon${ColourReset}")
-
       set(CHAMELEON_SCHED_PARSEC 1)
-      include_directories(${PARSEC_INCLUDE_DIRS_DEP})
-      include_directories(${PARSEC_INCLUDE_DIRS}/daguepp)
-      set(CMAKE_REQUIRED_INCLUDES "${PARSEC_INCLUDE_DIRS_DEP}")
-
-      if(PARSEC_LINKER_FLAGS)
-           list(APPEND CMAKE_EXE_LINKER_FLAGS "${PARSEC_LINKER_FLAGS}")
+      if (PARSEC_INCLUDE_DIRS_DEP)
+          include_directories(${PARSEC_INCLUDE_DIRS_DEP})
+          include_directories(${PARSEC_INCLUDE_DIRS}/daguepp)
       endif()
-      foreach(libdir ${PARSEC_LIBRARY_DIRS_DEP})
-          list(APPEND CMAKE_REQUIRED_FLAGS "-L${libdir}")
-      endforeach()
-      string(REPLACE ";" " " CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
-      set(CMAKE_REQUIRED_LIBRARIES "${PARSEC_LIBRARIES_DEP}")
-
-      if(HWLOC_FOUND AND HWLOC_LIBRARY_DIRS)
-            # the RPATH to be used when installing
-          list(APPEND CMAKE_INSTALL_RPATH "${HWLOC_LIBRARY_DIRS}")
+      if(PARSEC_CFLAGS_OTHER_DEP)
+          list(APPEND CMAKE_C_FLAGS "${PARSEC_CFLAGS_OTHER_DEP}")
+      endif()
+      if(PARSEC_LDFLAGS_OTHER_DEP)
+          list(APPEND CMAKE_EXE_LINKER_FLAGS "${PARSEC_LDFLAGS_OTHER_DEP}")
       endif()
-      if(PARSEC_FOUND AND PARSEC_LIBRARY_DIRS_DEP)
-          # the RPATH to be used when installing
+      if(PARSEC_LIBRARY_DIRS_DEP)
           list(APPEND CMAKE_INSTALL_RPATH "${PARSEC_LIBRARY_DIRS_DEP}")
       endif()
-      if (PARSEC_LIBRARIES)
-          if (PARSEC_LIBRARIES_DEP)
-              list(INSERT CHAMELEON_DEP 0 ${PARSEC_LIBRARIES_DEP})
-          else()
-              list(INSERT CHAMELEON_DEP 0 ${PARSEC_LIBRARIES})
-          endif()
+      if (PARSEC_LIBRARIES_DEP)
+          list(INSERT CHAMELEON_DEP 0 ${PARSEC_LIBRARIES_DEP})
       endif()
-      unset(CMAKE_REQUIRED_FLAGS)
-      unset(CMAKE_REQUIRED_INCLUDES)
-      unset(CMAKE_REQUIRED_LIBRARIES)
+      string(REPLACE ";" " " CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
+      # to test if symbols exist, e.g.
+      # set(CMAKE_REQUIRED_INCLUDES "${PARSEC_INCLUDE_DIRS_DEP}")
+      # set(CMAKE_REQUIRED_FLAGS "${PARSEC_CFLAGS_OTHER_DEP}")
+      # set(CMAKE_REQUIRED_LDFLAGS "${PARSEC_LDFLAGS_OTHER_DEP}")
+      # set(CMAKE_REQUIRED_LIBRARIES "${PARSEC_LIBRARIES_DEP}")
+      # check_function_exists(parsec_init HAVE_PARSEC_INIT)
     else ( PARSEC_FOUND )
         if(MORSE_VERBOSE_FIND_PACKAGE)
             if(NOT HWLOC_FOUND OR NOT HWLOC_LIBRARIES)
@@ -913,17 +870,20 @@ if( CHAMELEON_SCHED_QUARK )
         message("-- ${Blue}Add definition CHAMELEON_SCHED_QUARK"
         " - Activate QUARK in Chameleon${ColourReset}")
         set(CHAMELEON_SCHED_QUARK 1)
-        include_directories(${QUARK_INCLUDE_DIRS})
-        if(QUARK_LIBRARY_DIRS)
-            # the RPATH to be used when installing
-            list(APPEND CMAKE_INSTALL_RPATH "${QUARK_LIBRARY_DIRS}")
+        if (QUARK_INCLUDE_DIRS_DEP)
+            include_directories(${QUARK_INCLUDE_DIRS_DEP})
         endif()
-        if (QUARK_LIBRARIES)
-            if (QUARK_LIBRARIES_DEP)
-                list(INSERT CHAMELEON_DEP 0 ${QUARK_LIBRARIES_DEP})
-            else()
-                list(INSERT CHAMELEON_DEP 0 ${QUARK_LIBRARIES})
-            endif()
+        if(QUARK_CFLAGS_OTHER_DEP)
+            list(APPEND CMAKE_C_FLAGS "${QUARK_CFLAGS_OTHER_DEP}")
+        endif()
+        if(QUARK_LDFLAGS_OTHER_DEP)
+            list(APPEND CMAKE_EXE_LINKER_FLAGS "${QUARK_LDFLAGS_OTHER_DEP}")
+        endif()
+        if(QUARK_LIBRARY_DIRS_DEP)
+            list(APPEND CMAKE_INSTALL_RPATH "${QUARK_LIBRARY_DIRS_DEP}")
+        endif()
+        if (QUARK_LIBRARIES_DEP)
+            list(INSERT CHAMELEON_DEP 0 ${QUARK_LIBRARIES_DEP})
         endif()
     else(QUARK_FOUND)
         if(MORSE_VERBOSE_FIND_PACKAGE)
@@ -965,6 +925,8 @@ cmake_dependent_option(CHAMELEON_USE_CUBLAS_V2
   "Enable cublas API v2" ON
   "CHAMELEON_USE_CUDA;CHAMELEON_SCHED_STARPU" OFF)
 
+list(REMOVE_DUPLICATES CMAKE_C_FLAGS)
+string(REPLACE ";" " " CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
 list(REMOVE_DUPLICATES CMAKE_EXE_LINKER_FLAGS)
 string(REPLACE ";" " " CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS}")
 # Fix a problem on Mac OS X when building shared libraries
@@ -972,23 +934,12 @@ if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
     set(CMAKE_SHARED_LINKER_FLAGS "-undefined dynamic_lookup")
 endif()
 
-#------------------------------------------------------------------------------
-if(CHAMELEON_SCHED_STARPU)
-    link_directories(${STARPU_LIBRARY_DIRS_DEP})
-elseif(CHAMELEON_SCHED_PARSEC)
-    link_directories(${PARSEC_LIBRARY_DIRS_DEP})
-elseif(CHAMELEON_SCHED_QUARK)
-    link_directories(${QUARK_LIBRARY_DIRS})
-endif()
-if(NOT CHAMELEON_SIMULATION)
-    if(CHAMELEON_USE_CUDA)
-        link_directories(${CUDA_LIBRARY_DIRS})
-    endif()
-endif()
-
 # Save extra dependencies (all required links)
 list(APPEND CHAMELEON_DEP ${EXTRA_LIBRARIES})
-list(REMOVE_DUPLICATES CHAMELEON_DEP) # WARNING: is it safe, respect order?
+# We remove duplicate dependencies ensuring that redundant libraries are placed last
+list(REVERSE CHAMELEON_DEP)
+list(REMOVE_DUPLICATES CHAMELEON_DEP)
+list(REVERSE CHAMELEON_DEP)
 
 # Check for the subdirectories
 # ----------------------------