diff --git a/CMake/FindEXPAT.cmake b/CMake/FindEXPAT.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..3c04b4cb732e0a44e21033ae2e102551316c73c9
--- /dev/null
+++ b/CMake/FindEXPAT.cmake
@@ -0,0 +1,38 @@
+# - Find expat
+# Find the native EXPAT headers and libraries.
+#
+#  EXPAT_INCLUDE_DIRS - where to find expat.h, etc.
+#  EXPAT_LIBRARIES    - List of libraries when using expat.
+#  EXPAT_FOUND        - True if expat found.
+
+#=============================================================================
+# Copyright 2006-2009 Kitware, Inc.
+#
+# Distributed under the OSI-approved BSD License (the "License");
+# see accompanying file Copyright.txt for details.
+#
+# This software is distributed WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the License for more information.
+#=============================================================================
+# (To distribute this file outside of CMake, substitute the full
+#  License text for the above reference.)
+
+# Look for the header file.
+FIND_PATH(EXPAT_INCLUDE_DIR NAMES expat.h)
+
+# Look for the library.
+FIND_LIBRARY(EXPAT_LIBRARY NAMES expat libexpat)
+
+# handle the QUIETLY and REQUIRED arguments and set EXPAT_FOUND to TRUE if 
+# all listed variables are TRUE
+INCLUDE(FindPackageHandleStandardArgs)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(EXPAT DEFAULT_MSG EXPAT_LIBRARY EXPAT_INCLUDE_DIR)
+
+# Copy the results to the output variables.
+IF(EXPAT_FOUND)
+  SET(EXPAT_LIBRARIES ${EXPAT_LIBRARY})
+  SET(EXPAT_INCLUDE_DIRS ${EXPAT_INCLUDE_DIR})
+ENDIF(EXPAT_FOUND)
+
+MARK_AS_ADVANCED(EXPAT_INCLUDE_DIR EXPAT_LIBRARY)
diff --git a/CMake/ImportExpat.cmake b/CMake/ImportExpat.cmake
index e9bfc6b484f3fac3ca564ecf7e32701c0500cb2c..d440443e85a26e8f2b2d73ab490c3789d5cf36e0 100644
--- a/CMake/ImportExpat.cmake
+++ b/CMake/ImportExpat.cmake
@@ -1,36 +1,33 @@
-MESSAGE(STATUS "Importing Expat...")
+MESSAGE(STATUS "Importing EXPAT...")
+
 FIND_PACKAGE(EXPAT)
+
+# Initialize option with what's found on the system
 IF(EXPAT_FOUND)
   OPTION(OTB_USE_EXTERNAL_EXPAT "Use an outside build of EXPAT." ON)
 ELSE(EXPAT_FOUND)
   OPTION(OTB_USE_EXTERNAL_EXPAT "Use an outside build of EXPAT." OFF)
 ENDIF(EXPAT_FOUND)
-
 MARK_AS_ADVANCED(OTB_USE_EXTERNAL_EXPAT)
 
+# Setup
 IF(OTB_USE_EXTERNAL_EXPAT)
-    FIND_PACKAGE(EXPAT)
-
-    IF (NOT EXPAT_FOUND)
-		FIND_PATH(EXPAT_INCLUDE_DIR NAMES expat.h PATHS ${OSGEO4W_INCLUDE})
-		FIND_LIBRARY(EXPAT_LIBRARY NAMES expat libexpat PATHS ${OSGEO4W_LIB})
-	ENDIF(NOT EXPAT_FOUND)
-	
-    IF(NOT EXPAT_INCLUDE_DIR OR NOT EXPAT_LIBRARY)
-        MESSAGE(FATAL_ERROR
-                  "Cannot build OTB project without lib EXPAT.  Please set EXPAT_DIR or set OTB_USE_EXTERNAL_EXPAT OFF to use INTERNAL EXPAT set on OTB/Utilities repository.")
-    ENDIF(NOT EXPAT_INCLUDE_DIR OR NOT EXPAT_LIBRARY)
-    
-    MESSAGE(STATUS "  Using Expat external version")
-    MESSAGE(STATUS "  Expat includes : ${EXPAT_INCLUDE_DIR}")
-    MESSAGE(STATUS "  Expat library  : ${EXPAT_LIBRARY}")
+    IF(EXPAT_FOUND)
+      MESSAGE(STATUS "Using EXPAT external version")
+    ELSE(EXPAT_FOUND)
+      # Generate an error if no external EXPAT is available
+      MESSAGE(FATAL_ERROR "EXPAT required but not found. "
+                          "Turn OTB_USE_EXTERNAL_EXPAT to OFF to use the internal version.")
+    ENDIF(EXPAT_FOUND)
 ELSE(OTB_USE_EXTERNAL_EXPAT)
+    MESSAGE(STATUS "Using EXPAT internal version")
+    
+    SET(EXPAT_LIBRARIES otbexpat)
     ADD_DEFINITIONS(-DOTB_USE_INTERNAL_EXPAT)
-    INCLUDE_DIRECTORIES(BEFORE "${OTB_SOURCE_DIR}/Utilities/otbexpat")
-    INCLUDE_DIRECTORIES(BEFORE "${OTB_BINARY_DIR}/Utilities/otbexpat")
     IF(NOT BUILD_SHARED_LIBS)
       ADD_DEFINITIONS(-DXML_STATIC)
     ENDIF(NOT BUILD_SHARED_LIBS)
-    
-    MESSAGE(STATUS "  Using Expat internal version")
+    INCLUDE_DIRECTORIES(BEFORE "${OTB_SOURCE_DIR}/Utilities/otbexpat")
+    INCLUDE_DIRECTORIES(BEFORE "${OTB_BINARY_DIR}/Utilities/otbexpat")
 ENDIF(OTB_USE_EXTERNAL_EXPAT)
+