Index: _source/plugins/keystrokes/plugin.js
===================================================================
--- _source/plugins/keystrokes/plugin.js	(revision 5949)
+++ _source/plugins/keystrokes/plugin.js	(revision )
@@ -138,7 +138,13 @@
 			// keypress. So we must do a longer trip in those cases.
 			if ( CKEDITOR.env.opera || ( CKEDITOR.env.gecko && CKEDITOR.env.mac ) )
 				domObject.on( 'keypress', onKeyPress, this );
+		},
+
+		getCancelStatus : function( domObject )
+		{
+			return cancel;
 		}
+
 	};
 })();
 
Index: _source/plugins/list/plugin.js
===================================================================
--- _source/plugins/list/plugin.js	(revision 6054)
+++ _source/plugins/list/plugin.js	(revision )
@@ -694,6 +694,125 @@
 			// Register the state changing handlers.
 			editor.on( 'selectionChange', CKEDITOR.tools.bind( onSelectionChange, numberedListCommand ) );
 			editor.on( 'selectionChange', CKEDITOR.tools.bind( onSelectionChange, bulletedListCommand ) );
+
+
+			var stopType;
+
+            editor.on('contentDom',function(evt)
+			{
+				editor.document.on( 'keydown' , function(evt)
+				{
+					var blacklistKeyCodes = { 37:1, 38:1, 39:1, 40:1, // Arrows: L, T, R, B
+											  35:1, 36:1,		     // END, HOME
+											  33:1, 34:1			 // PAGE UP, PAGE DOWN
+											};
+
+					var keyCode = evt.data.getKey();
+
+					//reset flag
+					stopType = false;
+
+					if( keyCode in blacklistKeyCodes )
+						stopType = true;
+				})
+
+				editor.document.on( 'keypress' , function ( evt )
+				{
+					if( CKEDITOR.env.gecko )
+					{
+						//check if it is special code from keystroke
+						var keystrokeHandler = editor.keystrokeHandler;
+
+						//get status of cancel flag from keystroke
+						if( keystrokeHandler.getCancelStatus() )
+							return;
+
+						var ranges = editor.getSelection().getRanges();
+
+						for ( var i = 0 ; i < ranges.length ; i++ )
+						{
+							var range = ranges[i];
+
+							if( !range.startContainer.equals( range.endContainer ) )
+							{
+								var startOfBlock = range.checkStartOfBlock(),
+									endOfBlock = range.checkEndOfBlock();
+
+								var domEvent = evt.data;
+
+								//catch inserted key
+								var key = domEvent.getKey()
+
+
+								//execute functionality only if selection is on start or on end of block in other case browser work correct
+								if( !stopType && ( startOfBlock || endOfBlock ) )
+								{
+									range.deleteContents();
+
+									//get inserted char
+									var myChar = String.fromCharCode( key );
+
+									var temp = new CKEDITOR.dom.text( myChar );
+									range = editor.getSelection().getRanges()[0];
+									range.insertNode( temp );
+
+									range.setStartAfter( temp );
+
+									var currentNode;
+									var walker = new CKEDITOR.dom.walker( range );
+
+									//looking for list child
+									walker.evaluator = function(node){
+										return ( node.getParent().getName() in listNodeNames )
+									}
+
+									while( currentNode = walker.next() )
+									{
+										//get nested list content
+										var subList = currentNode.getFirst( function( node ){ return node.type == CKEDITOR.NODE_ELEMENT && node.is( 'ol', 'ul' ); } );
+
+										//check if list has empty items
+										if( subList )
+										{
+											var children = subList.getChildren(),
+											count = children.count(),
+											child;
+
+											for ( i = count - 1 ; i >= 0 ; i-- )
+											{
+												//look for empty list item
+												if ( ( child = children.getItem( i ) ) && child.is && child.is( 'li' ) && child.getText() != ''  )
+												{
+													//move list content
+													var newParent = temp.getAscendant( 'li', true );
+
+													//move children of nested list. we dont check nested list contains just move them
+													if( newParent )
+														subList.move( newParent );
+
+													break;
+												}
+											}
+										}
+
+										//remove unnecessary node
+										currentNode.remove();
+
+										//update range
+										var ascendant = temp.getAscendant( 'li', true );
+
+										if( ascendant )
+										 range.moveToElementEditEnd( ascendant );
+
+										range.select();
+									}
+									evt.data.preventDefault();
+								}
+							}
+						}
+					}
+				})
+			})
 		},
 
 		afterInit : function ( editor )
