Index: /CKEditor/trunk/CHANGES.html
===================================================================
--- /CKEditor/trunk/CHANGES.html	(revision 6332)
+++ /CKEditor/trunk/CHANGES.html	(revision 6333)
@@ -97,4 +97,5 @@
 		<li><a href="http://dev.ckeditor.com/ticket/6568">#6568</a> :  Insert table row/column doesn't work with spanning.</li>
 		<li><a href="http://dev.ckeditor.com/ticket/6735">#6735</a> :  Inaccurate read-only selection detection.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/6728">#6728</a> :  [BIDI] Change direction doesn't work with list nested inside blockquote.</li>
 		<li>Updated the following language files:<ul>
 			<li><a href="http://dev.ckeditor.com/ticket/6981">#6981</a> : English (GB);</li>
Index: /CKEditor/trunk/_source/plugins/bidi/plugin.js
===================================================================
--- /CKEditor/trunk/_source/plugins/bidi/plugin.js	(revision 6332)
+++ /CKEditor/trunk/_source/plugins/bidi/plugin.js	(revision 6333)
@@ -6,5 +6,5 @@
 (function()
 {
-	var guardElements = { table:1, tbody: 1, ul:1, ol:1, blockquote:1, div:1, tr: 1 },
+	var guardElements = { table:1, ul:1, ol:1, blockquote:1, div:1 },
 		directSelectionGuardElements = {},
 		// All guard elements which can have a direction applied on them.
@@ -154,6 +154,5 @@
 					&& ( parent = ancestor.getParent() )
 					&& parent.getChildCount() == 1
-					&& ( !( ancestor.getName() in elements ) || ( parent.getName() in elements ) )
-					)
+					&& !( ancestor.getName() in elements ) )
 				ancestor = parent;
 
@@ -210,5 +209,5 @@
 						return !! ( node.type == CKEDITOR.NODE_ELEMENT
 								&& node.getName() in guardElements
-								&& !( node.getName() == ( enterMode == CKEDITOR.ENTER_P ) ? 'p' : 'div'
+								&& !( node.getName() == ( enterMode == CKEDITOR.ENTER_P ? 'p' : 'div' )
 									&& node.getParent().type == CKEDITOR.NODE_ELEMENT
 									&& node.getParent().getName() == 'blockquote' )
@@ -226,5 +225,5 @@
 					while ( ( block = iterator.getNextParagraph() ) )
 						!block.isReadOnly() && switchDir( block, dir, editor, database );
-				}
+					}
 
 				CKEDITOR.dom.element.clearAllMarkers( database );
Index: /CKEditor/trunk/_source/plugins/domiterator/plugin.js
===================================================================
--- /CKEditor/trunk/_source/plugins/domiterator/plugin.js	(revision 6332)
+++ /CKEditor/trunk/_source/plugins/domiterator/plugin.js	(revision 6333)
@@ -31,5 +31,15 @@
 
 	var beginWhitespaceRegex = /^[\r\n\t ]+$/,
-		isBookmark = CKEDITOR.dom.walker.bookmark();
+		// Ignore bookmark nodes.(#3783)
+		bookmarkGuard = CKEDITOR.dom.walker.bookmark( false, true );
+
+	// Get a reference for the next element, bookmark nodes are skipped.
+	function getNextSourceNode( node, startFromSibling, lastNode )
+	{
+		var next = node.getNextSourceNode( startFromSibling, null, lastNode );
+		while ( !bookmarkGuard( next ) )
+			next = next.getNextSourceNode( startFromSibling, null, lastNode );
+		return next;
+	}
 
 	iterator.prototype = {
@@ -221,5 +231,5 @@
 					range.setEndAt( currentNode, CKEDITOR.POSITION_AFTER_END );
 
-				currentNode = currentNode.getNextSourceNode( continueFromSibling, null, lastNode );
+				currentNode = getNextSourceNode ( currentNode, continueFromSibling, lastNode );
 				isLast = !currentNode;
 
@@ -257,13 +267,13 @@
 					block = this.range.document.createElement( blockTag || 'p' );
 
-					// Move the contents of the temporary range to the fixed block.
-					range.extractContents().appendTo( block );
-					block.trim();
-
-					// Insert the fixed block into the DOM.
-					range.insertNode( block );
-
-					removePreviousBr = removeLastBr = true;
-				}
+						// Move the contents of the temporary range to the fixed block.
+						range.extractContents().appendTo( block );
+						block.trim();
+
+						// Insert the fixed block into the DOM.
+						range.insertNode( block );
+
+						removePreviousBr = removeLastBr = true;
+					}
 				else if ( block.getName() != 'li' )
 				{
@@ -298,11 +308,7 @@
 					// lists) or the next sibling <li>.
 
-					this._.nextNode = ( block.equals( lastNode ) ? null :
-						range.getBoundaryNodes().endNode.getNextSourceNode( true, null, lastNode ) );
-				}
-			}
-
-			// Ignore bookmark nodes.(#3783)
-			var bookmarkGuard = CKEDITOR.dom.walker.bookmark( false, true );
+					this._.nextNode = ( block.equals( lastNode ) ? null : getNextSourceNode( range.getBoundaryNodes().endNode, 1, lastNode ) );
+				}
+			}
 
 			if ( removePreviousBr )
@@ -337,11 +343,5 @@
 			{
 				this._.nextNode = ( isLast || block.equals( lastNode ) ) ? null :
-					block.getNextSourceNode( true, null, lastNode );
-			}
-
-			if ( !bookmarkGuard( this._.nextNode ) )
-			{
-				this._.nextNode = this._.nextNode.getNextSourceNode( true, null, function( node )
-					{ return !node.equals( lastNode ) && bookmarkGuard( node ); } );
+					getNextSourceNode( block, 1, lastNode );
 			}
 
