Index: src/wp-admin/includes/class-wp-upgrader.php
===================================================================
--- src/wp-admin/includes/class-wp-upgrader.php	(revision 39362)
+++ src/wp-admin/includes/class-wp-upgrader.php	(working copy)
@@ -397,7 +397,7 @@
 	/**
 	 * Install a package.
 	 *
-	 * Copies the contents of a package form a source directory, and installs them in
+	 * Copies the contents of a package from a source directory, and installs them in
 	 * a destination directory. Optionally removes the source. It can also optionally
 	 * clear out the destination folder if it already exists.
 	 *
@@ -415,8 +415,10 @@
 	 *                                               Default empty.
 	 *     @type bool   $clear_destination           Whether to delete any files already in the destination
 	 *                                               folder. Default false.
-	 *     @type bool   $clear_working               Whether to delete the files form the working directory
+	 *     @type bool   $clear_working               Whether to delete the files from the working directory
 	 *                                               after copying to the destination. Default false.
+	 *     @type bool   $protect_destination         Whether to protect against deleting any files already
+	 *                                               in the destination folder. Default false.
 	 *     @type bool   $abort_if_destination_exists Whether to abort the installation if
 	 *                                               the destination folder already exists. Default true.
 	 *     @type array  $hook_extra                  Extra arguments to pass to the filter hooks called by
@@ -433,6 +435,7 @@
 			'destination' => '', // and this
 			'clear_destination' => false,
 			'clear_working' => false,
+			'protect_destination' => false,
 			'abort_if_destination_exists' => true,
 			'hook_extra' => array()
 		);
@@ -520,7 +523,7 @@
 			$protected_directories = array_merge( $protected_directories, $wp_theme_directories );
 		}
 
-		if ( in_array( $destination, $protected_directories ) ) {
+		if ( in_array( $destination, $protected_directories ) || $args['protect_destination'] ) {
 			$remote_destination = trailingslashit( $remote_destination ) . trailingslashit( basename( $source ) );
 			$destination = trailingslashit( $destination ) . trailingslashit( basename( $source ) );
 		}
@@ -621,9 +624,11 @@
 	 *                                               Default empty.
 	 *     @type bool   $clear_destination           Whether to delete any files already in the
 	 *                                               destination folder. Default false.
-	 *     @type bool   $clear_working               Whether to delete the files form the working
+	 *     @type bool   $clear_working               Whether to delete the files from the working
 	 *                                               directory after copying to the destination.
 	 *                                               Default false.
+	 *     @type bool   $protect_destination         Whether to protect against deleting any files already
+	 *                                               in the destination folder. Default false.
 	 *     @type bool   $abort_if_destination_exists Whether to abort the installation if the destination
 	 *                                               folder already exists. When true, `$clear_destination`
 	 *                                               should be false. Default true.
@@ -643,8 +648,9 @@
 			'package' => '', // Please always pass this.
 			'destination' => '', // And this
 			'clear_destination' => false,
+			'clear_working' => true,
+			'protect_destination' => false,
 			'abort_if_destination_exists' => true, // Abort if the Destination directory exists, Pass clear_destination as false please
-			'clear_working' => true,
 			'is_multi' => false,
 			'hook_extra' => array() // Pass any extra $hook_extra args here, this will be passed to any hooked filters.
 		);
@@ -665,6 +671,7 @@
 		 *     @type string $destination                 Update location.
 		 *     @type bool   $clear_destination           Clear the destination resource.
 		 *     @type bool   $clear_working               Clear the working resource.
+		 *     @type bool   $protect_destination         Protect the destination resource.
 		 *     @type bool   $abort_if_destination_exists Abort if the Destination directory exists.
 		 *     @type bool   $is_multi                    Whether the upgrader is running multiple times.
 		 *     @type array  $hook_extra {
@@ -740,8 +747,9 @@
 			'source' => $working_dir,
 			'destination' => $options['destination'],
 			'clear_destination' => $options['clear_destination'],
+			'clear_working' => $options['clear_working'],
+			'protect_destination' => $options['protect_destination'],
 			'abort_if_destination_exists' => $options['abort_if_destination_exists'],
-			'clear_working' => $options['clear_working'],
 			'hook_extra' => $options['hook_extra']
 		) );
 
