Index: src/wp-includes/js/media-views.js
===================================================================
--- src/wp-includes/js/media-views.js	(revision 27522)
+++ src/wp-includes/js/media-views.js	(working copy)
@@ -3475,7 +3475,13 @@
 		className: 'uploader-editor',
 		template:  media.template( 'uploader-editor' ),
 
+		localDrag: false,
+		overContainer: false,
+		overDropzone: false,
+
 		initialize: function() {
+			var self = this;
+
 			this.initialized = false;
 
 			// Bail if UA does not support drag'n'drop or File API.
@@ -3490,10 +3496,19 @@
 			this.$document.on( 'drop', '.uploader-editor', _.bind( this.drop, this ) );
 			this.$document.on( 'dragover', '.uploader-editor', _.bind( this.dropzoneDragover, this ) );
 			this.$document.on( 'dragleave', '.uploader-editor', _.bind( this.dropzoneDragleave, this ) );
+			this.$document.on( 'click', '.uploader-editor', _.bind( this.click, this ) );
 
 			this.$document.on( 'dragover', _.bind( this.containerDragover, this ) );
 			this.$document.on( 'dragleave', _.bind( this.containerDragleave, this ) );
 
+			this.$document.on( 'dragstart', function() {
+				self.localDrag = true;
+			});
+
+			this.$document.on( 'dragend drop', function() {
+				self.localDrag = false;
+			});
+
 			this.initialized = true;
 			return this;
 		},
@@ -3541,13 +3556,13 @@
 		drop: function( event ) {
 			var $wrap = null;
 
+			this.containerDragleave( event );
+			this.dropzoneDragleave( event );
+
 			this.files = event.originalEvent.dataTransfer.files;
 			if ( this.files.length < 1 )
 				return;
 
-			this.containerDragleave( event );
-			this.dropzoneDragleave( event );
-
 			// Set the active editor to the drop target.
 			$wrap = $( event.target ).parents( '.wp-editor-wrap' );
 			if ( $wrap.length > 0 ) {
@@ -3580,6 +3595,10 @@
 		},
 
 		containerDragover: function() {
+			if ( this.localDrag ) {
+				return;
+			}
+
 			this.overContainer = true;
 			this.refresh();
 		},
@@ -3592,6 +3611,10 @@
 		},
 
 		dropzoneDragover: function( e ) {
+			if ( this.localDrag ) {
+				return;
+			}
+
 			this.overDropzone = true;
 			this.refresh( e );
 			return false;
@@ -3600,6 +3623,12 @@
 		dropzoneDragleave: function( e ) {
 			this.overDropzone = false;
 			_.delay( _.bind( this.refresh, this, e ), 50 );
+		},
+
+		click: function( e ) {
+			// In the rare case where the dropzone gets stuck, hide it on click.
+			this.containerDragleave( e );
+			this.dropzoneDragleave( e );
 		}
 	});
 
Index: src/wp-includes/js/tinymce/plugins/wordpress/plugin.js
===================================================================
--- src/wp-includes/js/tinymce/plugins/wordpress/plugin.js	(revision 27522)
+++ src/wp-includes/js/tinymce/plugins/wordpress/plugin.js	(working copy)
@@ -379,7 +379,7 @@
 			});
 		}
 
-		dom.bind( doc, 'dragover', function( event ) {
+		dom.bind( doc, 'dragstart dragend dragover drop', function( event ) {
 			if ( typeof window.jQuery !== 'undefined' ) {
 				// Propagate the event to its container for the parent window to catch.
 				window.jQuery( editor.getContainer() ).trigger( event );
