Index: /CKEditor/trunk/CHANGES.html
===================================================================
--- /CKEditor/trunk/CHANGES.html	(revision 7402)
+++ /CKEditor/trunk/CHANGES.html	(revision 7403)
@@ -1,3 +1,3 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+﻿<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <!--
 Copyright (c) 2003-2011, CKSource - Frederico Knabben. All rights reserved.
@@ -70,4 +70,5 @@
 		<li><a href="http://dev.ckeditor.com/ticket/7946">#7946</a> : Fix find dialog result doesn't scroll into view when editor is off the view port.</li>
 		<li><a href="http://dev.ckeditor.com/ticket/8157">#8157</a> : Fix editor leaves object element selection handler covers dialog.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/8305">#8305</a> : Fix text direction lost when converting paragraph to list.</li>
 	</ul>
 	<h3>
Index: /CKEditor/trunk/_source/plugins/list/plugin.js
===================================================================
--- /CKEditor/trunk/_source/plugins/list/plugin.js	(revision 7402)
+++ /CKEditor/trunk/_source/plugins/list/plugin.js	(revision 7403)
@@ -484,17 +484,14 @@
 	}
 
-	// Move direction attribute from root to list items.
-	function dirToListItems( list )
-	{
-		var dir = list.getDirection();
-		if ( dir )
-		{
-			for ( var i = 0, children = list.getChildren(), child; child = children.getItem( i ), i < children.count(); i++ )
-			{
-				if ( child.type == CKEDITOR.NODE_ELEMENT && child.is( 'li' ) && !child.getDirection() )
-					child.setAttribute( 'dir', dir );
-			}
-
-			list.removeAttribute( 'dir' );
+	var elementType = CKEDITOR.dom.walker.nodeType( CKEDITOR.NODE_ELEMENT );
+	// Merge list items with direction preserved. (#7448)
+	function mergeListItems( from, into, toHead )
+	{
+		var child, itemDir;
+		while ( child = from.getFirst( elementType ) )
+		{
+			if ( ( itemDir = child.getDirection( 1 ) ) !== into.getDirection( 1 ) )
+				child.setAttribute( 'dir', itemDir );
+			into.append( child.remove(), toHead );
 		}
 	}
@@ -641,10 +638,11 @@
 			}
 
-			// For all new lists created, merge adjacent, same type lists.
+			// For all new lists created, merge into adjacent, same type lists.
 			for ( i = 0 ; i < listsCreated.length ; i++ )
 			{
 				listNode = listsCreated[i];
 				var mergeSibling, listCommand = this;
-				( mergeSibling = function( rtl ){
+				( mergeSibling = function( rtl )
+				{
 
 					var sibling = listNode[ rtl ?
@@ -653,12 +651,9 @@
 						 sibling.getName() == listCommand.type )
 					{
-
-						// In case to be merged lists have difference directions. (#7448)
-						if ( sibling.getDirection( 1 ) != listNode.getDirection( 1 ) )
-							dirToListItems( listNode.getDirection() ? listNode : sibling );
-
-						sibling.remove();
 						// Move children order by merge direction.(#3820)
-						sibling.moveChildren( listNode, rtl );
+						mergeListItems( listNode, sibling, !rtl );
+
+						listNode.remove();
+						listNode = sibling;
 					}
 				} )();
