Index: wp-includes/functions.php
===================================================================
--- wp-includes/functions.php	(revision 4626)
+++ wp-includes/functions.php	(working copy)
@@ -1094,6 +1094,126 @@
 	return compact('ext', 'type');
 }
 
+function wp_generate_attachment_metadata( $attachment_id, $file ) {
+	$attachment = get_post( $attachment_id );
+
+	$metadata = array();
+	if ( preg_match('!^image/!', get_post_mime_type( $attachment )) ) {
+		$imagesize = getimagesize($file);
+		$metadata['width'] = $imagesize['0'];
+		$metadata['height'] = $imagesize['1'];
+		list($uwidth, $uheight) = get_udims($metadata['width'], $metadata['height']);
+		$metadata['hwstring_small'] = "height='$uheight' width='$uwidth'";
+		$metadata['file'] = $file;
+
+		if ( $metadata['width'] * $metadata['height'] < 3 * 1024 * 1024 ) {
+			if ( $metadata['width'] > 128 && $metadata['width'] >= $metadata['height'] * 4 / 3 )
+				$thumb = wp_create_thumbnail($file, 128);
+			elseif ( $metadata['height'] > 96 )
+				$thumb = wp_create_thumbnail($file, 96);
+
+			if ( @file_exists($thumb) )
+				$metadata['thumb'] = basename($thumb);
+		}
+	}
+	return apply_filters( 'wp_generate_attachment_metadata', $metadata );
+}
+
+function wp_create_thumbnail( $file, $max_side, $effect = '' ) {
+
+		// 1 = GIF, 2 = JPEG, 3 = PNG
+
+	if ( file_exists( $file ) ) {
+		$type = getimagesize( $file );
+
+		// if the associated function doesn't exist - then it's not
+		// handle. duh. i hope.
+
+		if (!function_exists( 'imagegif' ) && $type[2] == 1 ) {
+			$error = __( 'Filetype not supported. Thumbnail not created.' );
+		}
+		elseif (!function_exists( 'imagejpeg' ) && $type[2] == 2 ) {
+			$error = __( 'Filetype not supported. Thumbnail not created.' );
+		}
+		elseif (!function_exists( 'imagepng' ) && $type[2] == 3 ) {
+			$error = __( 'Filetype not supported. Thumbnail not created.' );
+		} else {
+
+			// create the initial copy from the original file
+			if ( $type[2] == 1 ) {
+				$image = imagecreatefromgif( $file );
+			}
+			elseif ( $type[2] == 2 ) {
+				$image = imagecreatefromjpeg( $file );
+			}
+			elseif ( $type[2] == 3 ) {
+				$image = imagecreatefrompng( $file );
+			}
+
+			if ( function_exists( 'imageantialias' ))
+				imageantialias( $image, TRUE );
+
+			$image_attr = getimagesize( $file );
+
+			// figure out the longest side
+
+			if ( $image_attr[0] > $image_attr[1] ) {
+				$image_width = $image_attr[0];
+				$image_height = $image_attr[1];
+				$image_new_width = $max_side;
+
+				$image_ratio = $image_width / $image_new_width;
+				$image_new_height = $image_height / $image_ratio;
+				//width is > height
+			} else {
+				$image_width = $image_attr[0];
+				$image_height = $image_attr[1];
+				$image_new_height = $max_side;
+
+				$image_ratio = $image_height / $image_new_height;
+				$image_new_width = $image_width / $image_ratio;
+				//height > width
+			}
+
+			$thumbnail = imagecreatetruecolor( $image_new_width, $image_new_height);
+			@ imagecopyresampled( $thumbnail, $image, 0, 0, 0, 0, $image_new_width, $image_new_height, $image_attr[0], $image_attr[1] );
+
+			// If no filters change the filename, we'll do a default transformation.
+			if ( basename( $file ) == $thumb = apply_filters( 'thumbnail_filename', basename( $file ) ) )
+				$thumb = preg_replace( '!(\.[^.]+)?$!', __( '.thumbnail' ).'$1', basename( $file ), 1 );
+
+			$thumbpath = str_replace( basename( $file ), $thumb, $file );
+
+			// move the thumbnail to it's final destination
+			if ( $type[2] == 1 ) {
+				if (!imagegif( $thumbnail, $thumbpath ) ) {
+					$error = __( "Thumbnail path invalid" );
+				}
+			}
+			elseif ( $type[2] == 2 ) {
+				if (!imagejpeg( $thumbnail, $thumbpath ) ) {
+					$error = __( "Thumbnail path invalid" );
+				}
+			}
+			elseif ( $type[2] == 3 ) {
+				if (!imagepng( $thumbnail, $thumbpath ) ) {
+					$error = __( "Thumbnail path invalid" );
+				}
+			}
+
+		}
+	} else {
+		$error = __( 'File not found' );
+	}
+
+	if (!empty ( $error ) ) {
+		return $error;
+	} else {
+		apply_filters( 'wp_create_thumbnail', $thumbpath );
+		return $thumbpath;
+	}
+}
+
 function wp_explain_nonce($action) {
 	if ( $action !== -1 && preg_match('/([a-z]+)-([a-z]+)(_(.+))?/', $action, $matches) ) {
 		$verb = $matches[1];
Index: xmlrpc.php
===================================================================
--- xmlrpc.php	(revision 4626)
+++ xmlrpc.php	(working copy)
@@ -872,7 +872,7 @@
 		);
 		// Save the data
 		$id = wp_insert_attachment( $attachment, $upload[ 'file' ], $post_id );
-		wp_update_attachment_metadata( $id, array() );
+		wp_update_attachment_metadata( $id, wp_generate_attachment_metadata( $id, $upload['file'] ) );
 
 		return apply_filters( 'wp_handle_upload', array( 'file' => $upload[ 'file' ], 'url' => $upload[ 'url' ], 'type' => $type ) );
 	}
