diff --git a/SystemTools.hxx.in b/SystemTools.hxx.in
index 88fc5b9ca93de9af11dcc02fd8d68911f789f3a9..5bf87ca6c83ebacf7d5ec51b66e5dd48dce53f5a 100644
--- a/SystemTools.hxx.in
+++ b/SystemTools.hxx.in
@@ -22,7 +22,26 @@
 #include <@KWSYS_NAMESPACE@/Configure.h>
 
 #include <sys/types.h>
+
+// Required for va_list
 #include <stdarg.h>
+#ifndef va_list
+// Some compilers move va_list into the std:: namespace and there is no way to
+// tell that this has been done. Playing with things being included before or
+// after stdarg.h does not solve things because we do not have control over
+// what the user does. This hack solves this problem by moving va_list to our
+// own namespace that is local for kwsys.
+namespace std {} // Required for platforms that do not have std:: 
+namespace @KWSYS_NAMESPACE@_VA_LIST
+{
+  using namespace std;
+  typedef va_list hack_va_list;
+}
+namespace @KWSYS_NAMESPACE@
+{
+  typedef @KWSYS_NAMESPACE@_VA_LIST::hack_va_list va_list;
+}
+#endif // va_list
 
 #if defined( _MSC_VER )
 typedef unsigned short mode_t;