diff --git a/SystemInformation.cxx b/SystemInformation.cxx
index 635612361bb3d0733610d0630ccdffaa0add2a19..9bc659e22a68a3f1eda6c3c94a0e202b1517fd40 100644
--- a/SystemInformation.cxx
+++ b/SystemInformation.cxx
@@ -264,6 +264,10 @@ protected:
   //For Haiku OS
   bool QueryHaikuInfo();
 
+  //For QNX
+  bool QueryQNXMemory();
+  bool QueryQNXProcessor();
+
   // Evaluate the memory information.
   int QueryMemory();
   size_t TotalVirtualMemory;
@@ -597,6 +601,8 @@ void SystemInformationImplementation::RunCPUCheck()
   this->QuerySolarisInfo();
 #elif defined(__HAIKU__)
   this->QueryHaikuInfo();
+#elif defined(__QNX__)
+  this->QueryQNXProcessor();
 #else
   this->RetreiveInformationFromCpuInfoFile();
 #endif
@@ -615,6 +621,8 @@ void SystemInformationImplementation::RunMemoryCheck()
   this->QuerySolarisInfo();
 #elif defined(__HAIKU__)
   this->QueryHaikuInfo();
+#elif defined(__QNX__)
+  this->QueryQNXMemory();
 #else
   this->QueryMemory();
 #endif
@@ -3264,6 +3272,89 @@ bool SystemInformationImplementation::QueryHaikuInfo()
 #endif
 }
 
+bool SystemInformationImplementation::QueryQNXMemory()
+{
+#if defined(__QNX__)
+  kwsys_stl::string buffer;
+  kwsys_stl::vector<const char*> args;
+  args.clear();
+
+  args.push_back("showmem");
+  args.push_back("-S");
+  args.push_back(0);
+  buffer = this->RunProcess(args);
+  args.clear();
+
+  size_t pos = buffer.find("System RAM:");
+  if (pos == buffer.npos)
+    return false;
+  pos = buffer.find(":", pos);
+  size_t pos2 = buffer.find("M (", pos);
+  if (pos2 == buffer.npos)
+    return false;
+
+  pos++;
+  while (buffer[pos] == ' ')
+    pos++;
+
+  this->TotalPhysicalMemory = atoi(buffer.substr(pos, pos2 - pos).c_str());
+  return true;
+#endif
+  return false;
+}
+
+bool SystemInformationImplementation::QueryQNXProcessor()
+{
+#if defined(__QNX__)
+  // the output on my QNX 6.4.1 looks like this:
+  // Processor1: 686 Pentium II Stepping 3 2175MHz FPU
+  kwsys_stl::string buffer;
+  kwsys_stl::vector<const char*> args;
+  args.clear();
+
+  args.push_back("pidin");
+  args.push_back("info");
+  args.push_back(0);
+  buffer = this->RunProcess(args);
+  args.clear();
+
+  size_t pos = buffer.find("Processor1:");
+  if (pos == buffer.npos)
+    return false;
+
+  size_t pos2 = buffer.find("MHz", pos);
+  if (pos2 == buffer.npos)
+    return false;
+
+  size_t pos3 = pos2;
+  while (buffer[pos3] != ' ')
+    --pos3;
+
+  this->CPUSpeedInMHz = atoi(buffer.substr(pos3 + 1, pos2 - pos3 - 1).c_str());
+
+  pos2 = buffer.find(" Stepping", pos);
+  if (pos2 != buffer.npos)
+    {
+    pos2 = buffer.find(" ", pos2 + 1);
+    if (pos2 != buffer.npos && pos2 < pos3)
+      {
+      this->ChipID.Revision = atoi(buffer.substr(pos2 + 1, pos3 - pos2).c_str());
+      }
+    }
+
+  this->NumberOfPhysicalCPU = 0;
+  do
+    {
+    pos = buffer.find("\nProcessor", pos + 1);
+    ++this->NumberOfPhysicalCPU;
+    } while (pos != buffer.npos);
+  this->NumberOfLogicalCPU = 1;
+
+  return true;
+#else
+  return false;
+#endif
+}
 
 /** Query the operating system information */
 bool SystemInformationImplementation::QueryOSInformation()