Index: /CKEditor/trunk/_source/core/dom/range.js
===================================================================
--- /CKEditor/trunk/_source/core/dom/range.js	(revision 4733)
+++ /CKEditor/trunk/_source/core/dom/range.js	(revision 4734)
@@ -307,4 +307,13 @@
 			    || !CKEDITOR.tools.trim( node.getText() )
 			    || node.getParent().hasAttribute( '_fck_bookmark' );
+	}
+
+	var whitespaceEval = new CKEDITOR.dom.walker.whitespaces(),
+		bookmarkEval = new CKEDITOR.dom.walker.bookmark();
+
+	function nonWhitespaceOrBookmarkEval( node )
+	{
+		// Whitespaces and bookmark nodes are to be ignored.
+		return !whitespaceEval( node ) && !bookmarkEval( node );
 	}
 
@@ -1600,28 +1609,40 @@
 		 * "&lt;p&gt;&lt;b&gt;&lt;i&gt;&lt;/i&gt;&lt;/b&gt; Text&lt;/p&gt;", the start editing point is
 		 * "&lt;p&gt;&lt;b&gt;&lt;i&gt;^&lt;/i&gt;&lt;/b&gt; Text&lt;/p&gt;" (inside &lt;i&gt;).
-		 * @param {CKEDITOR.dom.element} targetElement The element into which
-		 *		look for the editing spot.
+		 * @param {CKEDITOR.dom.element} el The element into which look for the
+		 *		editing spot.
 		 */
-		moveToElementEditStart : function( targetElement )
-		{
-			var editableElement;
-
-			while ( targetElement && targetElement.type == CKEDITOR.NODE_ELEMENT )
-			{
-				if ( targetElement.isEditable() )
-					editableElement = targetElement;
-				else if ( editableElement )
-					break ;		// If we already found an editable element, stop the loop.
-
-				targetElement = targetElement.getFirst();
-			}
-
-			if ( editableElement )
-			{
-				this.moveToPosition(editableElement, CKEDITOR.POSITION_AFTER_START);
-				return true;
-			}
-			else
-				return false;
+		moveToElementEditStart : function( el )
+		{
+			var isEditable;
+
+			while ( el && el.type == CKEDITOR.NODE_ELEMENT )
+			{
+				isEditable = el.isEditable();
+				
+				// If an editable element is found, move inside it.
+				if ( isEditable )
+					this.moveToPosition( el, CKEDITOR.POSITION_AFTER_START );
+				// Stop immediately if we've found a non editable inline element (e.g <img>).
+				else if ( CKEDITOR.dtd.$inline[ el.getName() ] )
+				{
+					this.moveToPosition( el, CKEDITOR.POSITION_BEFORE_START );
+					return true;
+				}
+
+				// Non-editable non-inline elements are to be bypassed, getting the next one.
+				if ( CKEDITOR.dtd.$empty[ el.getName() ] )
+					el = el.getNext( nonWhitespaceOrBookmarkEval ); 
+				else
+					el = el.getFirst( nonWhitespaceOrBookmarkEval ); 
+				
+				// Stop immediately if we've found a text node.
+				if ( el && el.type == CKEDITOR.NODE_TEXT )
+				{
+					this.moveToPosition( el, CKEDITOR.POSITION_BEFORE_START );
+					return true;
+				}
+			}
+
+			return isEditable;
 		},
 
Index: /CKEditor/trunk/_source/core/dtd.js
===================================================================
--- /CKEditor/trunk/_source/core/dtd.js	(revision 4733)
+++ /CKEditor/trunk/_source/core/dtd.js	(revision 4734)
@@ -66,4 +66,6 @@
 		 */
 		$block : block,
+
+		$inline : L,	// Just like span.
 
 		$body : X({script:1}, block),
