Index: /CKEditor/branches/features/pasting/_source/core/dtd.js
===================================================================
--- /CKEditor/branches/features/pasting/_source/core/dtd.js	(revision 4311)
+++ /CKEditor/branches/features/pasting/_source/core/dtd.js	(revision 4312)
@@ -92,4 +92,11 @@
 		 */
 		$listItem : {dd:1,dt:1,li:1},
+
+	    /**
+	     * List of list root elements.
+	     * @type Object
+	     * @example
+	     */
+	    $list: { ul:1,ol:1,dl:1},
 
 		/**
Index: /CKEditor/branches/features/pasting/_source/core/htmlparser/fragment.js
===================================================================
--- /CKEditor/branches/features/pasting/_source/core/htmlparser/fragment.js	(revision 4311)
+++ /CKEditor/branches/features/pasting/_source/core/htmlparser/fragment.js	(revision 4312)
@@ -47,4 +47,12 @@
 			{table:1,ul:1,ol:1,dl:1},
 			CKEDITOR.dtd.table, CKEDITOR.dtd.ul, CKEDITOR.dtd.ol, CKEDITOR.dtd.dl );
+
+	// A looser type of dtd.
+	var dtd = CKEDITOR.tools.clone( CKEDITOR.dtd );
+	// 1. Allow nested list.
+	for( var i in dtd.$list )
+	{
+		dtd[ i ] = CKEDITOR.tools.extend( dtd[ i ], dtd.$list );
+	}
 
 	/**
@@ -77,8 +85,8 @@
 					var pendingElement = pendingInline[ i ],
 						pendingName = pendingElement.name,
-						pendingDtd = CKEDITOR.dtd[ pendingName ],
-						currentDtd = currentNode.name && CKEDITOR.dtd[ currentNode.name ];
-
-					if ( ( !currentDtd || currentDtd[ pendingName ] ) && ( !newTagName || !pendingDtd || pendingDtd[ newTagName ] || !CKEDITOR.dtd[ newTagName ] ) )
+						pendingDtd = dtd[ pendingName ],
+						currentDtd = currentNode.name && dtd[ currentNode.name ];
+
+					if ( ( !currentDtd || currentDtd[ pendingName ] ) && ( !newTagName || !pendingDtd || pendingDtd[ newTagName ] || !dtd[ newTagName ] ) )
 					{
 						// Get a clone for the pending element.
@@ -114,5 +122,5 @@
 				else
 					elementName =  element.name;
-				if ( !( elementName in CKEDITOR.dtd.$body ) )
+				if ( !( elementName in dtd.$body ) )
 				{
 					var savedCurrent = currentNode;
@@ -166,5 +174,5 @@
 
 			// This is a tag to be removed if empty, so do not add it immediately.
-			if ( CKEDITOR.dtd.$removeEmpty[ tagName ] )
+			if ( dtd.$removeEmpty[ tagName ] )
 			{
 				pendingInline.push( element );
@@ -180,5 +188,5 @@
 
 			var currentName = currentNode.name,
-				currentDtd = ( currentName && CKEDITOR.dtd[ currentName ] ) || ( currentNode._.isBlockLike ? CKEDITOR.dtd.div : CKEDITOR.dtd.span );
+				currentDtd = ( currentName && dtd[ currentName ] ) || ( currentNode._.isBlockLike ? dtd.div : dtd.span );
 
 			// If the element cannot be child of the current element.
@@ -360,5 +368,5 @@
 				node = currentNode;
 
-			if ( fixForBody && !parent.type && !CKEDITOR.dtd.$body[ node.name ] )
+			if ( fixForBody && !parent.type && !dtd.$body[ node.name ] )
 			{
 				currentNode = parent;
@@ -446,5 +454,5 @@
 		writeChildrenHtml : function( writer, filter )
 		{
-			for ( var i = 0, len = this.children.length ; i < len ; i++ )
+			for ( var i = 0 ; i < this.children.length ; i++ )
 				this.children[i].writeHtml( writer, filter );
 		}
Index: /CKEditor/branches/features/pasting/_source/plugins/htmldataprocessor/plugin.js
===================================================================
--- /CKEditor/branches/features/pasting/_source/plugins/htmldataprocessor/plugin.js	(revision 4311)
+++ /CKEditor/branches/features/pasting/_source/plugins/htmldataprocessor/plugin.js	(revision 4312)
@@ -60,4 +60,24 @@
 	}
 
+	// Join the nested lists with previous list item. 
+	function fixNestedList( listItem )
+	{
+		var next = listItem.next;
+		// Is next element nested list?
+		if( next && next.name in dtd.$list )
+		{
+			var children = listItem.parent.children;
+			// Move into current list item.
+			listItem.children.push( next );
+			children.splice( children.indexOf( next ), 1 );
+		}
+	}
+	// Glean orphan nested lists. 
+	function dropOrphanNestedList( list )
+	{
+		if( list.parent.name in dtd.$list )
+			delete list.name;
+	}
+	
 	var dtd = CKEDITOR.dtd;
 
@@ -112,4 +132,10 @@
 	for ( i in blockLikeTags )
 		defaultDataBlockFilterRules.elements[ i ] = extendBlockForDisplay;
+
+	// Fixing invalid form of nested list(#3828). 
+	for( var i in dtd.$listItem )
+		defaultDataFilterRules.elements[ i ] = fixNestedList;
+	for( var i in dtd.$list )
+		defaultDataFilterRules.elements[ i ] = dropOrphanNestedList;
 
 	var defaultHtmlFilterRules =
