Index: src/wp-admin/js/nav-menu.js
===================================================================
--- src/wp-admin/js/nav-menu.js	(revision 36386)
+++ src/wp-admin/js/nav-menu.js	(working copy)
@@ -43,6 +43,7 @@
 
 			this.attachQuickSearchListeners();
 			this.attachThemeLocationsListeners();
+			this.attachMenuSaveSubmitListeners();
 
 			this.attachTabsPanelListeners();
 
@@ -834,6 +835,30 @@
 			});
 		},
 
+		attachMenuSaveSubmitListeners : function() {
+			/*
+			 * When a navigation menu is saved, store a JSON representation of all form data
+			 * in a single input to avoid PHP max_post_vars limitations. See #14134.
+			 */ 
+			$('#update-nav-menu').submit(function() {
+				var navMenuData = {};
+				$('#update-nav-menu input').each(function(index, element) {
+					var name = $(element).attr('name');
+					var regex = /(.*)(?:\[(\d+)\])/;
+					if ( regex.test( name ) ) {
+						var matches = regex.exec(name);
+						if ( ! navMenuData[matches[1]] ) {
+							navMenuData[matches[1]] = [];
+						}
+						navMenuData[matches[1]][matches[2]] = $(element).val();
+					} else {
+						navMenuData[name] = $(element).val();
+					}
+				});
+				$('[name="nav-menu-data"]').val( JSON.stringify( navMenuData ) );
+			});
+		},
+
 		attachThemeLocationsListeners : function() {
 			var loc = $('#nav-menu-theme-locations'), params = {};
 			params.action = 'menu-locations-save';
Index: src/wp-admin/nav-menus.php
===================================================================
--- src/wp-admin/nav-menus.php	(revision 36386)
+++ src/wp-admin/nav-menus.php	(working copy)
@@ -49,6 +49,16 @@
 // Allowed actions: add, update, delete
 $action = isset( $_REQUEST['action'] ) ? $_REQUEST['action'] : 'edit';
 
+/*
+ * If a JSON blob of navigation menu data is found, expand it and fill PHP $_POST
+ * vars to avoid PHP max_post_vars limitations. See #14134.
+ */
+if ( isset( $_POST['nav-menu-data'] ) ) {
+	$data = json_decode( stripslashes( $_POST['nav-menu-data'] ) );
+	foreach ( $data as $post_var => $post_data ) {
+		$_POST[$post_var] = $post_data;
+	}
+}
 switch ( $action ) {
 	case 'add-menu-item':
 		check_admin_referer( 'add-menu_item', 'menu-settings-column-nonce' );
@@ -731,6 +741,7 @@
 		<div id="menu-management">
 			<form id="update-nav-menu" method="post" enctype="multipart/form-data">
 				<div class="menu-edit <?php if ( $add_new_screen ) echo 'blank-slate'; ?>">
+					<input type="hidden" name="nav-menu-data">
 					<?php
 					wp_nonce_field( 'closedpostboxes', 'closedpostboxesnonce', false );
 					wp_nonce_field( 'meta-box-order', 'meta-box-order-nonce', false );
