diff --git includes/filetransfer/filetransfer.inc includes/filetransfer/filetransfer.inc
index 1afaa9e..73cb2cd 100644
--- includes/filetransfer/filetransfer.inc
+++ includes/filetransfer/filetransfer.inc
@@ -208,7 +208,7 @@ abstract class FileTransfer {
       $destination = $destination . '/' . basename($source);
     }
     $this->createDirectory($destination);
-    foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($source), RecursiveIteratorIterator::SELF_FIRST) as $filename => $file) {
+    foreach ($this->getDirectoryIterator($source) as $filename => $file) {
       $relative_path = substr($filename, strlen($source));
       if ($file->isDir()) {
         $this->createDirectory($destination . $relative_path);
@@ -220,6 +220,34 @@ abstract class FileTransfer {
   }
 
   /**
+   * Creates a local directory iterator.
+   *
+   * @param $directory
+   *   The local path to a directory.
+   * @param $self_first
+   *   The mode of operation for the RecursiveIteratorIterator.  If TRUE, the
+   *   iterator will return parent directories before listing their contents,
+   *   making it useful for operations like recursively copying directories.
+   *   If FALSE, the iterator will list contents of directories before the
+   *   the parent directory, making it useful for recursively deleting
+   *   directories.
+   *
+   * @return
+   *   A recursive iterator for all files and subdirectories of the given
+   *   local $directory.  The special '.' and '..' directories are skipped.
+   */
+  function getDirectoryIterator($directory, $self_first = TRUE) {
+    // SkipDotsIterator is a custom class which skips '.' and '..' directories.
+    // @see SkipDotsIterator
+    return new SkipDotsIterator(
+      new RecursiveIteratorIterator(
+        new RecursiveDirectoryIterator($directory),
+        $self_first ? RecursiveIteratorIterator::SELF_FIRST : RecursiveIteratorIterator::CHILD_FIRST
+      )
+    );
+  }
+
+  /**
    * Creates a directory.
    *
    * @param $directory
@@ -345,3 +373,18 @@ interface FileTransferChmodInterface {
    */
   function chmodJailed($path, $mode, $recursive);
 }
+
+/**
+ * An implementation of FilterIterator which skips '.' and '..' directories.
+ *
+ * @todo Depreciate in favor of RecursiveDirectoryIterator::SKIP_DOTS once PHP
+ *   5.3 or later is required.
+ */
+class SkipDotsIterator extends FilterIterator {
+  function __construct(Iterator $iterator) {
+    parent::__construct($iterator);
+  }
+  function accept() {
+    return !$this->getInnerIterator()->isDot();
+  }
+}
diff --git includes/filetransfer/local.inc includes/filetransfer/local.inc
index 8cad200..e7739a9 100644
--- includes/filetransfer/local.inc
+++ includes/filetransfer/local.inc
@@ -31,7 +31,7 @@ class FileTransferLocal extends FileTransfer implements FileTransferChmodInterfa
       // Programmer error assertion, not something we expect users to see.
       throw new FileTransferException('removeDirectoryJailed() called with a path (%directory) that is not a directory.', NULL, array('%directory' => $directory));
     }
-    foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory), RecursiveIteratorIterator::CHILD_FIRST) as $filename => $file) {
+    foreach ($this->getDirectoryIterator($directory, FALSE) as $filename => $file) {
       if ($file->isDir()) {
         if (@!drupal_rmdir($filename)) {
           throw new FileTransferException('Cannot remove directory %directory.', NULL, array('%directory' => $filename));
@@ -64,7 +64,7 @@ class FileTransferLocal extends FileTransfer implements FileTransferChmodInterfa
 
   public function chmodJailed($path, $mode, $recursive) {
     if ($recursive && is_dir($path)) {
-      foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::SELF_FIRST) as $filename => $file) {
+      foreach ($this->getDirectoryIterator($path) as $filename => $file) {
         if (@!chmod($filename, $mode)) {
           throw new FileTransferException('Cannot chmod %path.', NULL, array('%path' => $filename));
         }
