diff --git wp-admin/css/wp-admin.dev.css wp-admin/css/wp-admin.dev.css
index 3b9dca7..c675425 100644
--- wp-admin/css/wp-admin.dev.css
+++ wp-admin/css/wp-admin.dev.css
@@ -3724,7 +3724,8 @@ abbr.required {
 }
 
 .media-item .describe input[type="text"],
-.media-item .describe textarea {
+.media-item .describe textarea,
+.media-item .wp-editor-wrap {
 	width: 460px;
 }
 
@@ -3906,10 +3907,6 @@ abbr.required {
 	border-radius: 3px;
 }
 
-.media-item .post_excerpt textarea {
-    height: 60px;
-}
-
 /*------------------------------------------------------------------------------
   14.1 - Media Library
 ------------------------------------------------------------------------------*/
diff --git wp-admin/includes/media.php wp-admin/includes/media.php
index 0ae2f10..9b35a8e 100644
--- wp-admin/includes/media.php
+++ wp-admin/includes/media.php
@@ -788,25 +788,38 @@ function image_link_input_fields($post, $url_type = '') {
 ";
 }
 
+/**
+ * Render an editor for image caption
+ *
+ * @see `get_attachment_fields_to_edit()`
+ * @since 3.4
+ *
+ * @param Object $edit_post, media item object
+ * @return String, the generated html
+ */
 function wp_caption_input_textarea($edit_post) {
 	// post data is already escaped
 	$name = "attachments[{$edit_post->ID}][post_excerpt]";
-
-	return '
-	<textarea class="code" name="' . $name . '" id="' . $name . '">' . $edit_post->post_excerpt . '</textarea>
-	<div class="edit-caption-controls hide-if-no-js">
-	<input type="button" class="button caption-insert-link" value="' . esc_attr__('Insert Link') . '" />
-	<div class="caption-insert-link-wrap hidden">
-	<label><span>' . __('Link URL') . '</span>
-	<input type="text" value="" class="caption-insert-link-url" /></label>
-	<label><span>' . __('Linked text') . '</span>
-	<input type="text" value="" class="caption-insert-link-text" /></label>
-	<div class="caption-insert-link-buttons">
-	<input type="button" class="button caption-cancel" value="' . esc_attr__('Cancel') . '" />
-	<input type="button" class="button-primary caption-save" value="' . esc_attr__('Insert') . '" />
-	<br class="clear" />
-	</div></div></div>
-	';
+	$defaults = array( 
+		'teeny' => true,
+		'tinymce' => false,
+		'media_buttons' => false,
+		'textarea_rows' => 10,
+		'quicktags' => array(
+			'buttons' => 'strong,em,link,del,ins,code,close'
+		)
+	); 
+	$settings = apply_filters( 'caption_input_textarea', $defaults, $edit_post );
+
+	// Do not load wpLink if tinymce is not present
+	// Just plain Quicktags link handler
+	if ( !$settings['tinymce'] )
+		wp_deregister_script('wplink');
+
+	// Use a buffer to get the output, otherway it will just echo everything
+	ob_start();
+	wp_editor( $edit_post->post_excerpt, $name, $settings );
+	return ob_get_clean();
 }
 
 /**
diff --git wp-includes/js/tinymce/langs/wp-langs-en.js wp-includes/js/tinymce/langs/wp-langs-en.js
index 6921eab..53d784a 100644
--- wp-includes/js/tinymce/langs/wp-langs-en.js
+++ wp-includes/js/tinymce/langs/wp-langs-en.js
@@ -499,7 +499,5 @@ s120:"120%",
 s130:"130%",
 img_title:"Title",
 caption:"Caption",
-insert_link:"Insert link",
-linked_text:"Linked text",
 alt:"Alternate Text"
 });
diff --git wp-includes/js/tinymce/langs/wp-langs.php wp-includes/js/tinymce/langs/wp-langs.php
index 625ef75..6100383 100644
--- wp-includes/js/tinymce/langs/wp-langs.php
+++ wp-includes/js/tinymce/langs/wp-langs.php
@@ -542,8 +542,6 @@ function wp_mce_translation() {
 		's130' => __('130%'),
 		'img_title' => __('Title'),
 		'caption' => __('Caption'),
-		'insert_link' => __('Insert link'),
-		'linked_text' => __('Linked text'),
 		'alt' => __('Alternate Text')
 	);
 
diff --git wp-includes/js/tinymce/plugins/wpeditimage/editimage.html wp-includes/js/tinymce/plugins/wpeditimage/editimage.html
index 6437801..bddd108 100644
--- wp-includes/js/tinymce/plugins/wpeditimage/editimage.html
+++ wp-includes/js/tinymce/plugins/wpeditimage/editimage.html
@@ -7,6 +7,12 @@
 <link rel="stylesheet" href="css/editimage.css?ver=348" type="text/css" media="all" />
 <script type="text/javascript" src="js/editimage.js?ver=348"></script>
 <script type="text/javascript" src="../../utils/form_utils.js?ver=348"></script>
+<script type='text/javascript'>
+/* <![CDATA[ */
+		window.quicktagsL10n = parent.quicktagsL10n || {};
+/* ]]> */
+</script>
+<script type="text/javascript" src="../../../quicktags.js?ver=3.4"></script>
 <base target="_self" />
 </head>
 
@@ -101,21 +107,8 @@ if ( 'rtl' == tinyMCEPopup.editor.getParam('directionality','') )
 				</label>
 			</th>
 			<td class="field">
-				<textarea id="img_cap_text"></textarea>
-
-				<div class="edit-caption-controls">
-				<input type="button" class="button caption-insert-link" value="{#wpeditimage.insert_link}" />
-
-				<div class="caption-insert-link-wrap hidden">
-				<label><span>{#advanced_dlg.link_url}</span>
-				<input type="text" value="" class="caption-insert-link-url" /></label>
+				<textarea id="img_cap_text" rows="5" cols="40"></textarea>
 
-				<label><span>{#wpeditimage.linked_text}</span>
-				<input type="text" value="" class="caption-insert-link-text" /></label>
-
-				<div class="caption-insert-link-buttons">
-				<input type="button" class="button caption-cancel" value="{#cancel}" />
-				<input type="button" class="button-primary caption-save" value="{#insert}" />
 				<br class="clear" />
 				</div></div></div>
 			</td>
@@ -285,5 +278,17 @@ if ( 'rtl' == tinyMCEPopup.editor.getParam('directionality','') )
 </form>
 </div>
 
+<div id="quicktags">
+	<textarea id="editor" rows="5" cols="40"></textarea>
+	<script type='text/javascript'>
+	/* <![CDATA[ */
+			quicktags({
+				id: 'editor',
+				buttons: 'strong,em,link,del,ins,code,close'
+			});
+	/* ]]> */
+	</script>
+</div>
+
 </body>
 </html>
diff --git wp-includes/js/tinymce/plugins/wpeditimage/js/editimage.dev.js wp-includes/js/tinymce/plugins/wpeditimage/js/editimage.dev.js
index 5a27d10..b0ada83 100644
--- wp-includes/js/tinymce/plugins/wpeditimage/js/editimage.dev.js
+++ wp-includes/js/tinymce/plugins/wpeditimage/js/editimage.dev.js
@@ -236,16 +236,19 @@ wpImage = {
 	},
 
 	init : function() {
-		var ed = tinyMCEPopup.editor, h;
+		var ed = tinyMCEPopup.editor, header, img_edit;
+
+		header = document.getElementById('media-upload-header');
+		img_edit = document.getElementById('img-edit');
+		header.innerHTML = ed.translate(header.innerHTML);
+		img_edit.innerHTML = ed.translate(img_edit.innerHTML);
 
-		h = document.body.innerHTML;
-		document.body.innerHTML = ed.translate(h);
 		window.setTimeout( function(){wpImage.setup();}, 500 );
 	},
 
 	setup : function() {
 		var t = this, c, el, link, fname, f = document.forms[0], ed = tinyMCEPopup.editor,
-			d = t.I('img_demo'), dom = tinyMCEPopup.dom, DL, DD, caption = '', dlc, pa, bookmark, insert_link;
+			d = t.I('img_demo'), dom = tinyMCEPopup.dom, DL, DD, caption = '', dlc, pa;
 
 		document.dir = tinyMCEPopup.editor.getParam('directionality','');
 
@@ -329,80 +332,10 @@ wpImage = {
 		if ( t.width && t.preloadImg.width )
 			t.showSizeSet();
 		
-		document.body.style.display = '';
-
-		tinyMCEPopup.events.add(document.body, 'click', function(e) {
-			var target = e.target, parent = target.parentNode, tr, c, el, textarea, sel, text, startPos, endPos;
-
-			if ( dom.hasClass(target, 'caption-insert-link') ) {
-				el = dom.select('div.caption-insert-link-wrap', parent)[0], textarea = dom.select('#img_cap_text')[0];
-
-				if ( document.selection ) {
-					textarea.focus();
-					sel = document.selection.createRange();
-					bookmark = sel.getBookmark();
-
-					if ( sel.text )
-						dom.select('.caption-insert-link-text', el)[0].value = sel.text;
-
-				} else if ( textarea.selectionStart || textarea.selectionStart == '0' ) {
-					text = textarea.value;
-					startPos = textarea.selectionStart;
-					endPos = textarea.selectionEnd;
-
-					if ( startPos != endPos )
-						dom.select('.caption-insert-link-text', el)[0].value = text.substring(startPos, endPos);
-				}
-
-				dom.hide(target);
-				dom.show(el);
-				dom.select('.caption-insert-link-url', el)[0].focus();
-			} else if ( dom.hasClass(target, 'caption-cancel') || dom.hasClass(target, 'caption-save') ) {
-				if ( dom.hasClass(target, 'caption-save') )
-					insert_link();
-
-				dom.hide( dom.select('.caption-insert-link-wrap') );
-				dom.show( dom.select('.caption-insert-link') );
-			}
-		});
-
-		insert_link = function() {
-			var sel, content, startPos, endPos, scrollTop, text, textarea = dom.select('#img_cap_text')[0],
-				url = dom.select('.caption-insert-link-url')[0], link_text = dom.select('.caption-insert-link-text')[0];
-
-			if ( !url || !link_text )
-				return;
-
-			content = "<a href='"+url.value+"'>"+link_text.value+"</a>";
+		// Setup the quicktags
+		wpImage.enableQTags();
 
-			if ( document.selection ) {
-				textarea.focus();
-				sel = document.selection.createRange();
-
-				if ( bookmark ) {
-					sel.moveToBookmark( bookmark );
-					bookmark = '';
-				}
-
-				sel.text = content;
-				textarea.focus();
-			} else if ( textarea.selectionStart || textarea.selectionStart == '0' ) {
-				text = textarea.value;
-				startPos = textarea.selectionStart;
-				endPos = textarea.selectionEnd;
-				scrollTop = textarea.scrollTop;
-
-				textarea.value = text.substring(0, startPos) + content + text.substring(endPos, text.length);
-
-				textarea.focus();
-				textarea.selectionStart = startPos + content.length;
-				textarea.selectionEnd = startPos + content.length;
-				textarea.scrollTop = scrollTop;
-			}
-
-			url.value = '';
-			link_text.value = '';
-		};
+		document.body.style.display = '';
 	},
 
 	remove : function() {
@@ -684,9 +617,36 @@ wpImage = {
 		t.preloadImg.onload = t.updateImageData;
 		t.preloadImg.onerror = t.resetImageData;
 		t.preloadImg.src = tinyMCEPopup.editor.documentBaseURI.toAbsolute(f.img_src.value);
+	},
+
+	/**
+	 * Enables a Quicktags editor for the caption textarea
+	 */
+	enableQTags : function() {
+		var old = document.getElementById('img_cap_text');
+		var neu = document.getElementById('quicktags');
+		var editor = document.getElementById('editor');
+		var buttons = document.getElementById('qt_editor_toolbar').childNodes;
+
+		// Add button classes to quicktags buttons
+		for (var i=0; i<buttons.length; i++) {
+			buttons[i].className += ' button';
+		}
+
+		// Move the new quicktags where old textarea used to be
+		// QTags breaks if you leave it inside an element that calls `ed.translate()`
+		old.parentNode.appendChild(neu);
+		// Hide old textarea, don't remove, it's still being used
+		old.style.display = 'none';
+
+		// Map old textarea value to the new quicktags
+		editor.value = old.value;
+		// Replace double-quotes so tinyMCE caption don't break
+		editor.onchange = function() {
+			old.value = this.value.replace(/"/g, "'");
+		}
 	}
 };
 
 window.onload = function(){wpImage.init();}
 wpImage.preInit();
-
