Index: src/wp-includes/post.php
===================================================================
--- src/wp-includes/post.php	(revision 35828)
+++ src/wp-includes/post.php	(working copy)
@@ -2410,6 +2410,16 @@
 		}
 	}
 
+	if ( $post->post_type == 'nav_menu_item') {
+
+		// Get this menu item's parent
+		$parent_menu_id = (int)get_post_meta ( $post->ID, '_menu_item_menu_item_parent', true );
+
+		// Move all children of this nav menu to the parent
+		$children_query = $wpdb->prepare("UPDATE $wpdb->postmeta SET meta_value = %d WHERE meta_key = '_menu_item_menu_item_parent' AND meta_value= %s", $parent_menu_id, $post->ID);
+		$wpdb->query ( $children_query );
+	}
+
 	// Do raw query. wp_get_post_revisions() is filtered.
 	$revision_ids = $wpdb->get_col( $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE post_parent = %d AND post_type = 'revision'", $postid ) );
 	// Use wp_delete_post (via wp_delete_post_revision) again. Ensures any meta/misplaced data gets cleaned up.
@@ -2461,6 +2471,15 @@
 			clean_post_cache( $child );
 	}
 
+	if ( $post->post_type == 'nav_menu_item' && $parent_menu_id) {
+		$children_query = $wpdb->prepare("SELECT post_id FROM $wpdb->postmeta WHERE meta_key = '_menu_item_menu_item_parent' AND meta_value=%s", $parent_menu_id);
+		$children = $wpdb->get_col ( $children_query );
+
+		foreach ( $children as $child )
+			clean_post_cache( $child );
+
+	}
+
 	wp_clear_scheduled_hook('publish_future_post', array( $postid ) );
 
 	/**
Index: tests/phpunit/tests/post/nav-menu.php
===================================================================
--- tests/phpunit/tests/post/nav-menu.php	(revision 35828)
+++ tests/phpunit/tests/post/nav-menu.php	(working copy)
@@ -180,4 +180,61 @@
 
 		$this->assertEquals( $nav_menus_names, $expected_nav_menus_names );
 	}
+
+	/**
+	 * @ticket 34803
+	 */
+	function test_delete_child_menu_with_grandchildren_present() {
+
+		// Create a new menu
+		$menuId = wp_create_nav_menu( rand_str() );
+		$menu = wp_get_nav_menu_object($menuId);
+		$this->assertSame($menuId, $menu->term_id);
+
+		// Add grandparent nav menu item
+		// and confirm it saved properly
+		$grandparent = wp_update_nav_menu_item( $menuId, 0, array(
+			'menu-item-type'      => 'custom',
+			'menu-item-title'     => 'Grandparent',
+			'menu-item-link'      => 'http://wordpress.org',
+			'menu-item-status'    => 'publish'
+		) );
+		$custom_item = wp_setup_nav_menu_item( get_post( $grandparent ) );
+		$this->assertEquals( 'Grandparent', $custom_item->title );
+
+		// Add parent nav menu item
+		// and confirm it saved properly
+		$parent = wp_update_nav_menu_item( $menuId, 0, array(
+			'menu-item-type'      => 'custom',
+			'menu-item-title'     => 'Parent',
+			'menu-item-link'      => 'http://wordpress.org',
+			'menu-item-status'    => 'publish',
+			'menu-item-parent-id' => $grandparent
+		) );
+		$custom_item = wp_setup_nav_menu_item( get_post( $parent ) );
+		$this->assertEquals( 'Parent', $custom_item->title );
+
+		// Add child nav menu item
+		// and confirm it saved properly
+		$child = wp_update_nav_menu_item( $menuId, 0, array(
+			'menu-item-type'      => 'custom',
+			'menu-item-title'     => 'Child',
+			'menu-item-link'      => 'http://wordpress.org',
+			'menu-item-status'    => 'publish',
+			'menu-item-parent-id' => $parent
+		) );
+		$custom_item = wp_setup_nav_menu_item( get_post( $child ) );
+		$this->assertEquals( 'Child', $custom_item->title );
+
+		// Delete the Parent menu item
+		wp_delete_post( $parent, true );
+		$deletedPost = get_post( $parent );
+		$this->assertNull( $deletedPost );
+
+		// Verify that the child is now associated directly with the grandparent
+		$newParentMenuItemId = get_post_meta( $child, '_menu_item_menu_item_parent', true );
+		$this->assertEquals( $grandparent, (int)$newParentMenuItemId );
+
+	}
+
 }
