Index: /CKEditor/trunk/CHANGES.html
===================================================================
--- /CKEditor/trunk/CHANGES.html	(revision 7600)
+++ /CKEditor/trunk/CHANGES.html	(revision 7601)
@@ -51,4 +51,5 @@
 		<li><a href="http://dev.ckeditor.com/ticket/6168">#6168</a> : Fixed style definition with styles defined as inline style attribute.</li>
 		<li><a href="http://dev.ckeditor.com/ticket/9097">#9097</a> : [IE] Fixed small selection flaw when select start from the blank region outside body.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/9129">#9129</a> : Fixed various Del/Backspace keystroke behavior inside of HTML list.</li>
 	</ul>
 	<h3>
Index: /CKEditor/trunk/_source/plugins/list/plugin.js
===================================================================
--- /CKEditor/trunk/_source/plugins/list/plugin.js	(revision 7600)
+++ /CKEditor/trunk/_source/plugins/list/plugin.js	(revision 7601)
@@ -785,5 +785,5 @@
 	}
 
-	// Merge the visual line content at the cursor range into the block.
+	// Join visually two block lines.
 	function joinNextLineToCursor( editor, cursor, nextCursor )
 	{
@@ -799,5 +799,5 @@
 		// Kill original bogus;
 		var currentPath = new CKEDITOR.dom.elementPath( cursor.startContainer );
-		var currentLi = currentPath.lastElement.getAscendant( 'li', 1 );
+		var currentBlock = currentPath.lastElement.getAscendant( 'li', 1 ) || currentPath.block;
 
 		var bogus = currentPath.block.getBogus();
@@ -816,6 +816,6 @@
 			cursor.startContainer.append( frag );
 
-		var nextPath = new CKEDITOR.dom.elementPath( nextCursor.startContainer );
-		var nextLi = nextCursor.startContainer.getAscendant( 'li', 1 );
+		var nextPath = new CKEDITOR.dom.elementPath( nextCursor.startContainer ),
+			nextLi = nextCursor.startContainer.getAscendant( 'li', 1 );
 
 		// Move the sub list nested in the next list item.
@@ -826,5 +826,5 @@
 			{
 				// If next line is in the sub list of the current list item.
-				if ( currentLi.contains( nextLi ) )
+				if ( currentBlock.contains( nextLi ) )
 				{
 					mergeChildren( sublist, nextLi.getParent(), nextLi );
@@ -833,5 +833,5 @@
 				// Migrate the sub list to current list item.
 				else
-					currentLi.append( sublist );
+					currentBlock.append( sublist );
 			}
 		}
@@ -919,8 +919,10 @@
 							return;
 
+						var path = new CKEDITOR.dom.elementPath( range.startContainer );
 						var isBackspace = key == 8;
 						var body = editor.document.getBody();
 						var walker = new CKEDITOR.dom.walker( range.clone() );
 						walker.evaluator = function( node ) { return nonEmpty( node ) && !blockBogus( node ); };
+						walker.guard = function( node, isOut ) { return !( isOut && node.type == CKEDITOR.NODE_ELEMENT && node.is( 'table' ) ) };
 
 						var cursor = range.clone();
@@ -929,6 +931,4 @@
 						{
 							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.
@@ -974,8 +974,42 @@
 								evt.cancel();
 							}
+							else
+							{
+								var list = path.contains( listNodeNames ), li;
+								// Backspace pressed at the start of list outdents the first list item. (#9129)
+								if ( list && range.checkBoundaryOfElement( list, CKEDITOR.START ) )
+								{
+									li = list.getFirst( nonEmpty );
+
+									if ( range.checkBoundaryOfElement( li, CKEDITOR.START ) )
+									{
+										previous = list.getPrevious( nonEmpty );
+
+										// Only if the list item contains a sub list, do nothing but
+										// simply move cursor backward one character.
+										if ( getSubList( li ) )
+										{
+											if ( previous ) {
+												range.moveToElementEditEnd( previous );
+												range.select();
+											}
+
+											evt.cancel();
+										}
+										else
+										{
+											editor.execCommand( 'outdent' );
+											evt.cancel();
+										}
+									}
+								}
+							}
 						}
 						else
 						{
-							var li = range.startContainer.getAscendant( 'li', 1 );
+							var next,
+								nextLine,
+								li = range.startContainer.getAscendant( 'li', 1 );
+
 							if ( li )
 							{
@@ -1008,9 +1042,44 @@
 								{
 									// Put cursor range there.
-									var nextLine = range.clone();
+									nextLine = range.clone();
 									nextLine.moveToElementEditStart( next );
 
 									joinNextLineToCursor( editor, cursor, nextLine );
 									evt.cancel();
+								}
+							}
+							else
+							{
+								// Handle Del key pressed before the list.
+								walker.range.setEndAt( body, CKEDITOR.POSITION_BEFORE_END );
+								next = walker.next();
+
+								if ( next && next.type == CKEDITOR.NODE_ELEMENT &&
+								     next.getName() in listNodeNames )
+								{
+									// The start <li>
+									next = next.getFirst( nonEmpty );
+
+									// Simply remove the current empty block, move cursor to the
+									// subsequent list.
+									if ( path.block &&
+									     range.checkStartOfBlock() &&
+									     range.checkEndOfBlock() )
+									{
+										path.block.remove();
+										range.moveToElementEditStart( next );
+										range.select();
+										evt.cancel();
+									}
+
+									// Preventing the default (merge behavior), but simply move
+									// the cursor one character forward if subsequent list item
+									// contains sub list.
+									else if ( getSubList( next )  )
+									{
+										range.moveToElementEditStart( next );
+										range.select();
+										evt.cancel();
+									}
 								}
 							}
Index: /CKEditor/trunk/_source/plugins/selection/plugin.js
===================================================================
--- /CKEditor/trunk/_source/plugins/selection/plugin.js	(revision 7600)
+++ /CKEditor/trunk/_source/plugins/selection/plugin.js	(revision 7601)
@@ -79,10 +79,4 @@
 		}
 
