Index: wp-admin/includes/file.php
===================================================================
--- wp-admin/includes/file.php	(revision 17285)
+++ wp-admin/includes/file.php	(working copy)
@@ -773,10 +773,10 @@
 
 	foreach ( (array) $dirlist as $filename => $fileinfo ) {
 		if ( 'f' == $fileinfo['type'] ) {
-			if ( ! $wp_filesystem->copy($from . $filename, $to . $filename, true) ) {
+			if ( ! $wp_filesystem->copy($from . $filename, $to . $filename, true, FS_CHMOD_FILE) ) {
 				// If copy failed, chmod file to 0644 and try again.
 				$wp_filesystem->chmod($to . $filename, 0644);
-				if ( ! $wp_filesystem->copy($from . $filename, $to . $filename, true) )
+				if ( ! $wp_filesystem->copy($from . $filename, $to . $filename, true, FS_CHMOD_FILE) )
 					return new WP_Error('copy_failed', __('Could not copy file.'), $to . $filename);
 			}
 			$wp_filesystem->chmod($to . $filename, FS_CHMOD_FILE);
Index: wp-admin/includes/class-wp-filesystem-ftpsockets.php
===================================================================
--- wp-admin/includes/class-wp-filesystem-ftpsockets.php	(revision 17285)
+++ wp-admin/includes/class-wp-filesystem-ftpsockets.php	(working copy)
@@ -193,7 +193,7 @@
 		return $dir[$file]['group'];
 	}
 
-	function copy($source, $destination, $overwrite = false ) {
+	function copy($source, $destination, $overwrite = false, $mode = false) {
 		if ( ! $overwrite && $this->exists($destination) )
 			return false;
 
@@ -201,17 +201,17 @@
 		if ( false === $content )
 			return false;
 
-		return $this->put_contents($destination, $content);
+		return $this->put_contents($destination, $content, $mode);
 	}
 
 	function move($source, $destination, $overwrite = false ) {
 		return $this->ftp->rename($source, $destination);
 	}
 
-	function delete($file, $recursive = false ) {
+	function delete($file, $recursive = false, $type = false) {
 		if ( empty($file) )
 			return false;
-		if ( $this->is_file($file) )
+		if ( 'f' == $type || $this->is_file($file) )
 			return $this->ftp->delete($file);
 		if ( !$recursive )
 			return $this->ftp->rmdir($file);
Index: wp-admin/includes/class-wp-filesystem-direct.php
===================================================================
--- wp-admin/includes/class-wp-filesystem-direct.php	(revision 17285)
+++ wp-admin/includes/class-wp-filesystem-direct.php	(working copy)
@@ -193,7 +193,7 @@
 		return $grouparray['name'];
 	}
 
-	function copy($source, $destination, $overwrite = false) {
+	function copy($source, $destination, $overwrite = false, $mode = false) {
 		if ( ! $overwrite && $this->exists($destination) )
 			return false;
 
@@ -216,12 +216,12 @@
 		}
 	}
 
-	function delete($file, $recursive = false) {
+	function delete($file, $recursive = false, $type = false) {
 		if ( empty($file) ) //Some filesystems report this as /, which can cause non-expected recursive deletion of all files in the filesystem.
 			return false;
 		$file = str_replace('\\', '/', $file); //for win32, occasional problems deleteing files otherwise
 
-		if ( $this->is_file($file) )
+		if ( 'f' == $type || $this->is_file($file) )
 			return @unlink($file);
 		if ( ! $recursive && $this->is_dir($file) )
 			return @rmdir($file);
@@ -233,7 +233,7 @@
 		$retval = true;
 		if ( is_array($filelist) ) //false if no files, So check first.
 			foreach ($filelist as $filename => $fileinfo)
-				if ( ! $this->delete($file . $filename, $recursive) )
+				if ( ! $this->delete($file . $filename, $recursive, $fileinfo['type']) )
 					$retval = false;
 
 		if ( file_exists($file) && ! @rmdir($file) )
Index: wp-admin/includes/class-wp-filesystem-ftpext.php
===================================================================
--- wp-admin/includes/class-wp-filesystem-ftpext.php	(revision 17285)
+++ wp-admin/includes/class-wp-filesystem-ftpext.php	(working copy)
@@ -183,22 +183,22 @@
 		$dir = $this->dirlist($file);
 		return $dir[$file]['group'];
 	}
-	function copy($source, $destination, $overwrite = false ) {
+	function copy($source, $destination, $overwrite = false, $mode = false) {
 		if ( ! $overwrite && $this->exists($destination) )
 			return false;
 		$content = $this->get_contents($source);
 		if ( false === $content)
 			return false;
-		return $this->put_contents($destination, $content);
+		return $this->put_contents($destination, $content, $mode);
 	}
 	function move($source, $destination, $overwrite = false) {
 		return ftp_rename($this->link, $source, $destination);
 	}
 
-	function delete($file, $recursive = false ) {
+	function delete($file, $recursive = false, $type = false) {
 		if ( empty($file) )
 			return false;
-		if ( $this->is_file($file) )
+		if ( 'f' == $type || $this->is_file($file) )
 			return @ftp_delete($this->link, $file);
 		if ( !$recursive )
 			return @ftp_rmdir($this->link, $file);
@@ -206,7 +206,7 @@
 		$filelist = $this->dirlist( trailingslashit($file) );
 		if ( !empty($filelist) )
 			foreach ( $filelist as $delete_file )
-				$this->delete( trailingslashit($file) . $delete_file['name'], $recursive);
+				$this->delete( trailingslashit($file) . $delete_file['name'], $recursive, $delete_file['type'] );
 		return @ftp_rmdir($this->link, $file);
 	}
 
Index: wp-admin/includes/class-wp-filesystem-ssh2.php
===================================================================
--- wp-admin/includes/class-wp-filesystem-ssh2.php	(revision 17285)
+++ wp-admin/includes/class-wp-filesystem-ssh2.php	(working copy)
@@ -238,28 +238,28 @@
 		return $grouparray['name'];
 	}
 
-	function copy($source, $destination, $overwrite = false ) {
+	function copy($source, $destination, $overwrite = false, $mode = false) {
 		if ( ! $overwrite && $this->exists($destination) )
 			return false;
 		$content = $this->get_contents($source);
 		if ( false === $content)
 			return false;
-		return $this->put_contents($destination, $content);
+		return $this->put_contents($destination, $content, $mode);
 	}
 
 	function move($source, $destination, $overwrite = false) {
 		return @ssh2_sftp_rename($this->link, $source, $destination);
 	}
 
-	function delete($file, $recursive = false) {
-		if ( $this->is_file($file) )
+	function delete($file, $recursive = false, $type = false) {
+		if ( 'f' == $type || $this->is_file($file) )
 			return ssh2_sftp_unlink($this->sftp_link, $file);
 		if ( ! $recursive )
 			 return ssh2_sftp_rmdir($this->sftp_link, $file);
 		$filelist = $this->dirlist($file);
 		if ( is_array($filelist) ) {
 			foreach ( $filelist as $filename => $fileinfo) {
-				$this->delete($file . '/' . $filename, $recursive);
+				$this->delete($file . '/' . $filename, $recursive, $fileinfo['type']);
 			}
 		}
 		return ssh2_sftp_rmdir($this->sftp_link, $file);
