Index: wp-admin/includes/class-wp-upgrader.php
===================================================================
--- wp-admin/includes/class-wp-upgrader.php	(revision 25496)
+++ wp-admin/includes/class-wp-upgrader.php	(working copy)
@@ -1042,11 +1042,19 @@
 
 		$wp_dir = trailingslashit($wp_filesystem->abspath());
 
+		// Pre-cache the checksums for the versions we care about
+		get_core_checksums( array( $wp_version, $current->current ) ); /* TODO for 3.7, change this to $current->version */
+
+		$no_partial = false;
+		apply_filters('update_feedback', __( 'Verifying existing files&#8230;' ) );
+		if ( ! $this->check_files() )
+			$no_partial = true;
+
 		// If partial update is returned from the API, use that, unless we're doing a reinstall.
 		// If we cross the new_bundled version number, then use the new_bundled zip.
 		// Don't though if the constant is set to skip bundled items.
 		// If the API returns a no_content zip, go with it. Finally, default to the full zip.
-		if ( $current->packages->partial && 'reinstall' != $current->response && $wp_version == $current->partial_version )
+		if ( $current->packages->partial && 'reinstall' != $current->response && $wp_version == $current->partial_version && ! $no_partial )
 			$to_download = 'partial';
 		elseif ( $current->packages->new_bundled && version_compare( $wp_version, $current->new_bundled, '<' )
 			&& ( ! defined( 'CORE_UPGRADE_SKIP_NEW_BUNDLED' ) || ! CORE_UPGRADE_SKIP_NEW_BUNDLED ) )
@@ -1065,12 +1073,13 @@
 			return $working_dir;
 
 		// Copy update-core.php from the new version into place.
+		/* // TESTING use existing upgrade-core file
 		if ( !$wp_filesystem->copy($working_dir . '/wordpress/wp-admin/includes/update-core.php', $wp_dir . 'wp-admin/includes/update-core.php', true) ) {
 			$wp_filesystem->delete($working_dir, true);
 			return new WP_Error('copy_failed', $this->strings['copy_failed']);
 		}
 		$wp_filesystem->chmod($wp_dir . 'wp-admin/includes/update-core.php', FS_CHMOD_FILE);
-
+*/
 		require(ABSPATH . 'wp-admin/includes/update-core.php');
 
 		if ( ! function_exists( 'update_core' ) )
@@ -1081,6 +1090,21 @@
 		return $result;
 	}
 
+	function check_files() {
+		global $wp_version;
+
+		$checksums = get_core_checksums( $wp_version );
+var_dump([ __METHOD__, $wp_version ]);
+		if ( empty( $checksums[ $wp_version ] ) || ! is_array( $checksums[ $wp_version ] ) )
+			return false;
+
+		foreach ( $checksums[ $wp_version ] as $file => $checksum ) {
+			if ( md5_file( ABSPATH . $file ) !== $checksum )
+				return false;
+		}
+
+		return true;
+	}
 }
 
 /**
Index: wp-admin/includes/update-core.php
===================================================================
--- wp-admin/includes/update-core.php	(revision 25496)
+++ wp-admin/includes/update-core.php	(working copy)
@@ -683,15 +683,54 @@
 
 	apply_filters('update_feedback', __('Installing the latest version&#8230;'));
 
+	// Check to see which files don't really need updating
+	$skip = array( 'wp-content' );
+	$checksums = get_core_checksums( $wp_version ); /* TODO This function won't exist when upgrading from pre-3.7, which will cause a fatal (This file is included from the new package, and runs with the old versions code) */
+	if ( ! empty( $checksums[ $wp_version ] ) && is_array( $checksums[ $wp_version ] ) ) {
+		apply_filters('update_feedback', __( 'Determining which files need copying&#8230;' ) ); /* TODO language */
+		foreach( $checksums[ $wp_version ] as $file => $checksum ) {
+			if ( md5_file( ABSPATH . $file ) === $checksum )
+				$skip[] = $file;
+		}
+	}
+
+	apply_filters('update_feedback', __( 'Enabling Maintainence Mode&#8230;' ) ); /* TODO language */
+
 	// Create maintenance file to signal that we are upgrading
 	$maintenance_string = '<?php $upgrading = ' . time() . '; ?>';
 	$maintenance_file = $to . '.maintenance';
 	$wp_filesystem->delete($maintenance_file);
 	$wp_filesystem->put_contents($maintenance_file, $maintenance_string, FS_CHMOD_FILE);
 
