diff --git a/SuperBuild/Packaging/PackageHelper.cmake b/SuperBuild/Packaging/PackageHelper.cmake
index 438815ae911fad1875e05345aa49652f63321cf4..7c9688d69ee46dcd9d36008e415935a9212797b7 100644
--- a/SuperBuild/Packaging/PackageHelper.cmake
+++ b/SuperBuild/Packaging/PackageHelper.cmake
@@ -60,47 +60,62 @@ macro(macro_super_package)
 
   set(PKG_PEFILES)
   if(NOT WIN32)
-    file(WRITE ${CMAKE_BINARY_DIR}/make_symlinks "#!/bin/sh\n")
-    #NOTE: VAR_IN_PKGSETUP_CONFIGURE is copied to linux_pkgsetup.in during configure_file
+    #NOTE: VAR_IN_PKGSETUP_CONFIGURE is copied to linux_pkgsetup.in
+    #during configure_file. This will be processed by func_lisp
     set(VAR_IN_PKGSETUP_CONFIGURE)
-    set(PKG_SO_FILES)
-  endif() # if(NOT WIN32)
+  endif()
+
+  set(QT_EXECUTABLES)
+  list(APPEND QT_EXECUTABLES "lrelease")
+  list(APPEND QT_EXECUTABLES "moc")
+  list(APPEND QT_EXECUTABLES "qmake")
+  list(APPEND QT_EXECUTABLES "rcc")
+  list(APPEND QT_EXECUTABLES "uic")
 
   func_prepare_package()
 
-  func_prepare_install_list(
-    "${CMAKE_BINARY_DIR}/install_to_bin"
-    ${PKG_GENERATE_XDK}
-    bin_install_list
-    )
-
-  func_prepare_install_list(
-    "${CMAKE_BINARY_DIR}/install_to_lib"
-    ${PKG_GENERATE_XDK}
-    lib_install_list
-    )
-
-  foreach(installable_item_in_bin ${bin_install_list})
-    if(WIN32)
-      #only install .exe files with install(PROGRAMS ..
-      if("${installable_item_in_bin}" MATCHES "\\.exe$")
-        install(PROGRAMS "${installable_item_in_bin}" DESTINATION ${PKG_STAGE_DIR}/bin)
-      else()
-        install(FILES "${installable_item_in_bin}" DESTINATION ${PKG_STAGE_DIR}/bin)
-      endif()
+  file(STRINGS "${CMAKE_BINARY_DIR}/install_to_bin" install_to_bin_list)
+  func_lisp(install_to_bin_list )
+  foreach(install_to_bin_item ${install_to_bin_list})
+    is_file_executable("${install_to_bin_item}" is_exe)
+    if(is_exe)
+      install(PROGRAMS "${install_to_bin_item}" DESTINATION ${PKG_STAGE_DIR}/bin)
     else()
-      #install all executable with install(PROGRAMS on unix like
-      install(PROGRAMS "${installable_item_in_bin}" DESTINATION ${PKG_STAGE_DIR}/bin)
+      install(FILES "${install_to_bin_item}" DESTINATION ${PKG_STAGE_DIR}/bin)
     endif()
   endforeach()
 
+  file(STRINGS "${CMAKE_BINARY_DIR}/install_to_lib" install_to_lib_list)
+  func_lisp( install_to_lib_list )
   #install lib files into lib as install(FILES ..
-  foreach(installable_item_in_lib ${lib_install_list})
-    install(FILES "${installable_item_in_lib}" DESTINATION ${PKG_STAGE_DIR}/lib)
+  foreach(install_to_lib_item ${install_to_lib_list})
+    install(FILES "${install_to_lib_item}" DESTINATION ${PKG_STAGE_DIR}/lib)
   endforeach()
 
   ############# install package configure script ################
   if(UNIX AND NOT WIN32)
