Index: src/wp-admin/includes/class-wp-upgrader.php
===================================================================
--- src/wp-admin/includes/class-wp-upgrader.php	(revision 25309)
+++ src/wp-admin/includes/class-wp-upgrader.php	(working copy)
@@ -1074,6 +1074,7 @@
 		global $wp_filesystem, $wp_version;
 
 		$defaults = array(
+			'to_download' => 'full',
 		);
 		$parsed_args = wp_parse_args( $defaults, $args );
 
@@ -1090,21 +1091,7 @@
 
 		$wp_dir = trailingslashit($wp_filesystem->abspath());
 
-		// 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 )
-			$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 ) )
-			$to_download = 'new_bundled';
-		elseif ( $current->packages->no_content )
-			$to_download = 'no_content';
-		else
-			$to_download = 'full';
-
-		$download = $this->download_package( $current->packages->$to_download );
+		$download = $this->download_package( $update->packages->{$parsed_args['to_download']} );
 		if ( is_wp_error($download) )
 			return $download;
 
Index: src/wp-admin/includes/file.php
===================================================================
--- src/wp-admin/includes/file.php	(revision 25309)
+++ src/wp-admin/includes/file.php	(working copy)
@@ -833,9 +833,10 @@
 function get_filesystem_method($args = array(), $context = false) {
 	$method = defined('FS_METHOD') ? FS_METHOD : false; //Please ensure that this is either 'direct', 'ssh', 'ftpext' or 'ftpsockets'
 
+	if ( ! $context )
+		$context = WP_CONTENT_DIR;
+
 	if ( ! $method && function_exists('getmyuid') && function_exists('fileowner') ){
-		if ( !$context )
-			$context = WP_CONTENT_DIR;
 		$context = trailingslashit($context);
 		$temp_file_name = $context . 'temp-write-test-' . time();
 		$temp_handle = @fopen($temp_file_name, 'w');
@@ -847,6 +848,11 @@
 		}
  	}
 
+	// If group-writable is OK, check that the current file, and the destination( $context ) is writable.
+	// Group-writable is only enabled for Partial Core Upgrades at present due to them only modifying changed files, not creating new files
+	if ( ! $method && !empty( $args['allow_group_writable'] ) && is_writable( $context ) && is_writable( __FILE__ ) )
+		$method = 'direct';
+
 	if ( ! $method && isset($args['connection_type']) && 'ssh' == $args['connection_type'] && extension_loaded('ssh2') && function_exists('stream_get_contents') ) $method = 'ssh2';
 	if ( ! $method && extension_loaded('ftp') ) $method = 'ftpext';
 	if ( ! $method && ( extension_loaded('sockets') || function_exists('fsockopen') ) ) $method = 'ftpsockets'; //Sockets: Socket extension; PHP Mode: FSockopen / fwrite / fread
Index: src/wp-admin/update-core.php
===================================================================
--- src/wp-admin/update-core.php	(revision 25309)
+++ src/wp-admin/update-core.php	(working copy)
@@ -314,6 +314,7 @@
 function do_core_upgrade( $reinstall = false ) {
 	global $wp_filesystem;
 
+	include ABSPATH . WPINC . '/version.php'; // $wp_version
 	include_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
 
 	if ( $reinstall )
@@ -327,10 +328,33 @@
 	$version = isset( $_POST['version'] )? $_POST['version'] : false;
 	$locale = isset( $_POST['locale'] )? $_POST['locale'] : 'en_US';
 	$update = find_core_update( $version, $locale );
-	if ( !$update )
+
+	if ( !$update || !isset( $update->response ) )
 		return;
 
-	if ( ! WP_Filesystem($credentials, ABSPATH) ) {
+	if ( $reinstall )
+		$update->response = 'reinstall';
+
+	if ( $update->response == 'latest' )
+		return;
+
+	// 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 ( $update->packages->partial && ! $reinstall && $wp_version == $update->partial_version )
+		$to_download = 'partial';
+	elseif ( $update->packages->new_bundled && version_compare( $wp_version, $update->new_bundled, '<' )
+		&& ( ! defined( 'CORE_UPGRADE_SKIP_NEW_BUNDLED' ) || ! CORE_UPGRADE_SKIP_NEW_BUNDLED ) )
+		$to_download = 'new_bundled';
+	elseif ( $update->packages->no_content )
+		$to_download = 'no_content';
+	else
+		$to_download = 'full';
+
+	$credentials['allow_group_writable'] = ( 'partial' == $to_download );
+
+	if ( ! WP_Filesystem( $credentials, ABSPATH ) ) {
 		request_filesystem_credentials($url, '', true, ABSPATH); //Failed to connect, Error and request again
 		return;
 	}
@@ -346,13 +370,14 @@
 		return;
 	}
 
-	if ( $reinstall )
-		$update->response = 'reinstall';
+	$args = array(
+		'to_download' => $to_download,
+	);
 
 	add_filter( 'update_feedback', 'show_message' );
 
 	$upgrader = new Core_Upgrader();
-	$result = $upgrader->upgrade( $update );
+	$result = $upgrader->upgrade( $update, $args );
 
 	if ( is_wp_error($result) ) {
 		show_message($result);
