Index: wp-admin/js/nav-menu.dev.js
===================================================================
--- wp-admin/js/nav-menu.dev.js	(revision 14516)
+++ wp-admin/js/nav-menu.dev.js	(working copy)
@@ -163,9 +163,17 @@
 		},
 
 		initSortables : function() {
-			var currentDepth = 0, originalDepth, minDepth, maxDepth,
-				menuLeft = api.menuList.offset().left,
-				newItem, transport;
+			var sort = {
+				currentDepth : 0,
+				originalDepth : 0,
+				minDepth : 0,
+				maxDepth : 0,
+				menuLeft : api.menuList.offset().left,
+				prevBottom : 0,
+				prev : $(),
+				next : $(),
+				transport : undefined
+			};
 
 			api.menuList.sortable({
 				handle: '.menu-item-handle',
@@ -173,23 +181,23 @@
 				start: function(e, ui) {
 					var height, width, parent, children, maxChildDepth;
 
-					transport = ui.item.children('.menu-item-transport');
+					sort.transport = ui.item.children('.menu-item-transport');
 				
 					// Set depths. currentDepth must be set before children are located.
-					originalDepth = ( newItem ) ? 0 : ui.item.menuItemDepth();
-					updateCurrentDepth(ui, originalDepth);
+					sort.originalDepth = ui.item.menuItemDepth();
+					updateCurrentDepth(ui, sort.originalDepth);
 				
 					// Attach child elements to parent
 					// Skip the placeholder
 					parent = ( ui.item.next()[0] == ui.placeholder[0] ) ? ui.item.next() : ui.item;
 					children = parent.childMenuItems();
-					transport.append( children );
+					sort.transport.append( children );
 
 					// Now that the element is complete, we can update...
 					updateDepthRange(ui);
 
 					// Update the height of the placeholder to match the moving item.
-					height = transport.outerHeight();
+					height = sort.transport.outerHeight();
 					// If there are children, account for distance between top of children and parent
 					height += ( height > 0 ) ? (ui.placeholder.css('margin-top').slice(0, -2) * 1) : 0;
 					height += ui.helper.outerHeight();
@@ -197,27 +205,30 @@
 					ui.placeholder.height(height);
 
 					// Update the width of the placeholder to match the moving item.
-					maxChildDepth = originalDepth;
+					maxChildDepth = sort.originalDepth;
 					children.each(function(){
 						var depth = $(this).menuItemDepth();
 						maxChildDepth = (depth > maxChildDepth) ? depth : maxChildDepth;
 					});
 					width = ui.helper.find('.menu-item-handle').outerWidth(); // Get original width
-					width += api.depthToPx(maxChildDepth - originalDepth); // Account for children
+					width += api.depthToPx(maxChildDepth - sort.originalDepth); // Account for children
 					width -= 2; // Subtract 2 for borders
 					ui.placeholder.width(width);
 				},
 				stop: function(e, ui) {
-					var children, depthChange = currentDepth - originalDepth;
+					var children, depthChange = sort.currentDepth - sort.originalDepth;
 
 					// Return child elements to the list
-					children = transport.children().insertAfter(ui.item);
+					children = sort.transport.children().insertAfter(ui.item);
 				
 					// Update depth classes
 					if( depthChange != 0 ) {
-						ui.item.updateDepthClass( currentDepth );
+						ui.item.updateDepthClass( sort.currentDepth );
 						children.shiftDepthClass( depthChange );
 					}
+					
+					// Unhighlight the parent
+					sort.prev.removeClass('menu-item-highlight');
 					// Update the item data.
 					ui.item.updateParentMenuItemDBId();
 					// Update positions
@@ -232,12 +243,22 @@
 					updateDepthRange(ui);
 				},
 				sort: function(e, ui) {
-					var depth = api.pxToDepth(ui.helper.offset().left - menuLeft);
+					var offset = ui.helper.offset();
+						depth = api.pxToDepth(offset.left - sort.menuLeft);
+						
 					// Check and correct if depth is not within range.
-					if ( depth < minDepth ) depth = minDepth;
-					else if ( depth > maxDepth ) depth = maxDepth;
+					if ( depth < sort.minDepth ) depth = sort.minDepth;
+					else if ( depth > sort.maxDepth ) depth = sort.maxDepth;
+					
+					// If element is over another element, highlight and shift placeholder to max
+					if ( offset.top < sort.prevBottom ) {
+						sort.prev.addClass('menu-item-highlight');
+						depth = sort.maxDepth;
+					} else {
+						sort.prev.removeClass('menu-item-highlight');
+					}	
 
-					if( depth != currentDepth )
+					if( depth != sort.currentDepth )
 						updateCurrentDepth(ui, depth);
 				}
 			});
@@ -249,18 +270,23 @@
 				// Make sure we don't select the moving item.
 				if( prev[0] == ui.item[0] ) prev = prev.prev();
 				if( next[0] == ui.item[0] ) next = next.next();
+				
+				sort.prev.removeClass('menu-item-highlight');
+				sort.prev = prev;
+				sort.next = next;
+				
+				sort.prevBottom = (prev.length) ? prev.offset().top + prev.height() : 0;
+				sort.minDepth = (next.length) ? next.menuItemDepth() : 0;
 
-				minDepth = (next.length) ? next.menuItemDepth() : 0;
-
 				if( prev.length )
-					maxDepth = ( (depth = prev.menuItemDepth() + 1) > api.options.globalMaxDepth ) ? api.options.globalMaxDepth : depth;
+					sort.maxDepth = ( (depth = prev.menuItemDepth() + 1) > api.options.globalMaxDepth ) ? api.options.globalMaxDepth : depth;
 				else
-					maxDepth = 0;
+					sort.maxDepth = 0;
 			}
 
 			function updateCurrentDepth(ui, depth) {
-				ui.placeholder.updateDepthClass( depth, currentDepth );
-				currentDepth = depth;
+				ui.placeholder.updateDepthClass( depth, sort.currentDepth );
+				sort.currentDepth = depth;
 			}
 		},
 
Index: wp-admin/css/nav-menu.dev.css
===================================================================
--- wp-admin/css/nav-menu.dev.css	(revision 14516)
+++ wp-admin/css/nav-menu.dev.css	(working copy)
@@ -304,6 +304,10 @@
 .menu li.deleting .menu-item-handle {
 	background-color:#faa;
 }
+.menu-item-highlight .menu-item-handle {
+	background: #ffffe0;
+	border: 1px solid #e6db55;
+}
 
 .menu-item-handle .item-title {
 	padding: 7px 0;