+
+    #avoid OTB stuff inside make_symlinks script
+    file(STRINGS "${CMAKE_BINARY_DIR}/make_symlinks_temp" make_symlinks_list)
+    func_lisp( make_symlinks_list )
+    file(WRITE ${CMAKE_BINARY_DIR}/make_symlinks "#!/usr/bin/env bash\n")
+    foreach(make_symlink_cmd ${make_symlinks_list})
+      file(APPEND ${CMAKE_BINARY_DIR}/make_symlinks
+        "${make_symlink_cmd}\n")
+    endforeach()
+
+    set(IS_XDK "false")
+    if(PKG_GENERATE_XDK)
+      set(IS_XDK "true")
+      if("${ITK_VERSION_STRING}" STREQUAL "")
+        message(FATAL_ERROR "ITK_VERSION_STRING not set. This is required for XDK")
+      endif()
+
+      #avoid OTB stuff inside pkgsetup for XDK
+      separate_arguments( VAR_IN_PKGSETUP_CONFIGURE )
+      func_lisp( VAR_IN_PKGSETUP_CONFIGURE )
+      string(REPLACE ";" " " VAR_IN_PKGSETUP_CONFIGURE "${VAR_IN_PKGSETUP_CONFIGURE}")
+    endif()
     set(PKGSETUP_IN_FILENAME linux_pkgsetup.in)
     if(APPLE)
       set(PKGSETUP_IN_FILENAME macx_pkgsetup.in)
@@ -161,9 +176,7 @@ function(func_install_xdk_files)
     endif()
   endforeach()
 
-  # #install ${DEPENDENCIES_INSTALL_DIR}/include silently
-  func_install_without_message("${DEPENDENCIES_INSTALL_DIR}/include" "" "(may take a while)..")
-
+  set(QT_REQ_DIRS)
   if(WIN32)
     #only affects windows due to regex on dll
     file(GLOB LIB_FILES "${DEPENDENCIES_INSTALL_DIR}/lib/*dll.*")
@@ -189,32 +202,59 @@ function(func_install_xdk_files)
     file(GLOB OPENCV_CONFIG_FILES_2 "${DEPENDENCIES_INSTALL_DIR}/OpenCV*.cmake")
     install(FILES ${OPENCV_CONFIG_FILES_2} DESTINATION ${PKG_STAGE_DIR})
 
-    #mxe install qt in a seperate directory under install prefix. So..
-    foreach(REQ_DIR
-        lib
-        mkspecs
-        include
-        imports
-        plugins
-        translations
-        )
-      if(EXISTS "${DEPENDENCIES_INSTALL_DIR}/qt/${REQ_DIR}")
-        func_install_without_message("${DEPENDENCIES_INSTALL_DIR}/qt/${REQ_DIR}" "")
-      endif()
-    endforeach()
+    #mxe installs qt in a seperate directory under install prefix. So..
+    set(QT_INSTALL_DIR "${DEPENDENCIES_INSTALL_DIR}/qt")
 
-    #qt/bin is a special case here.
+    #qt/bin is also a special case for mxe.
     file(GLOB QT_EXTRA_DLL_FILES "${DEPENDENCIES_INSTALL_DIR}/qt/bin/*.dll")
     install(FILES ${QT_EXTRA_DLL_FILES} DESTINATION ${PKG_STAGE_DIR}/bin)
 
-    file(GLOB QT_EXECUTABLES "${DEPENDENCIES_INSTALL_DIR}/qt/bin/*.exe")
-    install(FILES ${QT_EXECUTABLES} DESTINATION ${PKG_STAGE_DIR}/bin)
+    list(APPEND QT_REQ_DIRS lib)
+    list(APPEND QT_REQ_DIRS include)
+    list(APPEND QT_REQ_DIRS imports)
 
-    file(GLOB QT_EXTRA_EXECUTABLES "${Monteverdi_BINARY_DIR}/PACKAGE-TOOLS/src/PACKAGE-TOOLS/*.exe")
-    install(FILES ${QT_EXTRA_EXECUTABLES} DESTINATION ${PKG_STAGE_DIR}/bin)
+  else()
+    set(
+      QT_INSTALL_DIR "${DEPENDENCIES_INSTALL_DIR}")
 
   endif(WIN32)
 