+	apply_filters('update_feedback', __( 'Copying the required files&#8230;' ) ); /* TODO language */
 	// Copy new versions of WP files into place.
-	$result = _copy_dir($from . $distro, $to, array('wp-content') );
+	$result = _copy_dir($from . $distro, $to, $skip );
 
+	// Check to make sure everything copied correctly
+	$skip = array( 'wp-content' );
+	$failed = array();
+	if ( ! empty( $checksums[ $wp_version ] ) && is_array( $checksums[ $wp_version ] ) ) {
+		foreach( $checksums[ $wp_version ] as $file => $checksum ) {
+			if ( md5_file( ABSPATH . $file ) === $checksum )
+				$skip[] = $file;
+			else
+				$failed[] = $file;
+		}
+	}
+
+	// Some files didn't copy properly
+	if ( ! empty( $failed ) ) {
+		$total_size = 0;
+		foreach ( $failed as $file )
+			$total_size += filesize( $from . '/' . $distro . '/' . $file ); /* TODO This won't work with FTP The $from contains a dynamic name so WP_CONTENT_DIR can't be used directly */
+
+		// If we don't have enough free space, it isn't worth trying again
+		if ( $total_size >= disk_free_space( ABSPATH ) )
+			$result = new WP_Error( 'disk_full', __( "There isn't enough free disk space to complete the upgrade." ), $to );
+		else
+			$result = _copy_dir( $from . $distro, $to, $skip );
+	}
+
 	// Custom Content Directory needs updating now.
 	// Copy Languages
 	if ( !is_wp_error($result) && $wp_filesystem->is_dir($from . $distro . 'wp-content/languages') ) {
@@ -788,11 +827,12 @@
 	else
 		delete_option('update_core');
 
+	apply_filters('update_feedback', __( 'Disabling Maintainence mode&#8230;' ) ); /* TODO language */
 	// Remove maintenance file, we're done.
 	$wp_filesystem->delete($maintenance_file);
 
 	// If we made it this far:
-	do_action( '_core_updated_successfully', $wp_version );
+	//do_action( '_core_updated_successfully', $wp_version );
 
 	return $wp_version;
 }
@@ -801,10 +841,9 @@
  * Copies a directory from one location to another via the WordPress Filesystem Abstraction.
  * Assumes that WP_Filesystem() has already been called and setup.
  *
- * This is a temporary function for the 3.1 -> 3.2 upgrade only and will be removed in 3.3
- *
  * @ignore
  * @since 3.2.0
+ * @since 3.7.0 Updated not to use a regular expression for the skip list
  * @see copy_dir()
  *
  * @param string $from source directory
@@ -820,17 +859,12 @@
 	$from = trailingslashit($from);
 	$to = trailingslashit($to);
 
-	$skip_regex = '';
-	foreach ( (array)$skip_list as $key => $skip_file )
-		$skip_regex .= preg_quote($skip_file, '!') . '|';
+	/* The regex form doesn't like long $skip_list's, nor does it deal well with */
+	$skip_string = implode( ',', $skip_list ) . ',update-core.php'; /* TODO remove hard-coded file */
 
