Index: /CKEditor/trunk/CHANGES.html
===================================================================
--- /CKEditor/trunk/CHANGES.html	(revision 7539)
+++ /CKEditor/trunk/CHANGES.html	(revision 7540)
@@ -77,4 +77,5 @@
 		<li><a href="http://dev.ckeditor.com/ticket/6217">#6217</a> : Handled DEL/BACKSPACE key at the boundary of table to unifiy the cursor position.</li>
 		<li><a href="http://dev.ckeditor.com/ticket/8950">#8950</a> : Chagend the cursor position after calling editor::insertElement on block element.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/9080">#9080</a> : Fixed Backspace key in front of the list item to join with previous line.</li>
 	</ul>
 	<h3>
Index: /CKEditor/trunk/_source/core/dom/walker.js
===================================================================
--- /CKEditor/trunk/_source/core/dom/walker.js	(revision 7539)
+++ /CKEditor/trunk/_source/core/dom/walker.js	(revision 7540)
@@ -456,9 +456,15 @@
 		return function( node )
 		{
-			var parent = node.getParent(),
-				isBogus = !CKEDITOR.env.ie ? node.is && node.is( 'br' ) :
+			var isBogus = !CKEDITOR.env.ie ? node.is && node.is( 'br' ) :
 					  node.getText && tailNbspRegex.test( node.getText() );
 
-			isBogus = isBogus && parent.isBlockBoundary() && !!parent.getLast( nonEmpty );
+			if ( isBogus )
+			{
+				var parent = node.getParent(), next = node.getNext( nonEmpty );
+				isBogus = parent.isBlockBoundary() &&
+				          ( !next ||
+				            next.type == CKEDITOR.NODE_ELEMENT &&
+				            next.isBlockBoundary() );
+			}
 
 			return !! ( isReject ^ isBogus );
Index: /CKEditor/trunk/_source/plugins/indent/plugin.js
===================================================================
--- /CKEditor/trunk/_source/plugins/indent/plugin.js	(revision 7539)
+++ /CKEditor/trunk/_source/plugins/indent/plugin.js	(revision 7540)
@@ -429,23 +429,4 @@
 				}
 			});
-
-			editor.on( 'key', function( evt )
-			{
-				// Backspace at the beginning of  list item should outdent it.
-				if ( editor.mode == 'wysiwyg' && evt.data.keyCode == 8 )
-				{
-					var sel = editor.getSelection(),
-						range = sel.getRanges()[ 0 ],
-						li;
-
-					if ( range.collapsed &&
-						 ( li = range.startContainer.getAscendant( 'li', 1 ) ) &&
-						 range.checkBoundaryOfElement( li, CKEDITOR.START ) )
-					{
-						editor.execCommand( 'outdent' );
-						evt.cancel();
-					}
-				}
-			});
 		},
 
Index: /CKEditor/trunk/_source/plugins/list/plugin.js
===================================================================
--- /CKEditor/trunk/_source/plugins/list/plugin.js	(revision 7539)
+++ /CKEditor/trunk/_source/plugins/list/plugin.js	(revision 7540)
@@ -682,22 +682,5 @@
 			// For all new lists created, merge into adjacent, same type lists.
 			for ( i = 0 ; i < listsCreated.length ; i++ )
-			{
-				listNode = listsCreated[i];
-				var mergeSibling, listCommand = this;
-				( mergeSibling = function( rtl )
-				{
-					var sibling = listNode[ rtl ? 'getPrevious' : 'getNext' ]( nonEmpty );
-					if ( sibling && sibling.getName &&
-						 sibling.getName() == listCommand.type )
-					{
-						// Move children order by merge direction.(#3820)
-						mergeChildren( listNode, sibling, null, !rtl );
-
-						listNode.remove();
-						listNode = sibling;
-					}
-				} )();
-				mergeSibling( 1 );
-			}
+				mergeListSiblings( listsCreated[ i ] );
 
 			// Clean up, restore selection and update toolbar button states.
@@ -707,4 +690,23 @@
 		}
 	};
+
+	// Merge list adjacent, of same type lists.
+	function mergeListSiblings( listNode )
+	{
+		var mergeSibling;
+		( mergeSibling = function( rtl )
+		{
+			var sibling = listNode[ rtl ? 'getPrevious' : 'getNext' ]( nonEmpty );
+			if ( sibling && sibling.is( listNode.getName() ) )
+			{
+				// Move children order by merge direction.(#3820)
+				mergeChildren( listNode, sibling, null, !rtl );
+
+				listNode.remove();
+				listNode = sibling;
+			}
+		} )();
+		mergeSibling( 1 );
+	}
 
 	var dtd = CKEDITOR.dtd;
@@ -789,4 +791,5 @@
 
 		cursor.trim( false, true );
+		var bm = cursor.createBookmark();
 
 		// Kill original bogus;
@@ -830,25 +833,30 @@
 		}
 
