Index: CKEditor/branches/versions/3.3.x/CHANGES.html
===================================================================
--- CKEditor/branches/versions/3.3.x/CHANGES.html	(revision 5306)
+++ CKEditor/branches/versions/3.3.x/CHANGES.html	(revision 5307)
@@ -62,4 +62,5 @@
 		<li><a href="http://dev.fckeditor.net/ticket/5216">#5216</a> : Extend CKEDITOR.appendTo to allow a data parameter for the initial value.</li>
 		<li><a href="http://dev.fckeditor.net/ticket/5352">#5352</a> : Allow to define the stylesSet array in the config object for the editor.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3893">#3893</a> : It's now possible to indent/outdent the entire list when selecting the first list item.</li>
 	</ul>
 	<p>
Index: CKEditor/branches/versions/3.3.x/_source/core/dom/elementpath.js
===================================================================
--- CKEditor/branches/versions/3.3.x/_source/core/dom/elementpath.js	(revision 5306)
+++ CKEditor/branches/versions/3.3.x/_source/core/dom/elementpath.js	(revision 5307)
@@ -101,4 +101,14 @@
 
 		return true;
+	},
+
+	contains : function( tagNames )
+	{
+		var elements = this.elements;
+		for ( var i = 0 ; i < elements.length ; i++ )
+		{
+			if ( elements[ i ].getName() in tagNames )
+				return elements[ i ];
+		}
 	}
 };
