diff --git a/bootstrap b/bootstrap
index 993c7767383ce767578e5aa2ec882e67e44f2742..9afc7331d4290c0fee0257a9b483dbcdd6a15a3d 100755
--- a/bootstrap
+++ b/bootstrap
@@ -1,5 +1,22 @@
 #!/bin/sh
 
+#=========================================================================
+#
+#  Program:   CMake - Cross-Platform Makefile Generator
+#  Module:    $RCSfile$
+#  Language:  Bourne Shell
+#  Date:      $Date$
+#  Version:   $Revision$
+#
+#  Copyright (c) 2002 Kitware, Inc., Insight Consortium.  All rights reserved.
+#  See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details.
+#
+#     This software is distributed WITHOUT ANY WARRANTY; without even 
+#     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+#     PURPOSE.  See the above copyright notices for more information.
+#
+#=========================================================================
+
 CMAKE_KNOWN_C_COMPILERS="cc gcc xlc icc tcc"
 CMAKE_KNOWN_CXX_COMPILERS="CC g++ c++ xlC icc como aCC"
 CMAKE_KNOWN_MAKE_PROCESSORS="make gmake"
@@ -82,6 +99,27 @@ cmake_error()
   exit 1
 }
 
+# Replace KWSYS_NAMESPACE with cmsys
+cmake_replace_string ()
+{
+  INFILE="$1"
+  OUTFILE="$2"
+  SEARCHFOR="$3"
+  REPLACEWITH="$4"
+  if [ -f "${INFILE}" ]; then
+    cat "${INFILE}" | 
+      sed "s/\@${SEARCHFOR}\@/${REPLACEWITH}/g" > "${OUTFILE}.tmp"
+    if [ -f "${OUTFILE}.tmp" ]; then
+      if diff "${OUTFILE}" "${OUTFILE}.tmp" > /dev/null 2> /dev/null ; then
+        #echo "Files are the same"
+        rm -f "${OUTFILE}.tmp"
+      else
+        mv -f "${OUTFILE}.tmp" "${OUTFILE}"
+      fi
+    fi
+  fi
+}
+
 # Write string into a file
 cmake_report ()
 {
@@ -215,7 +253,6 @@ cd "${cmake_bootstrap_dir}"
 
 # Delete all the bootstrap files
 rm -f "${cmake_bootstrap_dir}/cmake_bootstrap.log"
-rm -f "${cmake_bootstrap_dir}/cmConfigure.h"
 
 # If exist compiler flags, set them
 cmake_c_flags=${CFLAGS}
@@ -349,21 +386,38 @@ EOF
   rm -f "${TMPFILE}.cxx"
 fi
 
+# Just to be safe, let us store compiler and flags to the header file
+
+cmake_report cmConfigure.h.tmp "/*"
+cmake_report cmConfigure.h.tmp " * Generated by ${cmake_source_dir}/bootstrap"
+cmake_report cmConfigure.h.tmp " * Binary directory: ${cmake_bootstrap_dir}"
+cmake_report cmConfigure.h.tmp " * C compiler:   ${cmake_c_compiler}"
+cmake_report cmConfigure.h.tmp " * C flags:      ${cmake_c_flags}"
+cmake_report cmConfigure.h.tmp " *"
+cmake_report cmConfigure.h.tmp " * C++ compiler: ${cmake_cxx_compiler}"
+cmake_report cmConfigure.h.tmp " * C++ flags:    ${cmake_cxx_flags}"
+cmake_report cmConfigure.h.tmp " *"
+cmake_report cmConfigure.h.tmp " * Make:         ${cmake_make_processor}"
+cmake_report cmConfigure.h.tmp " *"
+cmake_report cmConfigure.h.tmp " * Sources:"
+cmake_report cmConfigure.h.tmp " * ${CMAKE_SOURCES}"
+cmake_report cmConfigure.h.tmp " */"
+
 # Test for STD namespace
 if cmake_try_run "${cmake_cxx_compiler}" "${cmake_cxx_flags}" "${cmake_source_dir}/Modules/TestForSTDNamespace.cxx" >> cmake_bootstrap.log 2>&1; then
-  cmake_report cmConfigure.h "/* #undef CMAKE_NO_STD_NAMESPACE */"
+  cmake_report cmConfigure.h.tmp "/* #undef CMAKE_NO_STD_NAMESPACE */"
   echo "${cmake_cxx_compiler} has STD namespace"
 else
-  cmake_report cmConfigure.h "#define CMAKE_NO_STD_NAMESPACE 1"
+  cmake_report cmConfigure.h.tmp "#define CMAKE_NO_STD_NAMESPACE 1"
   echo "${cmake_cxx_compiler} does not have STD namespace"
 fi
 
 # Test for ANSI stream headers
 if cmake_try_run "${cmake_cxx_compiler}" "${cmake_cxx_flags}" "${cmake_source_dir}/Modules/TestForANSIStreamHeaders.cxx" >> cmake_bootstrap.log 2>&1; then
-  cmake_report cmConfigure.h "/* #undef CMAKE_NO_ANSI_STREAM_HEADERS */"
+  cmake_report cmConfigure.h.tmp "/* #undef CMAKE_NO_ANSI_STREAM_HEADERS */"
   echo "${cmake_cxx_compiler} has ANSI stream headers"
 else
-  cmake_report cmConfigure.h "#define CMAKE_NO_ANSI_STREAM_HEADERS 1"
+  cmake_report cmConfigure.h.tmp "#define CMAKE_NO_ANSI_STREAM_HEADERS 1"
   echo "${cmake_cxx_compiler} does not have ANSI stream headers"
 fi
 
@@ -374,30 +428,37 @@ cat>${TMPFILE}.cxx<<EOF
 int main() { return 0;}
 EOF
 if cmake_try_run "${cmake_cxx_compiler}" "${cmake_cxx_flags}" "${TMPFILE}.cxx" >> cmake_bootstrap.log 2>&1; then
-  cmake_report cmConfigure.h "/* #undef CMAKE_NO_ANSI_STRING_STREAM */"
+  cmake_report cmConfigure.h.tmp "/* #undef CMAKE_NO_ANSI_STRING_STREAM */"
   echo "${cmake_cxx_compiler} has ANSI string streams"
 else
-  cmake_report cmConfigure.h "#define CMAKE_NO_ANSI_STRING_STREAM 1"
+  cmake_report cmConfigure.h.tmp "#define CMAKE_NO_ANSI_STRING_STREAM 1"
   echo "${cmake_cxx_compiler} does not have ANSI string streams"
 fi
 rm -f "${TMPFILE}.cxx"
 
 # Test for ansi FOR scope
 if cmake_try_run "${cmake_cxx_compiler}" "${cmake_cxx_flags}" "${cmake_source_dir}/Modules/TestForAnsiForScope.cxx" >> cmake_bootstrap.log 2>&1; then
-  cmake_report cmConfigure.h "/* #undef CMAKE_NO_ANSI_FOR_SCOPE */"
+  cmake_report cmConfigure.h.tmp "/* #undef CMAKE_NO_ANSI_FOR_SCOPE */"
   echo "${cmake_cxx_compiler} has ANSI for scoping"
 else
-  cmake_report cmConfigure.h "#define CMAKE_NO_ANSI_FOR_SCOPE 1"
+  cmake_report cmConfigure.h.tmp "#define CMAKE_NO_ANSI_FOR_SCOPE 1"
   echo "${cmake_cxx_compiler} does not have ANSI for scoping"
 fi
 
 # Write CMake version
 for a in MAJOR MINOR PATCH; do
   CMake_VERSION=`cat "${cmake_source_dir}/CMakeLists.txt" | grep "SET(CMake_VERSION_${a} *[0-9]*)" | sed "s/SET(CMake_VERSION_${a} *\([0-9]*\))/\1/"`
-  cmake_report cmConfigure.h "#define CMake_VERSION_${a} ${CMake_VERSION}"
+  cmake_report cmConfigure.h.tmp "#define CMake_VERSION_${a} ${CMake_VERSION}"
 done
-cmake_report cmConfigure.h "#define CMAKE_ROOT_DIR \"${cmake_source_dir}\""
-cmake_report cmConfigure.h "#define CMAKE_BOOTSTRAP"
+cmake_report cmConfigure.h.tmp "#define CMAKE_ROOT_DIR \"${cmake_source_dir}\""
+cmake_report cmConfigure.h.tmp "#define CMAKE_BOOTSTRAP"
+
+# Regenerate real cmConfigure.h
+if diff cmConfigure.h cmConfigure.h.tmp > /dev/null 2> /dev/null; then
+  rm -f cmConfigure.h.tmp
+else
+  mv -f cmConfigure.h.tmp cmConfigure.h
+fi
 
 # Generate Makefile
 dep="cmConfigure.h `cmake_escape \"${cmake_source_dir}\"`/Source/*.h"
@@ -405,7 +466,16 @@ objs=""
 for a in ${CMAKE_SOURCES}; do
   objs="${objs} ${a}.o"
 done
-cmake_cxx_flags="${cmake_ansi_cxx_flags} ${cmake_cxx_flags} -I`cmake_escape \"${cmake_source_dir}/Source\"` -I`cmake_escape \"${cmake_bootstrap_dir}\"`"
+
+if [ "x${cmake_ansi_cxx_flags}" != "x" ]; then
+  cmake_cxx_flags="${cmake_ansi_cxx_flags} ${cmake_cxx_flags}"
+fi
+
+if [ "x${cmake_cxx_flags}" != "x" ]; then
+  cmake_cxx_flags="${cmake_cxx_flags} "
+fi
+
+cmake_cxx_flags="${cmake_cxx_flags}-I`cmake_escape \"${cmake_source_dir}/Source\"` -I`cmake_escape \"${cmake_bootstrap_dir}\"`"
 echo "cmake: ${objs}" > "${cmake_bootstrap_dir}/Makefile"
 echo "	${cmake_cxx_compiler} ${LDFLAGS} ${cmake_cxx_flags} ${objs} -o cmake" >> "${cmake_bootstrap_dir}/Makefile"
 for a in ${CMAKE_SOURCES}; do
@@ -446,4 +516,4 @@ export MAKE
 echo "---------------------------------------------"
 
 # And we are done. Now just run make
-echo "CMake ${CMAKE_VERSION} is configured. Now just run ${cmake_make_processor}."
+echo "CMake is configured. Now just run ${cmake_make_processor}."