Index: /CKEditor/trunk/CHANGES.html
===================================================================
--- /CKEditor/trunk/CHANGES.html	(revision 4170)
+++ /CKEditor/trunk/CHANGES.html	(revision 4171)
@@ -51,5 +51,6 @@
 		<li><a href="http://dev.fckeditor.net/ticket/3898">#3898</a> : Added validation for URL presentance in Image dialog.</li>
 		<li><a href="http://dev.fckeditor.net/ticket/4241">#4241</a> : Float panels are left on screen while editor is destroyed.</li>		
-		<li><a href="http://dev.fckeditor.net/ticket/4274">#4274</a> : Double click event is incorrect handled in 'divreplace' sample.</li>		
+		<li><a href="http://dev.fckeditor.net/ticket/4274">#4274</a> : Double click event is incorrect handled in 'divreplace' sample.</li>	
+		<li><a href="http://dev.fckeditor.net/ticket/4354">#4354</a> : Fixed TAB key on toolbar to not focus disabled buttons.</li>	
 	</ul>
 	<h3>
Index: /CKEditor/trunk/_source/plugins/toolbar/plugin.js
===================================================================
--- /CKEditor/trunk/_source/plugins/toolbar/plugin.js	(revision 4170)
+++ /CKEditor/trunk/_source/plugins/toolbar/plugin.js	(revision 4171)
@@ -60,4 +60,8 @@
 			var itemKeystroke = function( item, keystroke )
 			{
+				function isDisabled( item )
+				{
+					return item.id && CKEDITOR.document.getById( item.id ).hasClass( 'cke_disabled' );
+				}
 				switch ( keystroke )
 				{
@@ -65,5 +69,7 @@
 					case 9 :					// TAB
 						// Look for the next item in the toolbar.
-						while ( ( item = item.next || ( item.toolbar.next && item.toolbar.next.items[ 0 ] ) ) && !item.focus )
+						// Jump to next toolbar if this one finishes.
+						// Skip non-focusable items (eg separators) and disabled ones also.
+						while ( ( item = item.next || ( item.toolbar.next && item.toolbar.next.items[ 0 ] ) ) && ( !item.focus || isDisabled( item ) ) )
 						{ /*jsl:pass*/ }
 
@@ -80,5 +86,7 @@
 					case CKEDITOR.SHIFT + 9 :	// SHIFT + TAB
 						// Look for the previous item in the toolbar.
-						while ( ( item = item.previous || ( item.toolbar.previous && item.toolbar.previous.items[ item.toolbar.previous.items.length - 1 ] ) ) && !item.focus )
+						// Jump to previous toolbar if this one finishes.
+						// Skip non-focusable items (eg separators) and disabled ones also.
+						while ( ( item = item.previous || ( item.toolbar.previous && item.toolbar.previous.items[ item.toolbar.previous.items.length - 1 ] ) ) && ( !item.focus || isDisabled( item ) ) )
 						{ /*jsl:pass*/ }
 