Index: CKEditor/branches/versions/3.3.x/_source/plugins/indent/plugin.js
===================================================================
--- CKEditor/branches/versions/3.3.x/_source/plugins/indent/plugin.js	(revision 5306)
+++ CKEditor/branches/versions/3.3.x/_source/plugins/indent/plugin.js	(revision 5307)
@@ -1,3 +1,3 @@
-﻿/*
+/*
 Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved.
 For licensing, see LICENSE.html or http://ckeditor.com/license
@@ -19,36 +19,11 @@
 	function onSelectionChange( evt )
 	{
-		var elements = evt.data.path.elements,
-			listNode, listItem,
-			editor = evt.editor;
-
-		for ( var i = 0 ; i < elements.length ; i++ )
-		{
-			if ( elements[i].getName() == 'li' )
-			{
-				listItem = elements[i];
-				continue;
-			}
-			if ( listNodeNames[ elements[i].getName() ] )
-			{
-				listNode = elements[i];
-				break;
-			}
-		}
-
-		if ( listNode )
-		{
-			if ( this.name == 'outdent' )
+		var editor = evt.editor;
+
+		var elementPath = evt.data.path,
+				list = elementPath && elementPath.contains( listNodeNames );
+
+		if ( list )
 				return setState.call( this, editor, CKEDITOR.TRISTATE_OFF );
-			else
-			{
-				while ( listItem && ( listItem = listItem.getPrevious( CKEDITOR.dom.walker.whitespaces( true ) ) ) )
-				{
-					if ( listItem.getName && listItem.getName() == 'li' )
-						return setState.call( this, editor, CKEDITOR.TRISTATE_OFF );
-				}
-				return setState.call( this, editor, CKEDITOR.TRISTATE_DISABLED );
-			}
-		}
 
 		if ( !this.useIndentClasses && this.name == 'indent' )
@@ -207,10 +182,13 @@
 		var block;
 		while ( ( block = iterator.getNextParagraph() ) )
-		{
-
+			indentElement.call( this, editor, block );
+	}
+
+	function indentElement( editor, element )
+		{
 			if ( this.useIndentClasses )
 			{
 				// Transform current class name to indent step index.
-				var indentClass = block.$.className.match( this.classNameRegex ),
+			var indentClass = element.$.className.match( this.classNameRegex ),
 					indentStep = 0;
 				if ( indentClass )
@@ -226,26 +204,35 @@
 				else
 					indentStep++;
+
+			if ( indentStep < 0 )
+				return false;
+
 				indentStep = Math.min( indentStep, editor.config.indentClasses.length );
 				indentStep = Math.max( indentStep, 0 );
-				var className = CKEDITOR.tools.ltrim( block.$.className.replace( this.classNameRegex, '' ) );
+			var className = CKEDITOR.tools.ltrim( element.$.className.replace( this.classNameRegex, '' ) );
 				if ( indentStep < 1 )
-					block.$.className = className;
+				element.$.className = className;
 				else
-					block.$.className = CKEDITOR.tools.ltrim( className + ' ' + editor.config.indentClasses[ indentStep - 1 ] );
+				element.addClass( editor.config.indentClasses[ indentStep - 1 ] );
 			}
 			else
 			{
-				var currentOffset = parseInt( block.getStyle( this.indentCssProperty ), 10 );
+			var currentOffset = parseInt( element.getStyle( this.indentCssProperty ), 10 );
 				if ( isNaN( currentOffset ) )
 					currentOffset = 0;
 				currentOffset += ( this.name == 'indent' ? 1 : -1 ) * editor.config.indentOffset;
+
+			if ( currentOffset < 0 )
+				return false;
+
 				currentOffset = Math.max( currentOffset, 0 );
 				currentOffset = Math.ceil( currentOffset / editor.config.indentOffset ) * editor.config.indentOffset;
-				block.setStyle( this.indentCssProperty, currentOffset ? currentOffset + editor.config.indentUnit : '' );
-				if ( block.getAttribute( 'style' ) === '' )
-					block.removeAttribute( 'style' );
-			}
-		}
-	}
+			element.setStyle( this.indentCssProperty, currentOffset ? currentOffset + editor.config.indentUnit : '' );
+			if ( element.getAttribute( 'style' ) === '' )
+				element.removeAttribute( 'style' );
+			}
+
+		return true;
+		}
 
 	function indentCommand( editor, name )
@@ -265,4 +252,6 @@
 	}
 
+	function isListItem( node ){ return node.type = CKEDITOR.NODE_ELEMENT && node.is( 'li' ) };
+
 	indentCommand.prototype = {
 		exec : function( editor )
@@ -271,9 +260,8 @@
 				range = selection && selection.getRanges()[0];
 
-			if ( !selection || !range )
-				return;
-
-			var bookmarks = selection.createBookmarks( true ),
-				nearestListBlock = range.getCommonAncestor();
+			var startContainer = range.startContainer,
+				endContainer = range.endContainer,
+				rangeRoot = range.getCommonAncestor(),
+				nearestListBlock = rangeRoot;
 
 			while ( nearestListBlock && !( nearestListBlock.type == CKEDITOR.NODE_ELEMENT &&
@@ -281,6 +269,37 @@
 				nearestListBlock = nearestListBlock.getParent();
 
-			if ( nearestListBlock )
+			// Avoid selection anchors under list root.
+			// <ul>[<li>...</li>]</ul> =>	<ul><li>[...]</li></ul>
+			if ( nearestListBlock && startContainer.type == CKEDITOR.NODE_ELEMENT
+				&& startContainer.getName() in listNodeNames )
+			{
+				var walker = new CKEDITOR.dom.walker( range );
+				walker.evaluator = isListItem;
+				range.startContainer = walker.next();
+			}
+
+			if ( nearestListBlock && endContainer.type == CKEDITOR.NODE_ELEMENT
+				&& endContainer.getName() in listNodeNames )
+			{
+				var walker = new CKEDITOR.dom.walker( range );
+				walker.evaluator = isListItem;
+				range.endContainer = walker.previous();
+			}
+
+			var bookmarks = selection.createBookmarks( true );
+
+			if ( nearestListBlock  )
+			{
+				var firstListItem = nearestListBlock.getFirst( function( node )
+					{
+						return node.type == CKEDITOR.NODE_ELEMENT && node.is( 'li' );
+					}),
+					rangeStart = range.startContainer,
+					indentWholeList = firstListItem.equals( rangeStart ) || firstListItem.contains( rangeStart );
+
+				// Indent the entire list if  cursor is inside the first list item. (#3893)
+				if ( !( indentWholeList && indentElement.call( this, editor, nearestListBlock ) ) )
 				indentList.call( this, editor, range, nearestListBlock );
+			}
 			else
 				indentBlock.call( this, editor, range );
@@ -317,4 +336,15 @@
 			editor.on( 'selectionChange', CKEDITOR.tools.bind( onSelectionChange, indent ) );
 			editor.on( 'selectionChange', CKEDITOR.tools.bind( onSelectionChange, outdent ) );
+
+			// [IE6/7] Raw lists are using margin instead of padding for visual indentation in wysiwyg mode. (#3893)
+			if ( CKEDITOR.env.ie6Compat || CKEDITOR.env.ie7Compat )
+			{
+				editor.addCss(
+					"ul,ol" +
+					"{" +
+					"	margin-left: 0px;" +
+					"	padding-left: 40px;" +
+					"}" );
+			}
 		},
 
