diff --git a/phpBB/docs/events.md b/phpBB/docs/events.md
index 4c80d99792..aaad64d68c 100644
--- a/phpBB/docs/events.md
+++ b/phpBB/docs/events.md
@@ -1483,6 +1483,20 @@ overall_header_stylesheets_after
 * Purpose: Add asset calls after stylesheets within the `</head>` tag.
 Note that INCLUDECSS will not work with this event.
 
+posting_attach_body_attach_row_controls_append
+===
+* Locations:
+    + styles/prosilver/template/posting_attach_body.html
+* Since: 3.2.2-RC1
+* Purpose: Add content after attachment control elements 
+
+posting_attach_body_attach_row_controls_prepend
+===
+* Locations:
+    + styles/prosilver/template/posting_attach_body.html
+* Since: 3.2.2-RC1
+* Purpose: Add content before attachment control elements 
+
 posting_editor_add_panel_tab
 ===
 * Locations:
diff --git a/phpBB/includes/functions_posting.php b/phpBB/includes/functions_posting.php
index 1319fd49cd..27fd02e4f7 100644
--- a/phpBB/includes/functions_posting.php
+++ b/phpBB/includes/functions_posting.php
@@ -684,7 +684,7 @@ function posting_gen_inline_attachments(&$attachment_data)
 */
 function posting_gen_attachment_entry($attachment_data, &$filename_data, $show_attach_box = true)
 {
-	global $template, $config, $phpbb_root_path, $phpEx, $user;
+	global $template, $config, $phpbb_root_path, $phpEx, $user, $phpbb_dispatcher;
 
 	// Some default template variables
 	$template->assign_vars(array(
@@ -702,6 +702,7 @@ function posting_gen_attachment_entry($attachment_data, &$filename_data, $show_a
 		foreach ($attachment_data as $count => $attach_row)
 		{
 			$hidden = '';
+			$attachrow_template_vars = array();
 			$attach_row['real_filename'] = utf8_basename($attach_row['real_filename']);
 
 			foreach ($attach_row as $key => $value)
@@ -711,7 +712,7 @@ function posting_gen_attachment_entry($attachment_data, &$filename_data, $show_a
 
 			$download_link = append_sid("{$phpbb_root_path}download/file.$phpEx", 'mode=view&amp;id=' . (int) $attach_row['attach_id'], true, ($attach_row['is_orphan']) ? $user->session_id : false);
 
-			$template->assign_block_vars('attach_row', array(
+			$attachrow_template_vars[(int) $attach_row['attach_id']] = array(
 				'FILENAME'			=> utf8_basename($attach_row['real_filename']),
 				'A_FILENAME'		=> addslashes(utf8_basename($attach_row['real_filename'])),
 				'FILE_COMMENT'		=> $attach_row['attach_comment'],
@@ -721,9 +722,22 @@ function posting_gen_attachment_entry($attachment_data, &$filename_data, $show_a
 				'FILESIZE'			=> get_formatted_filesize($attach_row['filesize']),
 
 				'U_VIEW_ATTACHMENT'	=> $download_link,
-				'S_HIDDEN'			=> $hidden)
+				'S_HIDDEN'			=> $hidden,
 			);
 		}
+
+		/**
+		* Modify inline attachments template vars
+		*
+		* @event core.modify_inline_attachments_template_vars
+		* @var	array	attachment_data				Array containing attachments data
+		* @var	array	attachrow_template_vars		Array containing attachments template vars
+		* @since 3.2.2-RC1
+		*/
+		$vars = array('attachment_data', 'attachrow_template_vars');
+		extract($phpbb_dispatcher->trigger_event('core.modify_inline_attachments_template_vars', compact($vars)));
+
+		$template->assign_block_vars_array('attach_row', $attachrow_template_vars);
 	}
 
 	return count($attachment_data);
diff --git a/phpBB/includes/functions_user.php b/phpBB/includes/functions_user.php
index f1e03869b4..3a65a8820a 100644
--- a/phpBB/includes/functions_user.php
+++ b/phpBB/includes/functions_user.php
@@ -734,9 +734,11 @@ function user_delete($mode, $user_ids, $retain_username = true)
 	* @var	array	user_ids	IDs of the deleted user
 	* @var	mixed	retain_username	True if username should be retained
 	*				or false if not
+	* @var	array	user_rows	Array containing data of the deleted users
 	* @since 3.1.0-a1
+	* @changed 3.2.2-RC1 Added user_rows
 	*/
-	$vars = array('mode', 'user_ids', 'retain_username');
+	$vars = array('mode', 'user_ids', 'retain_username', 'user_rows');
 	extract($phpbb_dispatcher->trigger_event('core.delete_user_after', compact($vars)));
 
 	// Reset newest user info if appropriate
diff --git a/phpBB/includes/message_parser.php b/phpBB/includes/message_parser.php
index cb6e391bb8..cbe0a9fd68 100644
--- a/phpBB/includes/message_parser.php
+++ b/phpBB/includes/message_parser.php
@@ -1530,7 +1530,7 @@ class parse_message extends bbcode_firstpass
 	function parse_attachments($form_name, $mode, $forum_id, $submit, $preview, $refresh, $is_message = false)
 	{
 		global $config, $auth, $user, $phpbb_root_path, $phpEx, $db, $request;
-		global $phpbb_container;
+		global $phpbb_container, $phpbb_dispatcher;
 
 		$error = array();
 
@@ -1598,6 +1598,20 @@ class parse_message extends bbcode_firstpass
 					);
 
 					$this->attachment_data = array_merge(array(0 => $new_entry), $this->attachment_data);
+
+					/**
+					* Modify attachment data on submit
+					*
+					* @event core.modify_attachment_data_on_submit
+					* @var	array	attachment_data		Array containing attachment data
+					* @since 3.2.2-RC1
+					*/
+					$attachment_data = $this->attachment_data;
+					$vars = array('attachment_data');
+					extract($phpbb_dispatcher->trigger_event('core.modify_attachment_data_on_submit', compact($vars)));
+					$this->attachment_data = $attachment_data;
+					unset($attachment_data);
+
 					$this->message = preg_replace_callback('#\[attachment=([0-9]+)\](.*?)\[\/attachment\]#', function ($match) {
 						return '[attachment='.($match[1] + 1).']' . $match[2] . '[/attachment]';
 					}, $this->message);
@@ -1719,6 +1733,20 @@ class parse_message extends bbcode_firstpass
 						);
 
 						$this->attachment_data = array_merge(array(0 => $new_entry), $this->attachment_data);
+
+						/**
+						* Modify attachment data on upload
+						*
+						* @event core.modify_attachment_data_on_upload
+						* @var	array	attachment_data		Array containing attachment data
+						* @since 3.2.2-RC1
+						*/
+						$attachment_data = $this->attachment_data;
+						$vars = array('attachment_data');
+						extract($phpbb_dispatcher->trigger_event('core.modify_attachment_data_on_upload', compact($vars)));
+						$this->attachment_data = $attachment_data;
+						unset($attachment_data);
+
 						$this->message = preg_replace_callback('#\[attachment=([0-9]+)\](.*?)\[\/attachment\]#', function ($match) {
 							return '[attachment=' . ($match[1] + 1) . ']' . $match[2] . '[/attachment]';
 						}, $this->message);
diff --git a/phpBB/memberlist.php b/phpBB/memberlist.php
index b1f3a63fae..a191ee25fb 100644
--- a/phpBB/memberlist.php
+++ b/phpBB/memberlist.php
@@ -1643,7 +1643,7 @@ switch ($mode)
 		$pagination->generate_template_pagination($pagination_url, 'pagination', 'start', $total_users, $config['topics_per_page'], $start);
 
 		// Generate page
-		$template->assign_vars(array(
+		$template_vars = array(
 			'TOTAL_USERS'	=> $user->lang('LIST_USERS', (int) $total_users),
 
 			'PROFILE_IMG'	=> $user->img('icon_user_profile', $user->lang['PROFILE']),
@@ -1668,8 +1668,22 @@ switch ($mode)
 			'S_LEADERS_SET'		=> $leaders_set,
 			'S_MODE_SELECT'		=> $s_sort_key,
 			'S_ORDER_SELECT'	=> $s_sort_dir,
-			'S_MODE_ACTION'		=> $pagination_url)
+			'S_MODE_ACTION'		=> $pagination_url,
 		);
+
+		/**
+		 * Modify memberlist page template vars
+		 *
+		 * @event core.memberlist_modify_template_vars
+		 * @var array	params				Array containing URL parameters
+		 * @var string	sort_url			Sorting URL base
+		 * @var array	template_vars		Array containing template vars
+		 * @since 3.2.2-RC1
+		 */
+		$vars = array('params', 'sort_url', 'template_vars');
+		extract($phpbb_dispatcher->trigger_event('core.memberlist_modify_template_vars', compact($vars)));
+
+		$template->assign_vars($template_vars);
 }
 
 // Output the page
diff --git a/phpBB/phpbb/log/log.php b/phpBB/phpbb/log/log.php
index 208df04468..4aee8c4078 100644
--- a/phpBB/phpbb/log/log.php
+++ b/phpBB/phpbb/log/log.php
@@ -747,7 +747,7 @@ class log implements \phpbb\log\log_interface
 			foreach ($log as $key => $row)
 			{
 				$log[$key]['viewtopic'] = (isset($topic_auth['f_read'][$row['topic_id']])) ? append_sid("{$this->phpbb_root_path}viewtopic.{$this->php_ext}", 'f=' . $topic_auth['f_read'][$row['topic_id']] . '&amp;t=' . $row['topic_id']) : false;
-				$log[$key]['viewpost'] = (isset($topic_auth['f_read'][$row['topic_id']]) && $row['post_id']) ? append_sid("{$this->phpbb_root_path}viewtopic.{$this->php_ext}", 'f=' . $topic_auth['f_read'][$row['topic_id']] . '&amp;t=' . $row['topic_id'] . '&amp;p=' . $row['post_id']) : false;
+				$log[$key]['viewpost'] = (isset($topic_auth['f_read'][$row['topic_id']]) && $row['post_id']) ? append_sid("{$this->phpbb_root_path}viewtopic.{$this->php_ext}", 'f=' . $topic_auth['f_read'][$row['topic_id']] . '&amp;t=' . $row['topic_id'] . '&amp;p=' . $row['post_id'] . '#p' . $row['post_id']) : false;
 				$log[$key]['viewlogs'] = (isset($topic_auth['m_'][$row['topic_id']])) ? append_sid("{$this->phpbb_root_path}mcp.{$this->php_ext}", 'i=logs&amp;mode=topic_logs&amp;t=' . $row['topic_id'], true, $this->user->session_id) : false;
 			}
 		}
diff --git a/phpBB/posting.php b/phpBB/posting.php
index 777366c177..3530bb5048 100644
--- a/phpBB/posting.php
+++ b/phpBB/posting.php
@@ -547,6 +547,27 @@ if ($post_data['poll_start'])
 	$db->sql_freeresult($result);
 }
 
+/**
+* This event allows you to modify the post data before parsing
+*
+* @event core.posting_modify_post_data
+* @var	int		forum_id	ID of the forum
+* @var	string	mode		What action to take if the form has been submitted
+*							post|reply|quote|edit|delete|bump|smilies|popup
+* @var	array	post_data	Array with post data
+* @var	int		post_id		ID of the post
+* @var	int		topic_id	ID of the topic
+* @since 3.2.2-RC1
+*/
+$vars = array(
+	'forum_id',
+	'mode',
+	'post_data',
+	'post_id',
+	'topic_id',
+);
+extract($phpbb_dispatcher->trigger_event('core.posting_modify_post_data', compact($vars)));
+
 if ($mode == 'edit')
 {
 	$original_poll_data = array(
diff --git a/phpBB/styles/prosilver/template/posting_attach_body.html b/phpBB/styles/prosilver/template/posting_attach_body.html
index a7e20530cd..749733982e 100644
--- a/phpBB/styles/prosilver/template/posting_attach_body.html
+++ b/phpBB/styles/prosilver/template/posting_attach_body.html
@@ -59,10 +59,12 @@
 						<tr class="attach-row" data-attach-id="{attach_row.ATTACH_ID}">
 							<td class="attach-name">
 								<span class="file-name ellipsis-text"><a href="{attach_row.U_VIEW_ATTACHMENT}">{attach_row.FILENAME}</a></span>
+								<!-- EVENT posting_attach_body_attach_row_controls_prepend -->
 								<span class="attach-controls">
 									<!-- IF S_INLINE_ATTACHMENT_OPTIONS --><input type="button" value="{L_PLACE_INLINE}" class="button1 button button-form-bold file-inline-bbcode" />&nbsp; <!-- ENDIF -->
 									<input type="submit" name="delete_file[{attach_row.ASSOC_INDEX}]" value="{L_DELETE_FILE}" class="button1 button button-form-bold file-delete" />
 								</span>
+								<!-- EVENT posting_attach_body_attach_row_controls_append -->
 								<span class="clear"></span>
 							</td>
 							<td class="attach-comment">
diff --git a/phpBB/viewforum.php b/phpBB/viewforum.php
index a9566c08cb..1787777510 100644
--- a/phpBB/viewforum.php
+++ b/phpBB/viewforum.php
@@ -993,6 +993,16 @@ if (count($topic_list))
 	}
 }
 
+/**
+* This event is to perform additional actions on viewforum page
+*
+* @event core.viewforum_generate_page_after
+* @var	array	forum_data	Array with the forum data
+* @since 3.2.2-RC1
+*/
+$vars = array('forum_data');
+extract($phpbb_dispatcher->trigger_event('core.viewforum_generate_page_after', compact($vars)));
+
 // This is rather a fudge but it's the best I can think of without requiring information
 // on all topics (as we do in 2.0.x). It looks for unread or new topics, if it doesn't find
 // any it updates the forum last read cookie. This requires that the user visit the forum