+  if(NOT QT_EXECUTABLES)
+    message(FATAL_ERROR "QT_EXECUTABLES not set")
+  endif()
+
+  list(APPEND QT_REQ_DIRS mkspecs)
+  list(APPEND QT_REQ_DIRS plugins)
+  list(APPEND QT_REQ_DIRS translations)
+  foreach(QT_REQ_DIR ${QT_REQ_DIRS} )
+    if(EXISTS "${QT_INSTALL_DIR}/${QT_REQ_DIR}")
+      func_install_without_message("${QT_INSTALL_DIR}/${QT_REQ_DIR}" "")
+    endif()
+  endforeach()
+
+  # #install ${DEPENDENCIES_INSTALL_DIR}/include directory. Attention to OTB includes
+  file(GLOB ALL_IN_INCLUDE_DIR "${DEPENDENCIES_INSTALL_DIR}/include/*")
+  foreach(INCLUDE_DIR_ITEM ${ALL_IN_INCLUDE_DIR})
+    get_filename_component(INCLUDE_DIR_ITEM_name ${INCLUDE_DIR_ITEM} NAME)
+    get_filename_component(INCLUDE_DIR_ITEM_name_we ${INCLUDE_DIR_ITEM} NAME_WE)
+    if(NOT "${INCLUDE_DIR_ITEM_name_we}" MATCHES "OTB|otb")
+      if( IS_DIRECTORY ${INCLUDE_DIR_ITEM})
+        install(CODE
+          "message(STATUS \"Installing: ${CMAKE_INSTALL_PREFIX}/${PKG_STAGE_DIR}/include/${INCLUDE_DIR_ITEM_name}/\")" )
+        install(
+          DIRECTORY   "${INCLUDE_DIR_ITEM}"
+          DESTINATION "${PKG_STAGE_DIR}/include/"
+          MESSAGE_NEVER
+          )
+      else()
+        install(
+          FILES   "${INCLUDE_DIR_ITEM}"
+          DESTINATION "${PKG_STAGE_DIR}/include/"
+          )
+      endif() #if( IS_DIRECTORY
+    endif() #if (NOT
+  endforeach()
+
 endfunction() #func_install_xdk_files
 
 function(func_install_without_message src_dir dst_dir_suffix)
@@ -239,7 +279,7 @@ function(func_install_without_message src_dir dst_dir_suffix)
     MESSAGE_NEVER )
 endfunction()
 
-function(func_install_support_files include_mvd)
+function(func_install_support_files)
 
   #a convenient cmake var for storing <prefix>/bin
   set(PKG_STAGE_BIN_DIR "${PKG_STAGE_DIR}/bin")
@@ -269,9 +309,10 @@ function(func_install_support_files include_mvd)
   if(NOT PKG_GENERATE_XDK)
     func_install_otb_support_files()
 
-    if(include_mvd)
+    #check if monteverdi executable is built?
+    if(EXISTS "${MONTEVERDI_INSTALL_DIR}/bin/monteverdi${EXE_EXT}")
       func_install_monteverdi_support_files()
-    endif(include_mvd)
+    endif()
 
   endif() #NOT PKG_GENERATE_XDK
 
@@ -483,8 +524,9 @@ function(func_prepare_package)
     set(LIB_EXT "*dylib")
   endif()
 
-  file(WRITE ${CMAKE_BINARY_DIR}/install_to_bin "")
-  file(WRITE ${CMAKE_BINARY_DIR}/install_to_lib "")
+  file(WRITE ${CMAKE_BINARY_DIR}/make_symlinks_temp  "")
+  file(WRITE ${CMAKE_BINARY_DIR}/install_to_bin      "")
+  file(WRITE ${CMAKE_BINARY_DIR}/install_to_lib      "")
 
   #This must exist in any OTB Installation minimal or full
   set(VAR_IN_PKGSETUP_CONFIGURE "bin/otbApplicationLauncherCommandLine")
@@ -498,13 +540,11 @@ function(func_prepare_package)
   list(APPEND EXE_FILES "iceViewer")
   list(APPEND EXE_FILES "otbTestDriver")
 
-  #Q: why we need itkTestDriver?.
-  #A: Because we need to get all dlls from ITK via itkTestDriver linkage.
-  # itkvnl and itkvnl_algo are referenced in its lib/cmake/ITK-4.8/ITKTargets.cmake
-  # But OTB didn't use them and hence not counted. However an erro has been observed when
-  # using XDK on windows that the file is missing or damaged
   if(PKG_GENERATE_XDK)
+    #itk
     list(APPEND EXE_FILES "itkTestDriver")
+    #Qt stuff
+    list(APPEND EXE_FILES ${QT_EXECUTABLES})
   endif()
 
   list(APPEND EXE_FILES "monteverdi")
