Index: CKEditor/trunk/CHANGES.html
===================================================================
--- CKEditor/trunk/CHANGES.html	(revision 7394)
+++ CKEditor/trunk/CHANGES.html	(revision 7395)
@@ -66,4 +66,5 @@
 		<li><a href="http://dev.ckeditor.com/ticket/8617">#8617</a> : Fix selection disturbed after inline style is opened.</li>
 		<li><a href="http://dev.ckeditor.com/ticket/8527">#8527</a> : Insertion with cursor before empty anchor is error prune.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/8632">#8632</a> : Fix cursor panic when backspace is used in list item.</li>
 	</ul>
 	<h3>
Index: CKEditor/trunk/_source/core/dom/walker.js
===================================================================
--- CKEditor/trunk/_source/core/dom/walker.js	(revision 7394)
+++ CKEditor/trunk/_source/core/dom/walker.js	(revision 7395)
@@ -15,4 +15,8 @@
 		var node,
 			range = this.range,
+			startCt = range.startContainer,
+			endCt = range.endContainer,
+			startOffset = range.startOffset,
+			endOffset = range.endOffset,
 			guard,
 			userGuard = this.guard,
@@ -25,8 +29,4 @@
 			this._.start = 1;
 
-			// Trim text nodes and optmize the range boundaries. DOM changes
-			// may happen at this point.
-			range.trim();
-
 			// A collapsed range must return null at first call.
 			if ( range.collapsed )
@@ -40,7 +40,13 @@
 		if ( !rtl && !this._.guardLTR )
 		{
-			// Gets the node that stops the walker when going LTR.
-			var limitLTR = range.endContainer,
-				blockerLTR = limitLTR.getChild( range.endOffset );
+			// The node that stops walker from moving up.
+			var limitLTR = endCt.type == CKEDITOR.NODE_ELEMENT ?
+						   endCt :
+						   endCt.getParent();
+
+			// The node that stops the walker from going to next.
+			var blockerLTR = endCt.type == CKEDITOR.NODE_ELEMENT ?
+							 endCt.getChild( endOffset ) :
+							 endCt.getNext();
 
 			this._.guardLTR = function( node, movingOut )
@@ -55,7 +61,14 @@
 		if ( rtl && !this._.guardRTL )
 		{
-			// Gets the node that stops the walker when going LTR.
-			var limitRTL = range.startContainer,
-				blockerRTL = ( range.startOffset > 0 ) && limitRTL.getChild( range.startOffset - 1 );
+			// The node that stops walker from moving up.
+			var limitRTL = startCt.type == CKEDITOR.NODE_ELEMENT ?
+						   startCt :
+						   startCt.getParent();
+
+			// The node that stops the walker from going to next.
+			var blockerRTL = startCt.type == CKEDITOR.NODE_ELEMENT ?
+						 startOffset ?
+						 startCt.getChild( startOffset - 1 ) : null :
+						 startCt.getPrevious();
 
 			this._.guardRTL = function( node, movingOut )
@@ -90,33 +103,31 @@
 		{
 			// Get the first node to be returned.
-
 			if ( rtl )
 			{
-				node = range.endContainer;
-
-				if ( range.endOffset > 0 )
+				node = endCt;
+
+				if ( node.type == CKEDITOR.NODE_ELEMENT )
 				{
-					node = node.getChild( range.endOffset - 1 );
-					if ( guard( node ) === false )
-						node = null;
+					if ( endOffset > 0 )
+						node = node.getChild( endOffset - 1 );
+					else
+						node = ( guard ( node, true ) === false ) ?
+							null : node.getPreviousSourceNode( true, type, guard );
 				}
-				else
-					node = ( guard ( node, true ) === false ) ?
-						null : node.getPreviousSourceNode( true, type, guard );
 			}
 			else
 			{
-				node = range.startContainer;
-				node = node.getChild( range.startOffset );
-
-				if ( node )
+				node = startCt;
+
+				if ( node.type == CKEDITOR.NODE_ELEMENT )
 				{
-					if ( guard( node ) === false )
-						node = null;
+					if ( ! ( node = node.getChild( startOffset ) ) )
+						node = ( guard ( startCt, true ) === false ) ?
+							null : startCt.getNextSourceNode( true, type, guard ) ;
 				}
-				else
-					node = ( guard ( range.startContainer, true ) === false ) ?
-						null : range.startContainer.getNextSourceNode( true, type, guard ) ;
 			}
+
+			if ( node && guard( node ) === false )
+				node = null;
 		}
 
