diff --git a/phpBB/includes/functions_compatibility.php b/phpBB/includes/functions_compatibility.php
index ea092c83bc..fbb1f0e03d 100644
--- a/phpBB/includes/functions_compatibility.php
+++ b/phpBB/includes/functions_compatibility.php
@@ -165,3 +165,30 @@ function update_foes($group_id = false, $user_id = false)
 	global $db, $auth;
 	return phpbb_update_foes($db, $auth, $group_id, $user_id);
 }
+
+/**
+* Get user rank title and image
+*
+* @param int $user_rank the current stored users rank id
+* @param int $user_posts the users number of posts
+* @param string &$rank_title the rank title will be stored here after execution
+* @param string &$rank_img the rank image as full img tag is stored here after execution
+* @param string &$rank_img_src the rank image source is stored here after execution
+*
+* @deprecated 3.1.0-RC5 (To be removed: 3.3.0)
+*
+* Note: since we do not want to break backwards-compatibility, this function will only properly assign ranks to guests if you call it for them with user_posts == false
+*/
+function get_user_rank($user_rank, $user_posts, &$rank_title, &$rank_img, &$rank_img_src)
+{
+	global $phpbb_root_path, $phpEx;
+	if (!function_exists('phpbb_get_user_rank'))
+	{
+		include($phpbb_root_path . 'includes/functions_display.' . $phpEx);
+	}
+
+	$rank_data = phpbb_get_user_rank(array('user_rank' => $user_rank), $user_posts);
+	$rank_title = $rank_data['title'];
+	$rank_img = $rank_data['img'];
+	$rank_img_src = $rank_data['img_src'];
+}
diff --git a/phpBB/includes/functions_display.php b/phpBB/includes/functions_display.php
index 85d9496061..77447c62f6 100644
--- a/phpBB/includes/functions_display.php
+++ b/phpBB/includes/functions_display.php
@@ -1402,17 +1402,34 @@ function watch_topic_forum($mode, &$s_watching, $user_id, $forum_id, $topic_id,
 /**
 * Get user rank title and image
 *
-* @param int $user_rank the current stored users rank id
+* @param array $user_data the current stored users data
 * @param int $user_posts the users number of posts
-* @param string &$rank_title the rank title will be stored here after execution
-* @param string &$rank_img the rank image as full img tag is stored here after execution
-* @param string &$rank_img_src the rank image source is stored here after execution
+*
+* @return array An associative array containing the rank title (title), the rank image source (img) and the rank image as full img tag (img)
 *
 * Note: since we do not want to break backwards-compatibility, this function will only properly assign ranks to guests if you call it for them with user_posts == false
 */
-function get_user_rank($user_rank, $user_posts, &$rank_title, &$rank_img, &$rank_img_src)
+function phpbb_get_user_rank($user_data, $user_posts)
 {
-	global $ranks, $config, $phpbb_root_path, $phpbb_path_helper;
+	global $ranks, $config, $phpbb_root_path, $phpbb_path_helper, $phpbb_dispatcher;
+
+	$user_rank_data = array(
+		'title'		=> null,
+		'img'		=> null,
+		'img_src'	=> null,
+	);
+
+	/**
+	* Preparing a user's rank before displaying
+	*
+	* @event core.modify_user_rank
+	* @var	array	user_data		Array with user's data
+	* @var	int		user_posts		User_posts to change
+	* @since 3.1.0-RC4
+	*/
+
+	$vars = array('user_data', 'user_posts');
+	extract($phpbb_dispatcher->trigger_event('core.modify_user_rank', compact($vars)));
 
 	if (empty($ranks))
 	{
@@ -1420,11 +1437,14 @@ function get_user_rank($user_rank, $user_posts, &$rank_title, &$rank_img, &$rank
 		$ranks = $cache->obtain_ranks();
 	}
 
-	if (!empty($user_rank))
+	if (!empty($user_data['user_rank']))
 	{
-		$rank_title = (isset($ranks['special'][$user_rank]['rank_title'])) ? $ranks['special'][$user_rank]['rank_title'] : '';
-		$rank_img_src = (!empty($ranks['special'][$user_rank]['rank_image'])) ? $phpbb_path_helper->update_web_root_path($phpbb_root_path . $config['ranks_path'] . '/' . $ranks['special'][$user_rank]['rank_image']) : '';
-		$rank_img = (!empty($ranks['special'][$user_rank]['rank_image'])) ? '<img src="' . $rank_img_src . '" alt="' . $ranks['special'][$user_rank]['rank_title'] . '" title="' . $ranks['special'][$user_rank]['rank_title'] . '" />' : '';
+
+		$user_rank_data['title'] = (isset($ranks['special'][$user_data['user_rank']]['rank_title'])) ? $ranks['special'][$user_data['user_rank']]['rank_title'] : '';
+
+		$user_rank_data['img_src'] = (!empty($ranks['special'][$user_data['user_rank']]['rank_image'])) ? $phpbb_path_helper->update_web_root_path($phpbb_root_path . $config['ranks_path'] . '/' . $ranks['special'][$user_data['user_rank']]['rank_image']) : '';
+
+		$user_rank_data['img'] = (!empty($ranks['special'][$user_data['user_rank']]['rank_image'])) ? '<img src="' . $user_rank_data['img_src'] . '" alt="' . $ranks['special'][$user_data['user_rank']]['rank_title'] . '" title="' . $ranks['special'][$user_data['user_rank']]['rank_title'] . '" />' : '';
 	}
 	else if ($user_posts !== false)
 	{
@@ -1434,14 +1454,16 @@ function get_user_rank($user_rank, $user_posts, &$rank_title, &$rank_img, &$rank
 			{
 				if ($user_posts >= $rank['rank_min'])
 				{
-					$rank_title = $rank['rank_title'];
-					$rank_img_src = (!empty($rank['rank_image'])) ? $phpbb_path_helper->update_web_root_path($phpbb_root_path . $config['ranks_path'] . '/' . $rank['rank_image']) : '';
-					$rank_img = (!empty($rank['rank_image'])) ? '<img src="' . $rank_img_src . '" alt="' . $rank['rank_title'] . '" title="' . $rank['rank_title'] . '" />' : '';
+					$user_rank_data['title'] = $rank['rank_title'];
+					$user_rank_data['img_src'] = (!empty($rank['rank_image'])) ? $phpbb_path_helper->update_web_root_path($phpbb_root_path . $config['ranks_path'] . '/' . $rank['rank_image']) : '';
+					$user_rank_data['img'] = (!empty($rank['rank_image'])) ? '<img src="' . $user_rank_data['img_src'] . '" alt="' . $rank['rank_title'] . '" title="' . $rank['rank_title'] . '" />' : '';
 					break;
 				}
 			}
 		}
 	}
+
+	return $user_rank_data;
 }
 
 /**
@@ -1454,8 +1476,7 @@ function phpbb_show_profile($data, $user_notes_enabled = false, $warn_user_enabl
 	$username = $data['username'];
 	$user_id = $data['user_id'];
 
-	$rank_title = $rank_img = $rank_img_src = '';
-	get_user_rank($data['user_rank'], (($user_id == ANONYMOUS) ? false : $data['user_posts']), $rank_title, $rank_img, $rank_img_src);
+	$user_rank_data = phpbb_get_user_rank($data, (($user_id == ANONYMOUS) ? false : $data['user_posts']));
 
 	if ((!empty($data['user_allow_viewemail']) && $auth->acl_get('u_sendemail')) || $auth->acl_get('a_user'))
 	{
@@ -1536,7 +1557,7 @@ function phpbb_show_profile($data, $user_notes_enabled = false, $warn_user_enabl
 	// Dump it out to the template
 	$template_data = array(
 		'AGE'			=> $age,
-		'RANK_TITLE'	=> $rank_title,
+		'RANK_TITLE'	=> $user_rank_data['title'],
 		'JOINED'		=> $user->format_date($data['user_regdate']),
 		'LAST_ACTIVE'	=> (empty($last_active)) ? ' - ' : $user->format_date($last_active),
 		'POSTS'			=> ($data['user_posts']) ? $data['user_posts'] : 0,
@@ -1552,8 +1573,8 @@ function phpbb_show_profile($data, $user_notes_enabled = false, $warn_user_enabl
 		'AVATAR_IMG'		=> phpbb_get_user_avatar($data),
 		'ONLINE_IMG'		=> (!$config['load_onlinetrack']) ? '' : (($online) ? $user->img('icon_user_online', 'ONLINE') : $user->img('icon_user_offline', 'OFFLINE')),
 		'S_ONLINE'			=> ($config['load_onlinetrack'] && $online) ? true : false,
-		'RANK_IMG'			=> $rank_img,
-		'RANK_IMG_SRC'		=> $rank_img_src,
+		'RANK_IMG'			=> $user_rank_data['img'],
+		'RANK_IMG_SRC'		=> $user_rank_data['img_src'],
 		'S_JABBER_ENABLED'	=> ($config['jab_enable']) ? true : false,
 
 		'S_WARNINGS'	=> ($auth->acl_getf_global('m_') || $auth->acl_get('m_warn')) ? true : false,
diff --git a/phpBB/includes/mcp/mcp_warn.php b/phpBB/includes/mcp/mcp_warn.php
index 106b025757..425c3ac235 100644
--- a/phpBB/includes/mcp/mcp_warn.php
+++ b/phpBB/includes/mcp/mcp_warn.php
@@ -336,12 +336,12 @@ class mcp_warn
 		$message = generate_text_for_display($user_row['post_text'], $user_row['bbcode_uid'], $user_row['bbcode_bitfield'], $parse_flags, true);
 
 		// Generate the appropriate user information for the user we are looking at
-		if (!function_exists('get_user_rank'))
+		if (!function_exists('phpbb_get_user_rank'))
 		{
 			include($phpbb_root_path . 'includes/functions_display.' . $phpEx);
 		}
 
-		get_user_rank($user_row['user_rank'], $user_row['user_posts'], $rank_title, $rank_img, $rank_img_src);
+		$user_rank_data = phpbb_get_user_rank($user_row, $user_row['user_posts']);
 		$avatar_img = phpbb_get_user_avatar($user_row);
 
 		$template->assign_vars(array(
@@ -350,13 +350,13 @@ class mcp_warn
 			'POST'				=> $message,
 			'USERNAME'			=> $user_row['username'],
 			'USER_COLOR'		=> (!empty($user_row['user_colour'])) ? $user_row['user_colour'] : '',
-			'RANK_TITLE'		=> $rank_title,
+			'RANK_TITLE'		=> $user_rank_data['title'],
 			'JOINED'			=> $user->format_date($user_row['user_regdate']),
 			'POSTS'				=> ($user_row['user_posts']) ? $user_row['user_posts'] : 0,
 			'WARNINGS'			=> ($user_row['user_warnings']) ? $user_row['user_warnings'] : 0,
 
 			'AVATAR_IMG'		=> $avatar_img,
-			'RANK_IMG'			=> $rank_img,
+			'RANK_IMG'			=> $user_rank_data['img'],
 
 			'L_WARNING_POST_DEFAULT'	=> sprintf($user->lang['WARNING_POST_DEFAULT'], generate_board_url() . "/viewtopic.$phpEx?f=$forum_id&amp;p=$post_id#p$post_id"),
 
@@ -486,18 +486,18 @@ class mcp_warn
 		}
 
 		// Generate the appropriate user information for the user we are looking at
-		if (!function_exists('get_user_rank'))
+		if (!function_exists('phpbb_get_user_rank'))
 		{
 			include($phpbb_root_path . 'includes/functions_display.' . $phpEx);
 		}
-		get_user_rank($user_row['user_rank'], $user_row['user_posts'], $rank_title, $rank_img, $rank_img_src);
+		$user_rank_data = phpbb_get_user_rank($user_row, $user_row['user_posts']);
 		$avatar_img = phpbb_get_user_avatar($user_row);
 
 		// OK, they didn't submit a warning so lets build the page for them to do so
 		$template->assign_vars(array(
 			'U_POST_ACTION'		=> $this->u_action,
 
-			'RANK_TITLE'		=> $rank_title,
+			'RANK_TITLE'		=> $user_rank_data['title'],
 			'JOINED'			=> $user->format_date($user_row['user_regdate']),
 			'POSTS'				=> ($user_row['user_posts']) ? $user_row['user_posts'] : 0,
 			'WARNINGS'			=> ($user_row['user_warnings']) ? $user_row['user_warnings'] : 0,
@@ -508,7 +508,7 @@ class mcp_warn
 			'U_PROFILE'			=> get_username_string('profile', $user_row['user_id'], $user_row['username'], $user_row['user_colour']),
 
 			'AVATAR_IMG'		=> $avatar_img,
-			'RANK_IMG'			=> $rank_img,
+			'RANK_IMG'			=> $user_rank_data['img'],
 
 			'S_CAN_NOTIFY'		=> $s_can_notify,
 		));
diff --git a/phpBB/includes/ucp/ucp_pm_viewmessage.php b/phpBB/includes/ucp/ucp_pm_viewmessage.php
index d5a1dbae87..2f34fd64a5 100644
--- a/phpBB/includes/ucp/ucp_pm_viewmessage.php
+++ b/phpBB/includes/ucp/ucp_pm_viewmessage.php
@@ -403,12 +403,15 @@ function get_user_information($user_id, $user_row)
 
 	$user_row['avatar'] = ($user->optionget('viewavatars')) ? phpbb_get_user_avatar($user_row) : '';
 
-	if (!function_exists('get_user_rank'))
+	if (!function_exists('phpbb_get_user_rank'))
 	{
 		include($phpbb_root_path . 'includes/functions_display.' . $phpEx);
 	}
 
-	get_user_rank($user_row['user_rank'], $user_row['user_posts'], $user_row['rank_title'], $user_row['rank_image'], $user_row['rank_image_src']);
+	$user_rank_data = phpbb_get_user_rank($user_row, $user_row['user_posts']);
+	$user_row['rank_title'] = $user_rank_data['title'];
+	$user_row['rank_image'] = $user_rank_data['img'];
+	$user_row['rank_image_src'] = $user_rank_data['img_src'];
 
 	if ((!empty($user_row['user_allow_viewemail']) && $auth->acl_get('u_sendemail')) || $auth->acl_get('a_email'))
 	{
diff --git a/phpBB/memberlist.php b/phpBB/memberlist.php
index 4f4dcb1b41..919036a85c 100644
--- a/phpBB/memberlist.php
+++ b/phpBB/memberlist.php
@@ -283,21 +283,20 @@ switch ($mode)
 							continue;
 						}
 
-						$rank_title = $rank_img = $rank_img_src = '';
-						get_user_rank($row['user_rank'], (($row['user_id'] == ANONYMOUS) ? false : $row['user_posts']), $rank_title, $rank_img, $rank_img_src);
+						$user_rank_data = phpbb_get_user_rank($row, (($row['user_id'] == ANONYMOUS) ? false : $row['user_posts']));
 
 						$template->assign_block_vars('group.user', array(
 							'USER_ID'		=> $row['user_id'],
 							'FORUMS'		=> $row['forums'],
 							'FORUM_OPTIONS'	=> (isset($row['forums_options'])) ? true : false,
-							'RANK_TITLE'	=> $rank_title,
+							'RANK_TITLE'	=> $user_rank_data['title'],
 
 							'GROUP_NAME'	=> $groups_ary[$row['default_group']]['group_name'],
 							'GROUP_COLOR'	=> $groups_ary[$row['default_group']]['group_colour'],
 							'U_GROUP'		=> $groups_ary[$row['default_group']]['u_group'],
 
-							'RANK_IMG'		=> $rank_img,
-							'RANK_IMG_SRC'	=> $rank_img_src,
+							'RANK_IMG'		=> $user_rank_data['img'],
+							'RANK_IMG_SRC'	=> $user_rank_data['img_src'],
 
 							'U_PM'			=> ($config['allow_privmsg'] && $auth->acl_get('u_sendpm') && ($row['user_allow_pm'] || $auth->acl_gets('a_', 'm_') || $auth->acl_getf_global('m_'))) ? append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=pm&amp;mode=compose&amp;u=' . $row['user_id']) : '',
 
@@ -1080,10 +1079,14 @@ switch ($mode)
 			$avatar_img = phpbb_get_group_avatar($group_row);
 
 			// ... same for group rank
-			$rank_title = $rank_img = $rank_img_src = '';
+			$user_rank_data = array(
+				'title'		=> null,
+				'img'		=> null,
+				'img_src'	=> null,
+			);
 			if ($group_row['group_rank'])
 			{
-				get_user_rank($group_row['group_rank'], false, $rank_title, $rank_img, $rank_img_src);
+				$user_rank_data = phpbb_get_user_rank($group_row, false);
 
 				if ($rank_img)
 				{
@@ -1096,11 +1099,11 @@ switch ($mode)
 				'GROUP_NAME'	=> ($group_row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $group_row['group_name']] : $group_row['group_name'],
 				'GROUP_COLOR'	=> $group_row['group_colour'],
 				'GROUP_TYPE'	=> $user->lang['GROUP_IS_' . $group_row['l_group_type']],
-				'GROUP_RANK'	=> $rank_title,
+				'GROUP_RANK'	=> $user_rank_data['title'],
 
 				'AVATAR_IMG'	=> $avatar_img,
-				'RANK_IMG'		=> $rank_img,
-				'RANK_IMG_SRC'	=> $rank_img_src,
+				'RANK_IMG'		=> $user_rank_data['img'],
+				'RANK_IMG_SRC'	=> $user_rank_data['img_src'],
 
 				'U_PM'			=> ($auth->acl_get('u_sendpm') && $auth->acl_get('u_masspm_group') && $group_row['group_receive_pm'] && $config['allow_privmsg'] && $config['allow_mass_pm']) ? append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=pm&amp;mode=compose&amp;g=' . $group_id) : '',)
 			);
diff --git a/phpBB/phpbb/user_loader.php b/phpBB/phpbb/user_loader.php
index c9707ee432..24e663b150 100644
--- a/phpBB/phpbb/user_loader.php
+++ b/phpBB/phpbb/user_loader.php
@@ -212,7 +212,7 @@ class user_loader
 			return '';
 		}
 
-		if (!function_exists('get_user_rank'))
+		if (!function_exists('phpbb_get_user_rank'))
 		{
 			include($this->phpbb_root_path . 'includes/functions_display.' . $this->php_ext);
 		}
@@ -223,7 +223,10 @@ class user_loader
 			'rank_img_src',
 		);
 
-		get_user_rank($user['user_rank'], (($user['user_id'] == ANONYMOUS) ? false : $user['user_posts']), $rank['rank_title'], $rank['rank_img'], $rank['rank_img_src']);
+		$user_rank_data = phpbb_get_user_rank($user, (($user['user_id'] == ANONYMOUS) ? false : $user['user_posts']));
+		$rank['rank_title'] = $user_rank_data['title'];
+		$rank['rank_img'] = $user_rank_data['img'];
+		$rank['rank_img_src'] = $user_rank_data['img_src'];
 
 		return $rank;
 	}
diff --git a/phpBB/viewtopic.php b/phpBB/viewtopic.php
index f8b4a54f05..a340dbe5ad 100644
--- a/phpBB/viewtopic.php
+++ b/phpBB/viewtopic.php
@@ -1203,7 +1203,10 @@ while ($row = $db->sql_fetchrow($result))
 
 			$user_cache[$poster_id] = $user_cache_data;
 
-			get_user_rank($row['user_rank'], false, $user_cache[$poster_id]['rank_title'], $user_cache[$poster_id]['rank_image'], $user_cache[$poster_id]['rank_image_src']);
+			$user_rank_data = phpbb_get_user_rank($row, false);
+			$user_cache[$poster_id]['rank_title'] = $user_rank_data['title'];
+			$user_cache[$poster_id]['rank_image'] = $user_rank_data['img'];
+			$user_cache[$poster_id]['rank_image_src'] = $user_rank_data['img_src'];
 		}
 		else
 		{
@@ -1267,7 +1270,10 @@ while ($row = $db->sql_fetchrow($result))
 
 			$user_cache[$poster_id] = $user_cache_data;
 
-			get_user_rank($row['user_rank'], $row['user_posts'], $user_cache[$poster_id]['rank_title'], $user_cache[$poster_id]['rank_image'], $user_cache[$poster_id]['rank_image_src']);
+			$user_rank_data = phpbb_get_user_rank($row, false);
+			$user_cache[$poster_id]['rank_title'] = $user_rank_data['title'];
+			$user_cache[$poster_id]['rank_image'] = $user_rank_data['img'];
+			$user_cache[$poster_id]['rank_image_src'] = $user_rank_data['img_src'];
 
 			if ((!empty($row['user_allow_viewemail']) && $auth->acl_get('u_sendemail')) || $auth->acl_get('a_email'))
 			{