diff --git a/SystemTools.cxx b/SystemTools.cxx
index e443d26e79356ed86694d9413f30c2858a14882e..6e2ccbe3b0adff4e1d708f2b7c6f5ee6e7c335f9 100644
--- a/SystemTools.cxx
+++ b/SystemTools.cxx
@@ -1611,7 +1611,8 @@ kwsys_stl::string SystemTools::ConvertToWindowsOutputPath(const char* path)
 }
 
 bool SystemTools::CopyFileIfDifferent(const char* source,
-                                      const char* destination)
+                                      const char* destination,
+                                      bool copyPermissions)
 {
   // special check for a destination that is a directory
   // FilesDiffer does not handle file to directory compare
@@ -1624,7 +1625,8 @@ bool SystemTools::CopyFileIfDifferent(const char* source,
     new_destination += SystemTools::GetFilenameName(source_name);
     if(SystemTools::FilesDiffer(source, new_destination.c_str()))
       {
-      return SystemTools::CopyFileAlways(source, destination);
+      return SystemTools::CopyFileAlways(source, destination,
+                                         copyPermissions);
       }
     else
       {
@@ -1637,7 +1639,7 @@ bool SystemTools::CopyFileIfDifferent(const char* source,
   // are different
   if(SystemTools::FilesDiffer(source, destination))
     {
-    return SystemTools::CopyFileAlways(source, destination);
+    return SystemTools::CopyFileAlways(source, destination, copyPermissions);
     }
   // at this point the files must be the same so return true
   return true;
@@ -1718,10 +1720,12 @@ bool SystemTools::FilesDiffer(const char* source,
 }
 
 
+//----------------------------------------------------------------------------
 /**
  * Copy a file named by "source" to the file named by "destination".
  */
-bool SystemTools::CopyFileAlways(const char* source, const char* destination)
+bool SystemTools::CopyFileAlways(const char* source, const char* destination,
+                                 bool copyPermissions)
 {
   // If files are the same do not copy
   if ( SystemTools::SameFile(source, destination) )
@@ -1824,7 +1828,7 @@ bool SystemTools::CopyFileAlways(const char* source, const char* destination)
     {
    return false;
     }
-  if ( perms )
+  if ( copyPermissions && perms )
     {
     if ( !SystemTools::SetPermissions(destination, perm) )
       {
@@ -1836,15 +1840,15 @@ bool SystemTools::CopyFileAlways(const char* source, const char* destination)
 
 //----------------------------------------------------------------------------
 bool SystemTools::CopyAFile(const char* source, const char* destination,
-                            bool always)
+                            bool always, bool copyPermissions)
 {
   if(always)
     {
-    return SystemTools::CopyFileAlways(source, destination);
+    return SystemTools::CopyFileAlways(source, destination, copyPermissions);
     }
   else
     {
-    return SystemTools::CopyFileIfDifferent(source, destination);
+    return SystemTools::CopyFileIfDifferent(source, destination, copyPermissions);
     }
 }
 
@@ -1853,7 +1857,7 @@ bool SystemTools::CopyAFile(const char* source, const char* destination,
  * "destination".
  */
 bool SystemTools::CopyADirectory(const char* source, const char* destination,
-                                 bool always)
+                                 bool always, bool copyPermissions)
 {
   Directory dir;
   dir.Load(source);
@@ -1877,14 +1881,16 @@ bool SystemTools::CopyADirectory(const char* source, const char* destination,
         fullDestPath += dir.GetFile(static_cast<unsigned long>(fileNum));
         if (!SystemTools::CopyADirectory(fullPath.c_str(),
                                          fullDestPath.c_str(),
-                                         always))
+                                         always,
+                                         copyPermissions))
           {
           return false;
           }
         }
       else
         {
-        if(!SystemTools::CopyAFile(fullPath.c_str(), destination, always))
+        if(!SystemTools::CopyAFile(fullPath.c_str(), destination, always,
+                                   copyPermissions))
           {
           return false;
           }
diff --git a/SystemTools.hxx.in b/SystemTools.hxx.in
index 825c272d0ed0479f185300317b2747e66c22b289..487050c54ea5264b9517b8afd811695a095b9d4a 100644
--- a/SystemTools.hxx.in
+++ b/SystemTools.hxx.in
@@ -490,33 +490,42 @@ public:
 
   /**
    * Copy the source file to the destination file only
-   * if the two files differ.  
+   * if the two files differ. If the "copyPermissions"
+   * argument is true, the permissions of the copy are
+   * set to be the same as the permissions of the
+   * original.
    */
   static bool CopyFileIfDifferent(const char* source,
-                                  const char* destination);
-  
+                                  const char* destination,
+                                  bool copyPermissions = true);
+
   /**
    * Compare the contents of two files.  Return true if different
    */
   static bool FilesDiffer(const char* source, const char* destination);
-  
+
   /**
    * Return true if the two files are the same file
    */
   static bool SameFile(const char* file1, const char* file2);
 
   /**
-   * Copy a file
+   * Copy a file. If the "copyPermissions" argument is true, the
+   * permissions of the copy are set to be the same as the permissions
+   * of the original.
    */
-  static bool CopyFileAlways(const char* source, const char* destination);
+  static bool CopyFileAlways(const char* source, const char* destination,
+                             bool copyPermissions = true);
 
   /**
    * Copy a file.  If the "always" argument is true the file is always
    * copied.  If it is false, the file is copied only if it is new or
-   * has changed.
+   * has changed. If the "copyPermissions" argument is true, the
+   * permissions of the copy are set to be the same as the permissions
+   * of the original.
    */
   static bool CopyAFile(const char* source, const char* destination,
-                        bool always = true);
+                        bool always = true, bool copyPermissions = true);
 
   /**
    * Copy content directory to another directory with all files and
@@ -525,7 +534,7 @@ public:
    * are new are copied.
    */
   static bool CopyADirectory(const char* source, const char* destination,
-                             bool always = true);
+                             bool always = true, bool copyPermissions = true);
   
   /**
    * Remove a file
diff --git a/kwsysDateStamp.cmake b/kwsysDateStamp.cmake
index 694daa5b24780f3103b64612b96e0d4b12ac75e8..731b848067f19e25057347e45ff64b385a2bb292 100644
--- a/kwsysDateStamp.cmake
+++ b/kwsysDateStamp.cmake
@@ -7,4 +7,4 @@ SET(KWSYS_DATE_STAMP_YEAR  2008)
 SET(KWSYS_DATE_STAMP_MONTH 12)
 
 # KWSys version date day component.  Format is DD.
-SET(KWSYS_DATE_STAMP_DAY   14)
+SET(KWSYS_DATE_STAMP_DAY   18)