diff --git a/HySoP/CMake/MyTools.cmake b/HySoP/CMake/MyTools.cmake
index 227bbf301bfe8021a7ef2ea2ee0a65bed263c8a1..acb891887b833fc21bbb451319ed2979ed865fbb 100644
--- a/HySoP/CMake/MyTools.cmake
+++ b/HySoP/CMake/MyTools.cmake
@@ -127,3 +127,32 @@ macro(list_subdirectories retval curdir return_relative)
   set(${retval} ${list_of_dirs})
 endmacro()
 
+# Get the list of all directories in a directory
+macro(get_subdirectories result curdir)
+  file(GLOB subdir RELATIVE ${curdir} ${curdir}/*)
+  set(dirlist "")
+  foreach(dir ${subdir})
+    if(IS_DIRECTORY ${curdir}/${dir})
+      set(dirlist ${dirlist} ${dir})
+    endif()
+  endforeach()
+  set(${result} ${dirlist})
+endmacro()
+
+# Find the name (platform dependant) of the python build
+# (result of python setup.py build)
+# Note : this macro obviously works only if build exists i.e.
+# after a call to python build
+macro(get_python_builddir where result) 
+  get_subdirectories(listofdirs ${where})
+  foreach(dir ${listofdirs})
+    find_file(parmepyfile 
+      NAMES __init__.py
+      PATHS ${where}/${dir}/parmepy
+      PATH_SUFFIXES parmepy
+      NO_DEFAULT_PATH)
+  endforeach()
+  get_filename_component(builddir ${parmepyfile} PATH)
+  get_filename_component(builddir ${builddir} PATH)
+  set(${result} ${builddir})
+endmacro()
\ No newline at end of file
diff --git a/HySoP/CMake/ParmesTests.cmake b/HySoP/CMake/ParmesTests.cmake
index 870ccb76e89b9db3ca780aad779c6cf4e81fd1d9..28ebbc4f39c0aabae4f7a737cf01bf6e4d1c13d5 100644
--- a/HySoP/CMake/ParmesTests.cmake
+++ b/HySoP/CMake/ParmesTests.cmake
@@ -1,5 +1,3 @@
-#configure_file(CTestCustom.ctest.in CTestCustom.ctest)
-#add_test(NAME parmepy_test COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/BUILD_MAIN_PYTEST)
 enable_testing()
 find_python_module(pytest REQUIRED)
 
@@ -23,16 +21,22 @@ if(WITH_GPU)
     ${py_src_dirs} gpu)
 endif()
 
-### JM : Bub, GLOB_RECURSE utilse les chemins relatifs avec ../
-# foreach(testdir ${py_src_dirs})
-#   file(GLOB_RECURSE py_test_files "${test_dir}" RELATIVE_PATH parmepy/*/test_*.py)
-# endforeach()
+# Set test dir to python build dir.
+set(testDir ${CMAKE_BINARY_DIR}/build/${${PROJECT_NAME}_PYTHON_BUILD_DIR})
 
 ## Build a list of test_*.py files for each directory of parmepy/${py_src_dirs}
 set(py_test_files)
 foreach(testdir ${py_src_dirs})
-  file(GLOB testfiles parmepy/${testdir}/tests/test_*.py)
+  file(GLOB testfiles RELATIVE ${CMAKE_SOURCE_DIR} parmepy/${testdir}/tests/test_*.py)
   set(py_test_files ${py_test_files} ${testfiles})