-	if ( !empty($skip_regex) )
-		$skip_regex = '!(' . rtrim($skip_regex, '|') . ')$!i';
-
 	foreach ( (array) $dirlist as $filename => $fileinfo ) {
-		if ( !empty($skip_regex) )
-			if ( preg_match($skip_regex, $from . $filename) )
-				continue;
+	//	if ( $skip_list && false !== stripos( $skip_string, $filename ) ) /* TODO This skip functionality doesn't work either. all sub directories fail to copy, ie. wp-includes IS in 'wp-includes/some/file.php,wp-content/whatever' */
+	//		continue;
 
 		if ( 'f' == $fileinfo['type'] ) {
 			if ( ! $wp_filesystem->copy($from . $filename, $to . $filename, true, FS_CHMOD_FILE) ) {
@@ -883,6 +917,8 @@
 	show_message( '<span class="hide-if-no-js">' . sprintf( __( 'Welcome to WordPress %1$s. You will be redirected to the About WordPress screen. If not, click <a href="%2$s">here</a>.' ), $new_version, 'about.php?updated' ) . '</span>' );
 	show_message( '<span class="hide-if-js">' . sprintf( __( 'Welcome to WordPress %1$s. <a href="%2$s">Learn more</a>.' ), $new_version, 'about.php?updated' ) . '</span>' );
 	echo '</div>';
+	return;
+
 	?>
 <script type="text/javascript">
 window.location = 'about.php?updated';
@@ -893,4 +929,4 @@
 	include(ABSPATH . 'wp-admin/admin-footer.php');
 	exit();
 }
-add_action( '_core_updated_successfully', '_redirect_to_about_wordpress' );
+// add_action( '_core_updated_successfully', '_redirect_to_about_wordpress' ); /* TESTING I want to see the upgrade result! */
Index: wp-admin/includes/update.php
===================================================================
--- wp-admin/includes/update.php	(revision 25496)
+++ wp-admin/includes/update.php	(working copy)
@@ -56,6 +56,70 @@
 	return $result;
 }
 
+/**
+ * Gets and caches the checksums for the given versions of WordPress
+ *
+ * @since 3.7.0
+ *
+ * @param $version string|array A single version, or an array of versions to fetch
+ *
+ * @return bool|array False on failure, otherwise the array of checksums, keyed by version
+ */
+
+
+function get_core_checksums( $version ) {
+	if ( ! is_array( $version ) )
+		$version = array( $version );
+var_dump( $version );
+	$return = array();
+
+	// Check to see if we have cached copies available, if we do, no need to request them
+	foreach ( $version as $i => $v ) {
+		if ( $checksums = get_site_transient( "core_checksums_$v" ) ) {
+			unset( $version[ $i ] );
+			$return[ $v ] = $checksums;
+		}
+	}
+
+	// We had cached copies for all of the versions!
+	if ( empty( $version ) )
+		return $return;
+
+	$url = 'http://api.wordpress.org/core/checksums/1.0/?' . http_build_query( array( 'version' => $version ), null, '&' );
+
+	if ( wp_http_supports( array( 'ssl' ) ) )
+		$url = set_url_scheme( $url, 'https' );
+
+	$options = array(
+		'timeout' => ( ( defined('DOING_CRON') && DOING_CRON ) ? 30 : 3 ),
+	);
+
+	$response = wp_remote_get( $url, $options );
+
+	if ( is_wp_error( $response ) || 200 != wp_remote_retrieve_response_code( $response ) )
+		return false;
+
+	$body = trim( wp_remote_retrieve_body( $response ) );
+	$body = json_decode( $body, true );
+
+	if ( ! is_array( $body ) || ! isset( $body['checksums'] ) || ! is_array( $body['checksums'] ) )
+		return false;
+
+	// Cache the checksums for later
+	foreach ( $version as $v ) {
+		set_site_transient( "core_checksums_$v", $body['checksums'][ $v ], HOUR_IN_SECONDS );
+		$return[ $v ] = $body['checksums'][ $v ];
+	}
+
+	// If the API didn't return anything for a version, explicitly set it's return value to false
+	foreach ( $return as $v => $r ) {
+		if ( empty( $r ) )
+			$return[ $v ] = false;
+	}
+
+	return $return;
+}
+
 function dismiss_core_update( $update ) {
 	$dismissed = get_site_option( 'dismissed_update_core' );
 	$dismissed[ $update->current.'|'.$update->locale ] = true;
