Index: src/wp-includes/js/quicktags.js
===================================================================
--- src/wp-includes/js/quicktags.js	(revision 33102)
+++ src/wp-includes/js/quicktags.js	(working copy)
@@ -169,6 +169,16 @@
 			return false;
 		}
 
+		if ( canvas.addEventListener ) {
+			canvas.addEventListener( 'keydown', function(event) {
+				qt.OnTab(event, this);
+			}, false );
+		} else if ( canvas.attachEvent ) {
+			canvas.attachEvent( 'onkeydown', function(event) {
+				qt.OnTab(event, this);
+			} );
+		}
+
 		t.name = name;
 		t.id = id;
 		t.canvas = canvas;
@@ -502,30 +512,19 @@
 	qt.TagButton.prototype.callback = function(element, canvas, ed) {
 		var t = this, startPos, endPos, cursorPos, scrollTop, v = canvas.value, l, r, i, sel, endTag = v ? t.tagEnd : '';
 
-		if ( document.selection ) { // IE
-			canvas.focus();
-			sel = document.selection.createRange();
-			if ( sel.text.length > 0 ) {
-				if ( !t.tagEnd ) {
-					sel.text = sel.text + t.tagStart;
-				} else {
-					sel.text = t.tagStart + sel.text + endTag;
-				}
+		if ( canvas.selectionStart || canvas.selectionStart === 0 ) { // FF, WebKit, Opera, IE9+
+			// Check if there has been a keyboard selection
+			// reverse tabbing doesn't always make canvas.selectionStart available
+			if ( typeof keyboardSelection !== 'undefined' ) {
+				startPos = keyboardSelection[0] || canvas.selectionStart; 
+				endPos = keyboardSelection[1] || canvas.selectionEnd; 
+				// Reset it right away, no need for it from here  
+				keyboardSelection = false;
 			} else {
-				if ( !t.tagEnd ) {
-					sel.text = t.tagStart;
-				} else if ( t.isOpen(ed) === false ) {
-					sel.text = t.tagStart;
-					t.openTag(element, ed);
-				} else {
-					sel.text = endTag;
-					t.closeTag(element, ed);
-				}
+				startPos = canvas.selectionStart;
+				endPos = canvas.selectionEnd;
 			}
-			canvas.focus();
-		} else if ( canvas.selectionStart || canvas.selectionStart === 0 ) { // FF, WebKit, Opera
-			startPos = canvas.selectionStart;
-			endPos = canvas.selectionEnd;
+
 			cursorPos = endPos;
 			scrollTop = canvas.scrollTop;
 			l = v.substring(0, startPos); // left of the selection
@@ -558,6 +557,31 @@
 			canvas.selectionEnd = cursorPos;
 			canvas.scrollTop = scrollTop;
 			canvas.focus();
+		} else if ( document.selection ) { // IE8 
+			canvas.focus(); 
+			// Check if we already have an IE keyboard selection first.
+			sel = keyboardSelection || document.selection.createRange();
+
+			if ( sel.text.length > 0 ) { 
+					if ( !t.tagEnd ) { 
+							sel.text = sel.text + t.tagStart; 
+					} else { 
+							sel.text = t.tagStart + sel.text + endTag; 
+					} 
+			} else { 
+					if ( !t.tagEnd ) { 
+							sel.text = t.tagStart; 
+					} else if ( t.isOpen(ed) === false ) { 
+							sel.text = t.tagStart; 
+							t.openTag(element, ed); 
+					} else { 
+							sel.text = endTag; 
+							t.closeTag(element, ed); 
+					} 
+			} 
+			// Reset IE keyboard selection 
+			keyboardSelection = false;  
+			canvas.focus();
 		} else { // other browsers?
 			if ( !endTag ) {
 				canvas.value += t.tagStart;
@@ -572,6 +596,22 @@
 		}
 	};
 
+	// IE keyboard selection: get and store the selection when reverse tabbing. 
+	qt.OnTab = function( event, canvas ) {
+		var key;
+
+		if ( 'keydown' === event.type ) {
+			key = event.keyCode || event.charCode;
+			if ( event.shiftKey && 9 === key ) {
+				if ( canvas.selectionStart || canvas.selectionStart === 0 ) {
+					keyboardSelection = [canvas.selectionStart, canvas.selectionEnd];
+				} else  if ( document.selection ) {
+					keyboardSelection = document.selection.createRange();
+				}
+			}
+		}
+	};
+
 	// removed
 	qt.SpellButton = function() {};
 
