Index: /CKEditor/branches/features/contenteditable/_source/core/dom/node.js
===================================================================
--- /CKEditor/branches/features/contenteditable/_source/core/dom/node.js	(revision 5610)
+++ /CKEditor/branches/features/contenteditable/_source/core/dom/node.js	(revision 5611)
@@ -671,5 +671,5 @@
 
 					if ( current.getAttribute( 'contentEditable' ) == 'false' )
-						return true;
+						return current;
 					else if ( current.getAttribute( 'contentEditable' ) == 'true' )
 						break;
Index: /CKEditor/branches/features/contenteditable/_source/plugins/selection/plugin.js
===================================================================
--- /CKEditor/branches/features/contenteditable/_source/plugins/selection/plugin.js	(revision 5610)
+++ /CKEditor/branches/features/contenteditable/_source/plugins/selection/plugin.js	(revision 5611)
@@ -677,4 +677,10 @@
 							walkerRange = range.clone();
 
+						// Range may start inside a non-editable element, restart range
+						// by the end of it.
+						var readOnly;
+						if ( readOnly = startContainer.isReadOnly() )
+							range.setStartAfter( readOnly );
+
 						// Enlarge range start/end with text node to avoid walker
 						// being DOM destructive, it doesn't interfere our checking
@@ -700,11 +706,4 @@
 						walker.evaluator = function( node )
 						{
-							// Whether range start with a non-editable node.
-							if ( node.getPosition( walkerRange.startContainer ) & CKEDITOR.POSITION_IS_CONTAINED
-									|| node.isReadOnly() )
-							{
-								range.setStartAfter( node );
-							}
-
 							if ( node.type == CKEDITOR.NODE_ELEMENT
 								&& node.getAttribute( 'contenteditable' ) == 'false' )
