Index: wp-admin/includes/nav-menu.php
===================================================================
--- wp-admin/includes/nav-menu.php	(revision 15204)
+++ wp-admin/includes/nav-menu.php	(working copy)
@@ -38,6 +38,9 @@
 	 * @param object $args
 	 */
 	function start_el(&$output, $item, $depth, $args) {
+		global $_wp_nav_menu_max_depth;
+		$_wp_nav_menu_max_depth = $depth > $_wp_nav_menu_max_depth ? $depth : $_wp_nav_menu_max_depth;
+
 		$indent = ( $depth ) ? str_repeat( "\t", $depth ) : '';
 
 		ob_start();
Index: wp-admin/js/nav-menu.dev.js
===================================================================
--- wp-admin/js/nav-menu.dev.js	(revision 15204)
+++ wp-admin/js/nav-menu.dev.js	(working copy)
@@ -242,13 +242,18 @@
 		initSortables : function() {
 			var currentDepth = 0, originalDepth, minDepth, maxDepth,
 				prev, next, prevBottom, nextThreshold, helperHeight, transport,
-				menuLeft = api.menuList.offset().left;
+				menuEdge = api.menuList.offset().left,
+				body = $('body'), maxChildDepth,
+				menuMaxDepth = initialMenuMaxDepth();
 
+			// Use the right edge if RTL.
+			menuEdge += api.isRTL ? api.menuList.width() : 0;
+
 			api.menuList.sortable({
 				handle: '.menu-item-handle',
 				placeholder: 'sortable-placeholder',
 				start: function(e, ui) {
-					var height, width, parent, children, maxChildDepth, tempHolder;
+					var height, width, parent, children, tempHolder;
 
 					// handle placement for rtl orientation
 					if ( api.isRTL )
@@ -307,8 +312,10 @@
 					if( depthChange != 0 ) {
 						ui.item.updateDepthClass( currentDepth );
 						children.shiftDepthClass( depthChange );
-						api.registerChange();
+						updateMenuMaxDepth( depthChange );
 					}
+					// Register a change
+					api.registerChange();
 					// Update the item data.
 					ui.item.updateParentMenuItemDBId();
 
@@ -321,6 +328,8 @@
 						ui.item[0].style.right = 0;
 					}
 
+					// The width of the tab bar might have changed. Just in case.
+					api.refreshMenuTabs( true );
 				},
 				change: function(e, ui) {
 					// Make sure the placeholder is inside the menu.
@@ -332,7 +341,8 @@
 				},
 				sort: function(e, ui) {
 					var offset = ui.helper.offset(),
-						depth = api.negateIfRTL * api.pxToDepth( offset.left - menuLeft );
+						edge = api.isRTL ? offset.left + ui.helper.width() : offset.left,
+						depth = api.negateIfRTL * api.pxToDepth( edge - menuEdge );
 					// Check and correct if depth is not within range.
 					// Also, if the dragged element is dragged upwards over
 					// an item, shift the placeholder to a child position.
@@ -348,9 +358,6 @@
 						updateSharedVars( ui );
 						$(this).sortable( "refreshPositions" );
 					}
-				},
-				update: function(e, ui) {
-					api.registerChange();
 				}
 			});
 
@@ -378,6 +385,29 @@
 				ui.placeholder.updateDepthClass( depth, currentDepth );
 				currentDepth = depth;
 			}