@@ -540,14 +580,14 @@ function(func_prepare_package)
     set(VAR_IN_PKGSETUP_CONFIGURE "${VAR_IN_PKGSETUP_CONFIGURE} lib/otb/applications/${OTB_APP_SO_NAME}")
   endforeach()
 
-  set(include_mvd 0)
-  if(DEFINED Monteverdi_SOURCE_DIR)
-    set(include_mvd 1)
-  endif()
+  # set(include_mvd 0)
+  # if(DEFINED Monteverdi_SOURCE_DIR)
+  #   set(include_mvd 1)
+  # endif()
 
   list(APPEND PKG_PEFILES ${OTB_APPS_LIST})
 
-  func_install_support_files(${include_mvd})
+  func_install_support_files()
 
   execute_process(COMMAND ${CMAKE_COMMAND} -E remove_directory "${CMAKE_BINARY_DIR}/temp_so_names_dir")
   execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_BINARY_DIR}/temp_so_names_dir")
@@ -630,7 +670,7 @@ function(func_process_deps infile)
                   # NOTE: $OUT_DIR is set actually in pkgsetup.in. So don't try
                   # any pre-mature optimization on that variable names
                   file(APPEND
-                    ${CMAKE_BINARY_DIR}/make_symlinks
+                    ${CMAKE_BINARY_DIR}/make_symlinks_temp
                     "ln -sf $OUT_DIR/lib/${linked_to_file} $OUT_DIR/lib/${basename_of_sofile}\n"
                     )
                   #message("${sofile} is a symlink to ${linked_to_file}")
@@ -785,36 +825,36 @@ function(func_is_file_a_symbolic_link file result_var1 result_var2)
 endfunction()
 
 
-#function to prepare list of install files to bin and lib directory
-#input_file is written by func_process_deps() macro
-#with_xdk is flag to indicate wheather we are build xdk or not.
-#Its value is same as PKG_GENERATE_XDK
-# install_list_variable -output variable that store the final list
-# This list is looped and all install() command are created there.
-function(func_prepare_install_list input_file with_xdk install_list_variable )
-  #message("-- input_file = '${input_file}'")
-  set(install_to_ITEMS)
-  file(STRINGS "${input_file}" install_to_ITEMS)
-  foreach(install_to_ITEM ${install_to_ITEMS})
-    get_filename_component(install_to_ITEM_BASENAME ${install_to_ITEM} NAME_WE)
-    #MUST remove otb applications. Installed in other macro later
-    if ("${install_to_ITEM_BASENAME}" MATCHES "otbapp_*")
-      list(REMOVE_ITEM install_to_ITEMS "${install_to_ITEM}")
+#func_lisp: - A list_process function (func_lisp)
+#This method process the input list inplace.
+#It first remove all entries in the list starting with otbapp_*
+#Then when generating XDK package it also remove
+#the all OTB and Monteverdi binaries are lib.
+#Value of PKG_GENERATE_XDK is set already
+#The final list is use to create install() commands later
+function(func_lisp install_list )
+  foreach(install_list_item ${${install_list}})
+    get_filename_component(install_list_item_NAME_WE ${install_list_item} NAME_WE)
+    #MUST remove otb applications. Installed later in otb_support_files function
+    #message("${install_list_item}")
+    if ("${install_list_item_NAME_WE}" MATCHES "otbapp_*")
+      list(REMOVE_ITEM ${install_list} "${install_list_item}")
     endif()
 
-    if(with_xdk)
-      if ("${install_to_ITEM_BASENAME}"
+    if(PKG_GENERATE_XDK)
+      if ("${install_list_item_NAME_WE}"
           MATCHES
           "libOTB|libotb|otbApp|otbTest|libMonteverdi|monteverdi|mapla|iceViewer"
           )
-        list(REMOVE_ITEM install_to_ITEMS "${install_to_ITEM}")
+        list(REMOVE_ITEM ${install_list} "${install_list_item}")
       endif()
-    endif() #with_xdk
+    endif()
   endforeach()
 
-  set(${install_list_variable} "${install_to_ITEMS}" PARENT_SCOPE)
+#  message(FATAL_ERROR "install_list=${${install_list}}")
+  set(${install_list} "${${install_list}}" PARENT_SCOPE)
 
-endfunction() # func_prepare_install_list
+endfunction() # func_lisp
 
 
 set(WINDOWS_SYSTEM_DLLS