diff --git a/SystemTools.cxx b/SystemTools.cxx
index b6737115b6810f08caba78175a8d222708985ac0..b73d319a12c4cd60dd07b5c457934424193692aa 100644
--- a/SystemTools.cxx
+++ b/SystemTools.cxx
@@ -1016,6 +1016,29 @@ bool SystemTools::CopyFileAlways(const char* source, const char* destination)
   return true;
 }
 
+// return size of file; also returns zero if no file exists
+unsigned long SystemTools::FileLength(const char* filename)
+{
+  struct stat fs;
+  if (stat(filename, &fs) != 0) 
+    {
+      return 0;
+    }
+  else
+    {
+      return fs.st_size;
+    }
+}
+
+int SystemTools::Strucmp(const char *s1, const char *s2)
+{
+#ifdef _WIN32
+  return _stricmp(s1,s2);
+#else
+  return strcasecmp(s1,s2);
+#endif
+}
+
 // return true if the file exists
 long int SystemTools::ModifiedTime(const char* filename)
 {
@@ -1042,6 +1065,45 @@ bool SystemTools::RemoveFile(const char* source)
   return unlink(source) != 0 ? false : true;
 }
 
+char *SystemTools
+::RealPath(const char *path, char *resolved_path)
+{
+#if defined(_WIN32)
+  char pathpart[itk::IOCommon::ITK_MAXPATHLEN];
+  strcpy(pathpart,path);
+  char fnamepart[itk::IOCommon::ITK_MAXPATHLEN];
+  char *slash;
+
+  if((slash = strrchr(pathpart,'/')) == NULL)
+    {
+      slash = strrchr(pathpart,'\\');
+    }
+
+  if(slash == NULL) // no path part, so just use current dir.
+    {
+      Getcwd(pathpart,sizeof(pathpart));
+      strcpy(fnamepart,path);
+    } 
+  else // change directory to path part, getcwd to find OS resolved path
+    {
+      *slash = '\0';
+      strcpy(fnamepart,slash+1);
+
+      char savedir[itk::IOCommon::ITK_MAXPATHLEN];
+      Getcwd(savedir,sizeof(savedir));
+      Chdir(pathpart);
+      Getcwd(pathpart,sizeof(pathpart));
+      Chdir(savedir);
+    }
+  strcpy(resolved_path,pathpart);
+  strcat(resolved_path,"/");
+  strcat(resolved_path,fnamepart);
+  return resolved_path;
+#else
+  return realpath(path,resolved_path);
+#endif
+}
+
 /**
  * Find the file the given name.  Searches the given path and then
  * the system search path.  Returns the full path to the file if it is
diff --git a/SystemTools.hxx.in b/SystemTools.hxx.in
index 8cf3396c7c103c8469a08adce9b1b35fd2a1f4cd..2f9a618d946ccae9131738f8ea6eff5c8b5cf382 100644
--- a/SystemTools.hxx.in
+++ b/SystemTools.hxx.in
@@ -100,6 +100,11 @@ public:
    */
   static kwsys_std::string UpperCase(const kwsys_std::string&);
   
+  /**
+   * do a case-independent string comparison
+   */
+  static int Strucmp(const char *s1, const char *s2);
+
   /**
    * Replace Windows file system slashes with Unix-style slashes.
    */
@@ -123,6 +128,12 @@ public:
   /** Return true if a file exists in the current directory.  */
   static bool FileExists(const char* filename);
   
+  static unsigned long FileLength(const char *filename);
+  /**
+   * given a (possibly) relative path, return the completely
+   * qualified path to a file system entity
+   */
+  static char *RealPath(const char *path, char *resolved_path);
   /**
    *  Add the paths from the environment variable PATH to the 
    *  string vector passed in.