+
+			function initialMenuMaxDepth() {
+				if( ! body[0].className ) return 0;
+				var match = body[0].className.match(/menu-max-depth-(\d+)/);
+				return match && match[1] ? parseInt(match[1]) : 0;
+			}
+
+			function updateMenuMaxDepth( depthChange ) {
+				var depth, newDepth = menuMaxDepth;
+				if ( depthChange === 0 ) {
+					return;
+				} else if ( depthChange > 0 ) {
+					depth = maxChildDepth + depthChange;
+					if( depth > menuMaxDepth )
+						newDepth = depth;
+				} else if ( depthChange < 0 && maxChildDepth == menuMaxDepth ) {
+					while( ! $('.menu-item-depth-' + newDepth, api.menuList).length && newDepth > 0 )
+						newDepth--;
+				}
+				// Update the depth class.
+				body.removeClass( 'menu-max-depth-' + menuMaxDepth ).addClass( 'menu-max-depth-' + newDepth );
+				menuMaxDepth = newDepth;
+			}
 		},
 
 		attachMenuEditListeners : function() {
@@ -664,13 +694,23 @@
 				marginFixed = api.isRTL ? 'margin-left' : 'margin-right',
 				msPerPx = 2;
 
-			function resetMenuTabs() {
+			/**
+			 * Refreshes the menu tabs.
+			 * Will show and hide arrows where necessary.
+			 * Scrolls to the active tab by default.
+			 * 
+			 * @param savePosition {boolean} Optional. Prevents scrolling so
+			 * 		  that the current position is maintained. Default false. 
+			 **/
+			api.refreshMenuTabs = function( savePosition ) {
 				var fixedWidth = fixed.width(),
 					margin = 0, css = {};
 				fixedLeft = fixed.offset().left;
 				fixedRight = fixedLeft + fixedWidth;
-				active.makeTabVisible();
 
+				if( !savePosition )
+					active.makeTabVisible();
+
 				// Prevent space from building up next to the last tab if there's more to show
 				if( tabs.last().isTabVisible() ) {
 					margin = fixed.width() - tabsWidth;
@@ -731,11 +771,11 @@
 			fixed.wrap('<div class="nav-tabs-nav"/>').parent().prepend( arrowLeft ).append( arrowRight );
 
 			// Set the menu tabs
-			resetMenuTabs();
+			api.refreshMenuTabs();
 			// Make sure the tabs reset on resize
 			$(window).resize(function() {
 				if( resizeTimer ) clearTimeout(resizeTimer);
-				resizeTimer = setTimeout( resetMenuTabs, 200);
+				resizeTimer = setTimeout( api.refreshMenuTabs, 200);
 			});
 
 			// Build arrow functions
Index: wp-admin/nav-menus.php
===================================================================
--- wp-admin/nav-menus.php	(revision 15204)
+++ wp-admin/nav-menus.php	(working copy)
@@ -430,6 +430,22 @@
 	$nav_menus[$key]->truncated_name = $_nav_menu->truncated_name;
 }
 
+// Ensure the user will be able to scroll horizontally
+// by adding a class for the max menu depth.
+global $_wp_nav_menu_max_depth;
+$_wp_nav_menu_max_depth = 0;
+
+// Calling wp_get_nav_menu_to_edit generates $_wp_nav_menu_max_depth
+if ( is_nav_menu( $nav_menu_selected_id ) )
+	$edit_markup = wp_get_nav_menu_to_edit( $nav_menu_selected_id  );
+
+function wp_nav_menu_max_depth() {
+	global $_wp_nav_menu_max_depth;
+	return "menu-max-depth-$_wp_nav_menu_max_depth";
+}
+
+add_action('admin_body_class','wp_nav_menu_max_depth');
+
 wp_nav_menu_setup();
 wp_initial_nav_menu_meta_boxes();
 
@@ -564,18 +580,16 @@
 					<div id="post-body">
 						<div id="post-body-content">
 							<?php
-							if ( is_nav_menu( $nav_menu_selected_id ) ) :
-								$edit_markup = wp_get_nav_menu_to_edit( $nav_menu_selected_id  );
-								if ( ! is_wp_error( $edit_markup ) ) :
+							if ( isset( $edit_markup ) ) {
+								if ( ! is_wp_error( $edit_markup ) )
 									echo $edit_markup;
-								endif;
-							elseif ( empty( $nav_menu_selected_id ) ) :
+							} else if ( empty( $nav_menu_selected_id ) ) {
 								echo '<div class="post-body-plain">';
 								echo '<p>' . __('To create a custom menu, give it a name above and click Create Menu. Then choose items like pages, categories or custom links from the left column to add to this menu.') . '</p>';
 								echo '<p>' . __('After you have added your items, drag and drop to put them in the order you want. You can also click each item to reveal additional configuration options.') . '</p>';
 								echo '<p>' . __('When you have finished building your custom menu, make sure you click the Save Menu button.') . '</p>';
 								echo '</div>';
-							endif;
+							}
 							?>
 						</div><!-- /#post-body-content -->
 					</div><!-- /#post-body -->
Index: wp-admin/css/nav-menu-rtl.dev.css
===================================================================
--- wp-admin/css/nav-menu-rtl.dev.css	(revision 15204)
+++ wp-admin/css/nav-menu-rtl.dev.css	(working copy)
@@ -103,7 +103,7 @@
 	padding-left: 0;
 }
 .menu-item-edit-active .menu-item-handle {
-	-moz-border-radius: 6px 0 0 6px;
+	-moz-border-radius: 6px 6px 0 0;
 	-webkit-border-bottom-left-radius: 0;
 	-webkit-border-bottom-right-radius: 0;
 	-khtml-border-bottom-left-radius: 0;
Index: wp-admin/css/nav-menu.dev.css
===================================================================
--- wp-admin/css/nav-menu.dev.css	(revision 15204)
+++ wp-admin/css/nav-menu.dev.css	(working copy)
@@ -377,6 +377,19 @@
 .menu-item-depth-10 .menu-item-transport { margin-left: -300px; }
 .menu-item-depth-11 .menu-item-transport { margin-left: -330px; }
 
+body.menu-max-depth-0 { min-width: 950px !important; }
+body.menu-max-depth-1 { min-width: 980px !important; }
+body.menu-max-depth-2 { min-width: 1010px !important; }
+body.menu-max-depth-3 { min-width: 1040px !important; }
+body.menu-max-depth-4 { min-width: 1070px !important; }
+body.menu-max-depth-5 { min-width: 1100px !important; }
+body.menu-max-depth-6 { min-width: 1130px !important; }
+body.menu-max-depth-7 { min-width: 1160px !important; }
+body.menu-max-depth-8 { min-width: 1190px !important; }
+body.menu-max-depth-9 { min-width: 1220px !important; }
+body.menu-max-depth-10 { min-width: 1250px !important; }
+body.menu-max-depth-11 { min-width: 1280px !important; }
+
 /* Menu item controls */
 .item-type { text-transform: uppercase; font-size: 11px; color: #999999; padding-right: 10px; }
 .item-controls { font-size: 11px; position: absolute; right: 20px; top: -1px; }
