Index: _source/plugins/wysiwygarea/plugin.js
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- _source/plugins/wysiwygarea/plugin.js	(revision 7499)
+++ _source/plugins/wysiwygarea/plugin.js	(revision )
@@ -760,7 +760,12 @@
 							{
 								var sel = editor.getSelection(),
 									selected = sel.getSelectedElement(),
-									range  = sel.getRanges()[ 0 ];
+									range = sel.getRanges()[ 0 ],
+									path = new CKEDITOR.dom.elementPath( range.startContainer ),
+									block,
+									parent,
+									next,
+									rtl = keyCode == 8;
 
 								// Override keystrokes which should have deletion behavior
 								//  on fully selected element . (#4047) (#7645)
@@ -779,7 +784,52 @@
 									editor.fire( 'saveSnapshot' );
 
 									evt.data.preventDefault();
-									return;
+								}
+								else
+								{
+									// Handle the following special cases: (#6217)
+									// 1. Del/Backspace key before/after table;
+									// 2.  key after start of table.
+									if ( ( block = path.block ) &&
+										 range[ rtl ? 'checkStartOfBlock' : 'checkEndOfBlock' ]() &&
+										 ( next = block[ rtl ? 'getPrevious' : 'getNext' ]( notWhitespaceEval ) ) &&
+										 next.is( 'table' ) )
+									{
+										editor.fire( 'saveSnapshot' );
+
+										// Remove the current empty block.
+										if ( range[ rtl ? 'checkEndOfBlock' : 'checkStartOfBlock' ]() )
+											block.remove();
+
+										// Move cursor to the beginning/end of table cell.
+										range[ 'moveToElementEdit' + ( rtl ? 'End' : 'Start' ) ]( next );
+										range.select();
+
+										editor.fire( 'saveSnapshot' );
+
+										evt.data.preventDefault();
+									}
+									else if ( path.blockLimit.is( 'td' ) &&
+											  ( parent = path.blockLimit.getAscendant( 'table' ) ) &&
+											  range.checkBoundaryOfElement( parent, rtl ? CKEDITOR.START : CKEDITOR.END ) &&
+											  ( next = parent[ rtl ? 'getPrevious' : 'getNext' ]( notWhitespaceEval ) ) )
+									{
+										editor.fire( 'saveSnapshot' );
+
+										// Move cursor to the end of previous block.
+										range[ 'moveToElementEdit' + ( rtl ? 'End' : 'Start' ) ]( next );
+
+										// Remove any previous empty block.
+										if ( range.checkStartOfBlock() && range.checkEndOfBlock() )
+											next.remove();
+										else
+											range.select();
+
+										editor.fire( 'saveSnapshot' );
+
+										evt.data.preventDefault();
+									}
+
 								}
 							}
 
Index: _source/core/dom/range.js
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- _source/core/dom/range.js	(revision 7499)
+++ _source/core/dom/range.js	(revision )
@@ -349,7 +349,10 @@
 	// check(Start|End)OfBlock.
 	function getCheckStartEndBlockEvalFunction( isStart )
 	{
-		var hadBr = false, bookmarkEvaluator = CKEDITOR.dom.walker.bookmark( true );
+		var skipBogus = false,
+			bookmarkEvaluator = CKEDITOR.dom.walker.bookmark( true ),
+			nbspRegExp = /^[\t\r\n ]*(?:&nbsp;|\xa0)$/;
+
 		return function( node )
 		{
 			// First ignore bookmark nodes.
@@ -358,8 +361,16 @@
 
 			if ( node.type == CKEDITOR.NODE_TEXT )
 			{
+				// Skip the block filler NBSP.
+				if ( CKEDITOR.env.ie &&
+					 nbspRegExp.test( node.getText() ) &&
+					 !skipBogus &&
+					 !( isStart && node.getNext() ) )
+				{
+					skipBogus = true;
+				}
 				// If there's any visible text, then we're not at the start.
-				if ( node.hasAscendant( 'pre' ) || CKEDITOR.tools.trim( node.getText() ).length )
+				else if ( node.hasAscendant( 'pre' ) || CKEDITOR.tools.trim( node.getText() ).length )
 					return false;
 			}
 			else if ( node.type == CKEDITOR.NODE_ELEMENT )
@@ -368,10 +379,14 @@
 				// at the start.
 				if ( !inlineChildReqElements[ node.getName() ] )
 				{
-					// If we're working at the end-of-block, forgive the first <br /> in non-IE
-					// browsers.
-					if ( !isStart && !CKEDITOR.env.ie && node.getName() == 'br' && !hadBr )
-						hadBr = true;
+					// Skip the padding block br.
+					if ( !CKEDITOR.env.ie &&
+						 node.is( 'br' ) &&
+						 !skipBogus &&
+						 !( isStart && node.getNext() ) )
+					{
+						skipBogus = true;
+					}
 					else
 						return false;
 				}
@@ -1934,6 +1949,8 @@
 		 */
 		moveToElementEditablePosition : function( el, isMoveToEnd )
 		{
+			var nbspRegExp = /^[\t\r\n ]*(?:&nbsp;|\xa0)$/;
+
 			function nextDFS( node, childOnly )
 			{
 				var next;
@@ -1958,7 +1975,11 @@
 				// Stop immediately if we've found a text node.
 				if ( el.type == CKEDITOR.NODE_TEXT )
 				{
+					// Put cursor before block filler.
+					if ( isMoveToEnd && this.checkEndOfBlock() && nbspRegExp.test( el.getText() ) )
+						this.moveToPosition( el, CKEDITOR.POSITION_BEFORE_START );
+					else
-					this.moveToPosition( el, isMoveToEnd ?
+						this.moveToPosition( el, isMoveToEnd ?
 					                         CKEDITOR.POSITION_AFTER_END :
 					                         CKEDITOR.POSITION_BEFORE_START );
 					found = 1;
@@ -1975,6 +1996,9 @@
 												 CKEDITOR.POSITION_AFTER_START );
 						found = 1;
 					}
+					// Put cursor before padding block br.
+					else if ( isMoveToEnd && el.is( 'br' ) && this.checkEndOfBlock() )
+						this.moveToPosition( el, CKEDITOR.POSITION_BEFORE_START );
 				}
 
 				el = nextDFS( el, found );