+  # copy data files
+  file(GLOB datfiles parmepy/${testdir}/tests/*.dat)
+  file(GLOB mapfiles parmepy/${testdir}/tests/*.map)
+  set(datafiles ${mapfiles} ${datfiles})
+  foreach(_F ${datafiles})
+    get_filename_component(fname ${_F} NAME)
+    configure_file(${_F} ${CMAKE_CURRENT_BINARY_DIR}/dataForTests/${fname} COPYONLY)
+  endforeach()
 endforeach()
 
 ## Handling doctest in *.py files recursively for each directory of parmepy/${py_src_dirs}
@@ -53,25 +57,19 @@ message(STATUS "=== TESTS === ")
 ## Add test_*.py files
 foreach(testfile ${py_test_files})
   get_filename_component(testName ${testfile} NAME_WE)
+  set(testExe ${testDir}/${testfile})
   message(STATUS "Add test ${testfile} ...")
   if(FULL_TEST)
-    add_test(NAME ${testName} COMMAND py.test -v --pep8 ${testfile})
+    add_test(NAME ${testName} WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/dataForTests COMMAND py.test -v --pep8 ${testExe})
   else()
-    add_test(${testName} py.test -v ${testfile})
+    add_test(NAME ${testName} WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/dataForTests COMMAND py.test -v ${testExe})
   endif()
 endforeach()
-## Add files containing doctests
+# Add files containing doctests
+
 foreach(testfile ${py_doctest_files})
   get_filename_component(testName ${testfile} NAME_WE)
   message(STATUS "Add test from doc doctest_${testName} ...")
   add_test("doctest_${testName}" py.test -v ${testfile})
 endforeach()
 message(STATUS "===")
-
-
-#add_test(NAME topology COMMAND ${MPIEXEC} ${MPIEXEC_NUMPROC_FLAG} 4 py.test -v ${CMAKE_SOURCE_DIR}/parmepy/mpi/tests/test_topology.py)
-# add_test(NAME topology COMMAND ${MPIEXEC} ${MPIEXEC_NUMPROC_FLAG} 1 py.test -v ${CMAKE_SOURCE_DIR}/parmepy/mpi/tests/test_topology.py)
-#  add_test(topology py.test -v ${CMAKE_SOURCE_DIR}/parmepy/mpi/tests/test_topology.py)
-
-
-
diff --git a/HySoP/CMakeLists.txt b/HySoP/CMakeLists.txt
index 94648f14f6502dc6a9f24710fa9a3b188ca2e4df..cc669d2a9a5f1d6da3f91f9d13303463d4087041 100644
--- a/HySoP/CMakeLists.txt
+++ b/HySoP/CMakeLists.txt
@@ -14,7 +14,6 @@
 # LJK-CNRS, F. Pérignon, june 2012
 #
 #===============================================================================
-
 # ============= Global cmake Settings =============
 # Set minimum version for cmake
 cmake_minimum_required(VERSION 2.8.7)
@@ -41,7 +40,7 @@ option(WITH_MAIN_FORTRAN "Create an executable (test purpose) from fortran sourc
 option(DEBUG "Enable debug mode for Parmes (0:disabled, 1:verbose, 2:trace, 3:verbose+trace). Default = 0" 0)
 option(FULL_TEST "Enable all test options (pep8 ...) - Default = OFF" OFF)
 option(PROFILE "Enable profiling mode for Parmes. 0:disabled, 1: enabled. Default = 0" 0)
-
+option(USER_INSTALL "Set install location to python default (equivalent to --user option in python setup). Default = ON" ON)
 if(NOT WITH_LIB_FORTRAN)
   message(WARNING "You deactivate libparmes (fortran) generation. This will disable fftw and scales fonctionnalities.")
   set(WITH_FFTW "OFF")
@@ -49,6 +48,18 @@ if(NOT WITH_LIB_FORTRAN)
   set(WITH_MAIN_FORTRAN "OFF")
 endif()
 
+
+## About install :
+# if :
+# 1 - cmake ... ==> install in site.USER_SITE of python (equivalent to python setup.py install --user)
+# 2 - cmake -DUSER_INSTALL=OFF ... ==> install in cmake default location (/usr/local on linux system)
+# 3  cmake -DCMAKE_INSTALL_PREFIX = some_path ==> install in some_path
+# Note that case 2 and 3 require a proper set of PYTHONPATH environment var for parmepy to work.
+if(USER_INSTALL)
+  # Unset CMAKE_INSTALL_PREFIX to allow user to reset it and to use python default (--user) rather than cmake default. 
+  set(CMAKE_INSTALL_PREFIX "" CACHE PATH "install path")
+endif()
+
 # We can not run scales or fftw without mpi ...
 if(WITH_FFTW OR WITH_SCALES)
   set(USE_MPI "ON")
@@ -96,12 +107,26 @@ find_python_module(numpy REQUIRED)
 find_python_module(scitools REQUIRED)
 find_python_module(evtk)
 
-#Install dir for python (default = --user)
+if(USER_INSTALL)
+  ## INSTALL PREFIX not provided by user (-DCMAKE_INSTALL_PREFIX=...)
+  if(NOT CMAKE_INSTALL_PREFIX)
+    set(PYTHON_USER_INSTALL ON)
+    ## Setup for install dir (default = equivalent to python setup.py install--user)
+    # get --user output location
+    execute_process(
+      COMMAND ${PYTHON_EXECUTABLE} -c "import site ; print site.USER_SITE"
+      OUTPUT_VARIABLE ${PROJECT_NAME}_INSTALL_DIR)
+    string(STRIP ${${PROJECT_NAME}_INSTALL_DIR} ${PROJECT_NAME}_INSTALL_DIR)
+    # If CMAKE_INSTALL_PREFIX not set by user ...
+    set(CMAKE_INSTALL_PREFIX ${${PROJECT_NAME}_INSTALL_DIR}/${PROJECT_NAME})
+  endif()
+endif()
+#
+#Get build dir for python
 execute_process(
-  COMMAND ${PYTHON_EXECUTABLE} -c "import site ; print site.USER_SITE"
-  OUTPUT_VARIABLE ${PROJECT_NAME}_INSTALL_DIR)
-string(STRIP ${${PROJECT_NAME}_INSTALL_DIR} ${PROJECT_NAME}_INSTALL_DIR)
-set(CMAKE_INSTALL_PREFIX ${${PROJECT_NAME}_INSTALL_DIR}/${PROJECT_NAME})
+  COMMAND ${PYTHON_EXECUTABLE} -c "import distutils.util as ut ; import distutils.sysconfig as sy; print 'lib.'+ut.get_platform()+'-'+sy.get_python_version()"
+  OUTPUT_VARIABLE ${PROJECT_NAME}_PYTHON_BUILD_DIR)
+string(STRIP ${${PROJECT_NAME}_PYTHON_BUILD_DIR} ${PROJECT_NAME}_PYTHON_BUILD_DIR)
 
 # --- OpenCL ---
 if(WITH_GPU)
@@ -139,12 +164,18 @@ add_custom_target(python-build ALL COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_
    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMENT "build parmepy package")
 
 # To install python package AND parmes library and modules
+if(PYTHON_USER_INSTALL)
+  set(install-opt "--user")
+else()
+  set(install-opt "--prefix=${CMAKE_INSTALL_PREFIX}")
+endif()
 if(WITH_LIB_FORTRAN)
-  add_custom_target(python-install COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/setup.py install --user config_fc --f90exec=${CMAKE_Fortran_COMPILER}
+  add_custom_target(python-install COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/setup.py install ${install-opt} config_fc --f90exec=${CMAKE_Fortran_COMPILER}
     COMMAND make install
     WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMENT "build/install parmepy package")
 else()
-  add_custom_target(python-install COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/setup.py install --user config_fc --f90exec=${CMAKE_Fortran_COMPILER}
+  add_custom_target(python-install COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/setup.py install ${install-opt} config_fc --f90exec=${CMAKE_Fortran_COMPILER}
+    COMMAND make install
     WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMENT "build/install parmepy package")
 endif()
 
@@ -162,7 +193,6 @@ add_custom_target(pyclean COMMAND rm -f ${PYCFILES}
 
 # Target to generate doxygen documentation
 # Documentation generation
-
 find_package(Doxygen)
 if(DOXYGEN_FOUND)
   configure_file(${CMAKE_SOURCE_DIR}/DoxyConf/parmes.doxyfile.in ${CMAKE_BINARY_DIR}/DoxyConf/parmes.doxyfile)
@@ -210,13 +240,14 @@ if(VERBOSE_MODE)
   message(STATUS " Python version :${PYTHON_VERSION_STRING}")
   message(STATUS " Python executable : ${PYTHON_EXECUTABLE}")
   message(STATUS " Python libraries : ${PYTHON_LIBRARIES}")
-  message(STATUS " Compiler : ${CMAKE_Fortran_COMPILER}")
+  message(STATUS " Fortran compiler : ${CMAKE_Fortran_COMPILER}")
   message(STATUS " Sources are in : ${CMAKE_SOURCE_DIR}")
   message(STATUS " Project uses MPI : ${USE_MPI}")
   message(STATUS " Project uses Scales : ${WITH_SCALES}")
   message(STATUS " Project uses FFTW : ${WITH_FFTW}")
   message(STATUS " Project uses GPU : ${WITH_GPU}")
-  message(STATUS " Python packages will be installed in ${${PROJECT_NAME}_INSTALL_DIR}")
+  message(STATUS " Project will be built in ${${PROJECT_NAME}_PYTHON_BUILD_DIR}.")
+  message(STATUS " Python packages will be installed in ${CMAKE_INSTALL_PREFIX}")
   message(STATUS " ${PROJECT_NAME} debug mode : ${DEBUG}")
   message(STATUS "====================== ======= ======================")
 endif()
diff --git a/HySoP/hysop/__init__.py.in b/HySoP/hysop/__init__.py.in
index f7b7f0808d8f1161fadf834514eb35c315f66120..46a9e821b76e1758573773387d4989094b416901 100755
--- a/HySoP/hysop/__init__.py.in
+++ b/HySoP/hysop/__init__.py.in
@@ -51,3 +51,9 @@ Field = fields.continuous.Field
 
 
 ## from tools.explore_hardware import explore
+
+if("@WITH_TEST@" is "ON"):
+    import pytest
+    @pytest.fixture(autouse=True)
+    def parmetest():
+        monkeypatch.setenv("PYTHONPATH", "@testDir@")
diff --git a/HySoP/setup.py.in b/HySoP/setup.py.in
index da4ce475efc9cbf9d4370ab57bd971ccaf3cfa5e..8d822a6c1db46b44fffaadbebb77791d8f45a007 100644
--- a/HySoP/setup.py.in
+++ b/HySoP/setup.py.in
@@ -26,11 +26,23 @@ packages = ['parmepy',
             'parmepy.numerics.remeshing',
             ]
 
+packages_for_tests = ['parmepy.domain.tests',
+                      'parmepy.fields.tests',
+                      'parmepy.operator.tests',
+                      'parmepy.tools.tests',
+                      'parmepy.problem.tests',
+                      ]
+
 if("@USE_MPI@" is "ON"):
     packages.append('parmepy.mpi')
+    packages_for_tests.append('parmepy.mpi')
 
 if("@WITH_GPU@" is "ON"):
     packages.append('parmepy.gpu')
+    packages_for_tests.append('parmepy.gpu')
+
+if("@WITH_TESTS@" is "ON"):
+    packages = packages + packages_for_tests
 
 # Enable this to get debug info
 DISTUTILS_DEBUG=1
@@ -109,4 +121,5 @@ config = Configuration(name=name,
       data_files=data_files,
 )
 
+
 setup(**config.todict())