-
-		if ( nextCursor.checkStartOfBlock() &&
+		// Remove any remaining empty path blocks.
+		while ( nextCursor.checkStartOfBlock() &&
 			 nextCursor.checkEndOfBlock() )
 		{
-			var nextBlock = nextPath.block,
-				parentBlock = nextBlock.getParent();
-
+			nextPath = new CKEDITOR.dom.elementPath( nextCursor.startContainer );
+			var nextBlock = nextPath.block;
+
+			nextCursor.moveToPosition( nextBlock, CKEDITOR.POSITION_BEFORE_START );
 			nextBlock.remove();
-
-			// Remove if the path block container is now empty, e.g. li.
-			if ( parentBlock &&
-				 !parentBlock.getFirst( nonEmpty ) &&
-				 !parentBlock.equals( nextPath.blockLimit ) )
-			{
-				parentBlock.remove();
-			}
-		}
+		}
+
+		// Check if need to further merge with the list resides after the merged block. (#9080)
+		var walkerRng = nextCursor.clone(), body = editor.document.getBody();
+		walkerRng.setEndAt( body, CKEDITOR.POSITION_BEFORE_END );
+		var walker = new CKEDITOR.dom.walker( walkerRng );
+		walker.evaluator = function( node ) { return nonEmpty( node ) && !blockBogus( node ); };
+		var next = walker.next();
+		if ( next && next.type == CKEDITOR.NODE_ELEMENT && next.getName() in CKEDITOR.dtd.$list )
+			mergeListSiblings( next );
+
+		cursor.moveToBookmark( bm );
 
 		// Make fresh selection.
 		cursor.select();
 
+		editor.selectionChange( 1 );
 		editor.fire( 'saveSnapshot' );
 	}
@@ -884,7 +892,5 @@
 			editor.on( 'selectionChange', CKEDITOR.tools.bind( onSelectionChange, bulletedListCommand ) );
 
-			// [IE8] Fix "backspace" after list and "del" at the end of list item. (#8248)
-			if ( CKEDITOR.env.ie8Compat )
-			{
+				// Handled backspace/del key to join list items. (#8248,#9080)
 				editor.on( 'key', function( evt )
 				{
@@ -909,20 +915,47 @@
 						if ( isBackspace )
 						{
-							walker.range.setStartAt( body, CKEDITOR.POSITION_AFTER_START );
-							walker.range.setEnd( range.startContainer, range.startOffset );
-
-							var previous = walker.previous();
-
-							// Check if cursor collapsed right behind of a list.
-							if ( previous &&
-								 previous.type == CKEDITOR.NODE_ELEMENT &&
-								 previous.getName() in listNodeNames )
+							var previous, joinWith;
+
+							var path = new CKEDITOR.dom.elementPath( range.startContainer );
+
+							// Join a sub list's first line, with the previous visual line in parent.
+							if ( ( previous = path.contains( listNodeNames ) ) &&
+							     range.checkBoundaryOfElement( previous, CKEDITOR.START ) &&
+							     ( previous = previous.getParent() ) && previous.is( 'li' ) &&
+							     ( previous = getSubList( previous ) ) )
 							{
-								walker.range.selectNodeContents( previous );
-								walker.reset();
-								walker.evaluator = isTextBlock;
-
-								// Place cursor at the end of previous block.
-								cursor.moveToElementEditEnd( walker.lastForward() );
+								joinWith = previous;
+								previous = previous.getPrevious( nonEmpty );
+								// Place cursor before the nested list.
+								cursor.moveToPosition(
+									previous && blockBogus( previous ) ? previous : joinWith,
+									CKEDITOR.POSITION_BEFORE_START );
+							}
+							// Join any line following a list, with the last visual line of the list.
+							else
+							{
+								walker.range.setStartAt( body, CKEDITOR.POSITION_AFTER_START );
+								walker.range.setEnd( range.startContainer, range.startOffset );
+								previous = walker.previous();
+
+								if ( previous && previous.type == CKEDITOR.NODE_ELEMENT &&
+								   ( previous.getName() in listNodeNames || previous.is( 'li' ) ) )
+								{
+									if ( !previous.is( 'li' ) )
+									{
+										walker.range.selectNodeContents( previous );
+										walker.reset();
+										walker.evaluator = isTextBlock;
+										previous = walker.previous();
+									}
+
+									joinWith = previous;
+									// Place cursor at the end of previous block.
+									cursor.moveToElementEditEnd( joinWith );
+								}
+							}
+
+							if ( joinWith )
+							{
 								joinNextLineToCursor( editor, cursor, range );
 								evt.cancel();
@@ -970,7 +1003,10 @@
 							}
 						}
+
+						// The backspace/del could potentially put cursor at a bad position,
+						// being it handled or not, check immediately the selection to have it fixed.
+						setTimeout( function() { editor.selectionChange( 1 ); } );
 					}
 				} );
-			}
 		},
 
Index: /CKEditor/trunk/_source/plugins/selection/plugin.js
===================================================================
--- /CKEditor/trunk/_source/plugins/selection/plugin.js	(revision 7539)
+++ /CKEditor/trunk/_source/plugins/selection/plugin.js	(revision 7540)
@@ -590,5 +590,14 @@
 				});
 
-			editor.selectionChange = checkSelectionChangeTimeout;
+			/**
+			 * Check if to fire the {@link CKEDITOR.editor#selectionChange} event
+			 * for the current editor instance.
+			 *
+			 * @param {Boolean} checkNow Check immediately without any delay.
+			 */
+			editor.selectionChange = function( checkNow )
+			{
+				( checkNow ? checkSelectionChange : checkSelectionChangeTimeout ).call( this );
+			};
 
 			// IE9 might cease to work if there's an object selection inside the iframe (#7639).
