diff --git a/phpBB/adm/style/ajax.js b/phpBB/adm/style/ajax.js
index 4ad6b6afa5..3c1c57505b 100644
--- a/phpBB/adm/style/ajax.js
+++ b/phpBB/adm/style/ajax.js
@@ -62,7 +62,137 @@ phpbb.addAjaxCallback('row_delete', function(res) {
 	}
 });
 
+/**
+ * Handler for submitting permissions form in chunks
+ * This call will submit permissions forms in chunks of 5 fieldsets.
+ */
+function submitPermissions() {
+	var $form = $('form#set-permissions'),
+		fieldsetList = $form.find('fieldset[id^=perm]'),
+		formDataSets = [],
+		dataSetIndex = 0,
+		$submitAllButton = $form.find('input[type=submit][name^=action]')[0],
+		$submitButton = $form.find('input[type=submit][data-clicked=true]')[0];
 
+	// Set proper start values for handling refresh of page
+	var permissionSubmitSize = 0,
+		permissionRequestCount = 0,
+		forumIds = [],
+		permissionSubmitFailed = false;
+
+	if ($submitAllButton !== $submitButton) {
+		fieldsetList = $form.find('fieldset#' + $submitButton.closest('fieldset.permissions').id);
+	}
+
+	$.each(fieldsetList, function (key, value) {
+		dataSetIndex = Math.floor(key / 5);
+		var $fieldset = $('fieldset#' + value.id);
+		if (key % 5 === 0) {
+			formDataSets[dataSetIndex] = $fieldset.find('select:visible, input:not([data-name])').serialize();
+		} else {
+			formDataSets[dataSetIndex] += '&' + $fieldset.find('select:visible, input:not([data-name])').serialize();
+		}
+
+		// Find proper role value
+		var roleInput = $fieldset.find('input[name^=role][data-name]');
+		if (roleInput.val()) {
+			formDataSets[dataSetIndex] += '&' + roleInput.attr('name') + '=' + roleInput.val();
+		} else {
+			formDataSets[dataSetIndex] += '&' + roleInput.attr('name') + '=' +
+				$fieldset.find('select[name="' + roleInput.attr('name') + '"]').val();
+		}
+	});
+
+	permissionSubmitSize = formDataSets.length;
+
+	// Add each forum ID to forum ID list to preserve selected forums
+	$.each($form.find('input[type=hidden][name^=forum_id]'), function (key, value) {
+		if (value.name.match(/^forum_id\[([0-9]+)\]$/)) {
+			forumIds.push(value.value);
+		}
+	});
+
+	/**
+	 * Handler for submitted permissions form chunk
+	 *
+	 * @param {object} res Object returned by AJAX call
+	 */
+	function handlePermissionReturn(res) {
+		permissionRequestCount++;
+		var $dark = $('#darkenwrapper');
+
+		if (res.S_USER_WARNING) {
+			phpbb.alert(res.MESSAGE_TITLE, res.MESSAGE_TEXT);
+			permissionSubmitFailed = true;
+		} else if (!permissionSubmitFailed && res.S_USER_NOTICE) {
+			// Display success message at the end of submitting the form
+			if (permissionRequestCount >= permissionSubmitSize) {
+				var $alert = phpbb.alert(res.MESSAGE_TITLE, res.MESSAGE_TEXT);
+				var $alertBoxLink = $alert.find('p.alert_text > a');
+
+				// Create form to submit instead of normal "Back to previous page" link
+				if ($alertBoxLink) {
+					// Remove forum_id[] from URL
+					$alertBoxLink.attr('href', $alertBoxLink.attr('href').replace(/(&forum_id\[\]=[0-9]+)/g, ''));
+					var previousPageForm = '<form action="' + $alertBoxLink.attr('href') + '" method="post">';
+					$.each(forumIds, function (key, value) {
+						previousPageForm += '<input type="text" name="forum_id[]" value="' + value + '" />';
+					});
+					previousPageForm += '</form>';
+
+					$alertBoxLink.on('click', function (e) {
+						var $previousPageForm = $(previousPageForm);
+						$('body').append($previousPageForm);
+						e.preventDefault();
+						$previousPageForm.submit();
+					});
+				}
+
+				// Do not allow closing alert
+				$dark.off('click');
+				$alert.find('.alert_close').hide();
+
+				if (typeof res.REFRESH_DATA !== 'undefined') {
+					setTimeout(function () {
+						// Create forum to submit using POST. This will prevent
+						// exceeding the maximum length of URLs
+						var form = '<form action="' + res.REFRESH_DATA.url.replace(/(&forum_id\[\]=[0-9]+)/g, '') + '" method="post">';
+						$.each(forumIds, function (key, value) {
+							form += '<input type="text" name="forum_id[]" value="' + value + '" />';
+						});
+						form += '</form>';
+						$form = $(form);
+						$('body').append($form);
+
+						// Hide the alert even if we refresh the page, in case the user
+						// presses the back button.
+						$dark.fadeOut(phpbb.alertTime, function () {
+							if (typeof $alert !== 'undefined') {
+								$alert.hide();
+							}
+						});
+
+						// Submit form
+						$form.submit();
+					}, res.REFRESH_DATA.time * 1000); // Server specifies time in seconds
+				}
+			}
+		}
+	}
+
+	// Create AJAX request for each form data set
+	$.each(formDataSets, function (key, formData) {
+		$.ajax({
+			url: $form.action,
+			type: 'POST',
+			data: formData + '&' + $submitAllButton.name + '=' + encodeURIComponent($submitAllButton.value) +
+				'&creation_time=' + $form.find('input[type=hidden][name=creation_time]')[0].value +
+				'&form_token=' + $form.find('input[type=hidden][name=form_token]')[0].value,
+			success: handlePermissionReturn,
+			error: handlePermissionReturn
+		});
+	});
+}
 
 $('[data-ajax]').each(function() {
 	var $this = $(this),
@@ -83,6 +213,18 @@ $('[data-ajax]').each(function() {
 */
 $(function() {
 	phpbb.resizeTextArea($('textarea:not(.no-auto-resize)'), {minHeight: 75});
+
+	var $setPermissionsForm = $('form#set-permissions');
+	if ($setPermissionsForm.length) {
+		$setPermissionsForm.on('submit', function (e) {
+			submitPermissions();
+			e.preventDefault();
+		});
+		$setPermissionsForm.find('input[type=submit]').click(function() {
+			$('input[type=submit]', $(this).parents($('form#set-permissions'))).removeAttr('data-clicked');
+			$(this).attr('data-clicked', true);
+		});
+	}
 });
 
 
diff --git a/phpBB/includes/acp/acp_permissions.php b/phpBB/includes/acp/acp_permissions.php
index df3e238bcc..12c43bf94c 100644
--- a/phpBB/includes/acp/acp_permissions.php
+++ b/phpBB/includes/acp/acp_permissions.php
@@ -758,6 +758,7 @@ class acp_permissions
 
 		$this->log_action($mode, 'add', $permission_type, $ug_type, $ug_id, $forum_id);
 
+		meta_refresh(5, $this->u_action);
 		trigger_error($user->lang['AUTH_UPDATED'] . adm_back_link($this->u_action));
 	}
 
@@ -829,10 +830,12 @@ class acp_permissions
 
 		if ($mode == 'setting_forum_local' || $mode == 'setting_mod_local')
 		{
+			meta_refresh(5, $this->u_action . '&amp;forum_id[]=' . implode('&amp;forum_id[]=', $forum_ids));
 			trigger_error($user->lang['AUTH_UPDATED'] . adm_back_link($this->u_action . '&amp;forum_id[]=' . implode('&amp;forum_id[]=', $forum_ids)));
 		}
 		else
 		{
+			meta_refresh(5, $this->u_action);
 			trigger_error($user->lang['AUTH_UPDATED'] . adm_back_link($this->u_action));
 		}
 	}
@@ -904,10 +907,12 @@ class acp_permissions
 
 		if ($mode == 'setting_forum_local' || $mode == 'setting_mod_local')
 		{
+			meta_refresh(5, $this->u_action . '&amp;forum_id[]=' . implode('&amp;forum_id[]=', $forum_id));
 			trigger_error($user->lang['AUTH_UPDATED'] . adm_back_link($this->u_action . '&amp;forum_id[]=' . implode('&amp;forum_id[]=', $forum_id)));
 		}
 		else
 		{
+			meta_refresh(5, $this->u_action);
 			trigger_error($user->lang['AUTH_UPDATED'] . adm_back_link($this->u_action));
 		}
 	}