Index: tests/phpunit/tests/image/editor_gd.php
===================================================================
--- tests/phpunit/tests/image/editor_gd.php	(revision 30745)
+++ tests/phpunit/tests/image/editor_gd.php	(working copy)
@@ -499,4 +499,28 @@
 
 		unlink( $save_to_file );
 	}
+
+	/**
+	 *
+	 * @ticket 30596
+	 */
+	public function test_image_preserves_alpha_on_rotate() {
+		$file = DIR_TESTDATA . '/images/transparent.png';
+
+		$image = imagecreatefrompng( $file );
+		$rgb = imagecolorat( $image, 0, 0 );
+		$expected = imagecolorsforindex( $image, $rgb );
+
+		$editor = new WP_Image_Editor_GD( $file );
+                $this->assertNotInstanceOf( 'WP_Error', $editor );
+                $editor->load();
+                $editor->rotate( 180 );
+                $save_to_file = tempnam( get_temp_dir(), '' ) . '.png';
+
+                $editor->save( $save_to_file );
+
+                $this->assertImageAlphaAtPointGD( $save_to_file, array( 0,0 ), $expected['alpha'] );
+                unlink( $save_to_file );
+
+	}
 }
Index: tests/phpunit/tests/image/editor_imagick.php
===================================================================
--- tests/phpunit/tests/image/editor_imagick.php	(revision 30745)
+++ tests/phpunit/tests/image/editor_imagick.php	(working copy)
@@ -507,4 +507,28 @@
 
 		unlink( $save_to_file );
 	}
+
+	/**
+	 *
+	 * @ticket 30596
+	 */
+	public function test_image_peserves_alpha_on_rotate() {
+		$file = DIR_TESTDATA . '/images/transparent.png';
+
+		$pre_rotate_editor = new Imagick( $file );
+		$pre_rotate_pixel = $pre_rotate_editor->getImagePixelColor( 0, 0 );
+		$pre_rotate_alpha = $pre_rotate_pixel->getColorValue( imagick::COLOR_ALPHA );
+		$save_to_file = tempnam( get_temp_dir(),'' ) . '.png';
+		$pre_rotate_editor->writeImage( $save_to_file );
+		$pre_rotate_editor->destroy();
+
+		$image_editor = new WP_Image_Editor_Imagick( $save_to_file );
+		$image_editor->load();
+		$this->assertNotInstanceOf( 'WP_Error', $image_editor );
+		$image_editor->rotate( 180 );
+		$image_editor->save( $save_to_file );
+
+		$this->assertImageAlphaAtPointImagick( $save_to_file, array( 0, 0 ), $pre_rotate_alpha );
+		unlink( $save_to_file );
+	}
 }
Index: src/wp-includes/class-wp-image-editor-gd.php
===================================================================
--- src/wp-includes/class-wp-image-editor-gd.php	(revision 30745)
+++ src/wp-includes/class-wp-image-editor-gd.php	(working copy)
@@ -306,9 +306,12 @@
 	 */
 	public function rotate( $angle ) {
 		if ( function_exists('imagerotate') ) {
-			$rotated = imagerotate( $this->image, $angle, 0 );
+			$transparency = imagecolorallocatealpha( $this->image, 255, 255, 255, 127 );
+			$rotated = imagerotate( $this->image, $angle, $transparency );
 
 			if ( is_resource( $rotated ) ) {
+				imagealphablending( $rotated, true );
+				imagesavealpha( $rotated, true );
 				imagedestroy( $this->image );
 				$this->image = $rotated;
 				$this->update_size();