Index: wp-admin/admin-functions.php
===================================================================
--- wp-admin/admin-functions.php	(revision 4626)
+++ wp-admin/admin-functions.php	(working copy)
@@ -854,101 +854,6 @@
 	}
 }
 
-function wp_create_thumbnail( $file, $max_side, $effect = '' ) {
-
-		// 1 = GIF, 2 = JPEG, 3 = PNG
-
-	if ( file_exists( $file ) ) {
-		$type = getimagesize( $file );
-
-		// if the associated function doesn't exist - then it's not
-		// handle. duh. i hope.
-
-		if (!function_exists( 'imagegif' ) && $type[2] == 1 ) {
-			$error = __( 'Filetype not supported. Thumbnail not created.' );
-		}
-		elseif (!function_exists( 'imagejpeg' ) && $type[2] == 2 ) {
-			$error = __( 'Filetype not supported. Thumbnail not created.' );
-		}
-		elseif (!function_exists( 'imagepng' ) && $type[2] == 3 ) {
-			$error = __( 'Filetype not supported. Thumbnail not created.' );
-		} else {
-
-			// create the initial copy from the original file
-			if ( $type[2] == 1 ) {
-				$image = imagecreatefromgif( $file );
-			}
-			elseif ( $type[2] == 2 ) {
-				$image = imagecreatefromjpeg( $file );
-			}
-			elseif ( $type[2] == 3 ) {
-				$image = imagecreatefrompng( $file );
-			}
-
-			if ( function_exists( 'imageantialias' ))
-				imageantialias( $image, TRUE );
-
-			$image_attr = getimagesize( $file );
-
-			// figure out the longest side
-
-			if ( $image_attr[0] > $image_attr[1] ) {
-				$image_width = $image_attr[0];
-				$image_height = $image_attr[1];
-				$image_new_width = $max_side;
-
-				$image_ratio = $image_width / $image_new_width;
-				$image_new_height = $image_height / $image_ratio;
-				//width is > height
-			} else {
-				$image_width = $image_attr[0];
-				$image_height = $image_attr[1];
-				$image_new_height = $max_side;
-
-				$image_ratio = $image_height / $image_new_height;
-				$image_new_width = $image_width / $image_ratio;
-				//height > width
-			}
-
-			$thumbnail = imagecreatetruecolor( $image_new_width, $image_new_height);
-			@ imagecopyresampled( $thumbnail, $image, 0, 0, 0, 0, $image_new_width, $image_new_height, $image_attr[0], $image_attr[1] );
-
-			// If no filters change the filename, we'll do a default transformation.
-			if ( basename( $file ) == $thumb = apply_filters( 'thumbnail_filename', basename( $file ) ) )
-				$thumb = preg_replace( '!(\.[^.]+)?$!', __( '.thumbnail' ).'$1', basename( $file ), 1 );
-
-			$thumbpath = str_replace( basename( $file ), $thumb, $file );
-
-			// move the thumbnail to it's final destination
-			if ( $type[2] == 1 ) {
-				if (!imagegif( $thumbnail, $thumbpath ) ) {
-					$error = __( "Thumbnail path invalid" );
-				}
-			}
-			elseif ( $type[2] == 2 ) {
-				if (!imagejpeg( $thumbnail, $thumbpath ) ) {
-					$error = __( "Thumbnail path invalid" );
-				}
-			}
-			elseif ( $type[2] == 3 ) {
-				if (!imagepng( $thumbnail, $thumbpath ) ) {
-					$error = __( "Thumbnail path invalid" );
-				}
-			}
-
-		}
-	} else {
-		$error = __( 'File not found' );
-	}
-
-	if (!empty ( $error ) ) {
-		return $error;
-	} else {
-		apply_filters( 'wp_create_thumbnail', $thumbpath );
-		return $thumbpath;
-	}
-}
-
 // Some postmeta stuff
 function has_meta( $postid ) {
 	global $wpdb;
Index: wp-admin/upload-functions.php
===================================================================
--- wp-admin/upload-functions.php	(revision 4626)
+++ wp-admin/upload-functions.php	(working copy)
@@ -220,35 +220,8 @@
 		// Save the data
 		$id = wp_insert_attachment($attachment, $file, $post_id);
 
-		if ( preg_match('!^image/!', $attachment['post_mime_type']) ) {
-			// Generate the attachment's postmeta.
-			$imagesize = getimagesize($file);
-			$imagedata['width'] = $imagesize['0'];
-			$imagedata['height'] = $imagesize['1'];
-			list($uwidth, $uheight) = get_udims($imagedata['width'], $imagedata['height']);
-			$imagedata['hwstring_small'] = "height='$uheight' width='$uwidth'";
-			$imagedata['file'] = $file;
+		wp_update_attachment_metadata( $id, wp_generate_attachment_metadata( $id, $file ) );
 
-			wp_update_attachment_metadata( $id, $imagedata );
-
-			if ( $imagedata['width'] * $imagedata['height'] < 3 * 1024 * 1024 ) {
-				if ( $imagedata['width'] > 128 && $imagedata['width'] >= $imagedata['height'] * 4 / 3 )
-					$thumb = wp_create_thumbnail($file, 128);
-				elseif ( $imagedata['height'] > 96 )
-					$thumb = wp_create_thumbnail($file, 96);
-
-				if ( @file_exists($thumb) ) {
-					$newdata = $imagedata;
-					$newdata['thumb'] = basename($thumb);
-					wp_update_attachment_metadata( $id, $newdata );
-				} else {
-					$error = $thumb;
-				}
-			}
-		} else {
-			wp_update_attachment_metadata( $id, array() );
-		}
-
 		wp_redirect( get_option('siteurl') . "/wp-admin/upload.php?style=$style&tab=browse&action=view&ID=$id&post_id=$post_id");
 		die;
 		break;
