Index: src/wp-admin/includes/image-edit.php
===================================================================
--- src/wp-admin/includes/image-edit.php	(revision 28442)
+++ src/wp-admin/includes/image-edit.php	(working copy)
@@ -32,6 +32,8 @@
 			$note = "<div class='updated'><p>$msg->msg</p></div>";
 	}
 
+	$edit_custom_sizes = apply_filters('edit_custom_thumbnail_sizes', false);
+
 	?>
 	<div class="imgedit-wrap">
 	<div id="imgedit-panel-<?php echo $post_id; ?>">
@@ -138,6 +140,17 @@
 		<label class="imgedit-label">
 		<input type="radio" name="imgedit-target-<?php echo $post_id; ?>" value="nothumb" />
 		<?php _e('All sizes except thumbnail'); ?></label>
+
+		<?php if($edit_custom_sizes) : ?>
+			<?php foreach(array_unique($edit_custom_sizes) as $label => $size) : ?>
+				<?php if(array_key_exists($size, $meta['sizes'])) : ?>
+					<label class="imgedit-label">
+					<input type="radio" name="imgedit-target-<?php echo $post_id; ?>" value="<?php _e($size); ?>" />
+					<?php _e($label); ?></label>
+				<?php endif; ?>
+			<?php endforeach; ?>
+		<?php endif; ?>
+
 	</p>
 	</div>
 
@@ -745,10 +758,14 @@
 		$meta['width'] = $size['width'];
 		$meta['height'] = $size['height'];
 
-		if ( $success && ('nothumb' == $target || 'all' == $target) ) {
+		if ( $success ) {
 			$sizes = get_intermediate_image_sizes();
-			if ( 'nothumb' == $target )
-				$sizes = array_diff( $sizes, array('thumbnail') );
+			if ( 'nothumb' == $target || 'all' == $target ) {
+				if ( 'nothumb' == $target )
+					$sizes = array_diff( $sizes, array('thumbnail') );
+			} elseif ( 'thumbnail' !== $target ) {
+				$sizes = array_diff( $sizes, array($target) );
+			}
 		}
 
 		$return->fw = $meta['width'];
@@ -756,6 +773,10 @@
 	} elseif ( 'thumbnail' == $target ) {
 		$sizes = array( 'thumbnail' );
 		$success = $delete = $nocrop = true;
+	} else {
+		$sizes = array( $target );
+		$success = $delete = true;
+		$nocrop = $_wp_additional_image_sizes[ $size ]['crop'];
 	}
 
 	if ( isset( $sizes ) ) {