-		function singletonBlock( node )
-		{
-			var body = range.document.getBody();
-			return !node.is( 'body' ) && body.getChildCount() == 1;
-		}
-
 		var start = range.startContainer,
 			offset = range.startOffset;
@@ -92,7 +86,7 @@
 
 		// 1. Empty inline element. <span>^</span>
-		// 2. Adjoin to inline element. <p><strong>text</strong>^</p>
-		// 3. The only empty block in document. <body><p>^</p></body> (#7222)
-		return !CKEDITOR.tools.trim( start.getHtml() ) ? isInlineCt( start ) || singletonBlock( start )
+		// 2. Empty block. <p>^</p> (#7222)
+		// 3. Adjoin to inline element. <p><strong>text</strong>^</p>
+		return !CKEDITOR.tools.trim( start.getHtml() ) ? isInlineCt( start ) || start.isBlockBoundary()
 				: isInlineCt( start.getChild( offset - 1 ) ) || isInlineCt( start.getChild( offset ) );
 	}
@@ -566,4 +560,5 @@
 					if ( CKEDITOR.env.webkit )
 					{
+						// Before keystroke is handled by editor, check to remove the filling char.
 						doc.on( 'keydown', function( evt )
 						{
@@ -586,5 +581,5 @@
 							}
 
-						}, null, null, 10 );
+						}, null, null, -1 );
 					}
 				});
Index: /CKEditor/trunk/_source/plugins/wysiwygarea/plugin.js
===================================================================
--- /CKEditor/trunk/_source/plugins/wysiwygarea/plugin.js	(revision 7600)
+++ /CKEditor/trunk/_source/plugins/wysiwygarea/plugin.js	(revision 7601)
@@ -768,7 +768,7 @@
 						domDocument.getDocumentElement().addClass( domDocument.$.compatMode );
 						// Override keystroke behaviors.
-						editable && domDocument.on( 'keydown', function( evt )
+						editor.on( 'key', function( evt )
 						{
-							var keyCode = evt.data.getKeystroke();
+							var keyCode = evt.data.keyCode;
 
 							// Backspace OR Delete.
@@ -800,7 +800,7 @@
 									editor.fire( 'saveSnapshot' );
 
-									evt.data.preventDefault();
+									evt.cancel();
 								}
-								else
+								else if ( range.collapsed )
 								{
 									// Handle the following special cases: (#6217)
@@ -824,5 +824,5 @@
 										editor.fire( 'saveSnapshot' );
 
-										evt.data.preventDefault();
+										evt.cancel();
 									}
 									else if ( path.blockLimit.is( 'td' ) &&
@@ -844,5 +844,5 @@
 										editor.fire( 'saveSnapshot' );
 
-										evt.data.preventDefault();
+										evt.cancel();
 									}
 
@@ -866,5 +866,5 @@
 										range[ keyCode == 33 ? 'moveToElementEditStart' : 'moveToElementEditEnd']( body );
 										range.select();
-										evt.data.preventDefault();
+										evt.cancel();
 									}
 								}
