diff --git a/phpBB/develop/imageset_to_css.php b/phpBB/develop/imageset_to_css.php
index 3d55808319..3db005a054 100644
--- a/phpBB/develop/imageset_to_css.php
+++ b/phpBB/develop/imageset_to_css.php
@@ -17,14 +17,14 @@ ob_start();
 
 // Get global and English images
 $images_global = get_imageset($imageset_path);
-if($images_global === false)
+if ($images_global === false)
 {
 	echo 'imageset.cfg was not found.';
 	echo ob_get_clean();
 	return;
 }
 $images_en = get_imageset($imageset_path, 'en');
-if($images_en === false)
+if ($images_en === false)
 {
 	echo 'English imageset.cfg was not found.';
 	echo ob_get_clean();
@@ -32,7 +32,7 @@ if($images_en === false)
 }
 
 // Remove duplicate images
-foreach($images_en as $key => $row)
+foreach ($images_en as $key => $row)
 {
 	unset($images_global[$key]);
 }
@@ -52,13 +52,16 @@ $replace = array(
 // $replace = array_merge($replace, get_replacements($images_global));
 $replace = array_merge($replace, get_replacements($images_global), get_replacements($images_en));
 
+// BIDI code
+$bidi_code = css($images_global, './images/', true);
+
 // Get all CSS files, parse them
 $files = list_files($theme_path, 'css');
-if($files === false || !count($files))
+if ($files === false || !count($files))
 {
 	echo 'No CSS files found in theme directory.<br />';
 }
-else for($i=0; $i<count($files); $i++)
+else for ($i=0; $i<count($files); $i++)
 {
 	$file = $theme_path . '/' . $files[$i];
 	$data = file_get_contents($file);
@@ -67,12 +70,20 @@ else for($i=0; $i<count($files); $i++)
 	$errors = false;
 	for($j=0; $j<count($not_compatible); $j++)
 	{
-		if(strpos($data, $not_compatible[$j]) !== false)
+		if (strpos($data, $not_compatible[$j]) !== false)
 		{
 			echo 'Error: ', $file, ' contains ', $not_compatible[$j], '. That variable cannot be converted.<br />';
+			continue;
 		}
 	}
-	if(md5($data) == $hash)
+	if (basename($file) == 'bidi.css' && strpos($data, '/* Former imageset */') === false && strlen($bidi_code))
+	{
+		// Add bidi data
+		$data .= "\n/* Former imageset */\n" . $bidi_code;
+		$bidi_code = '';
+		echo 'Note: RTL imageset entries were added at the end of file below:<br />';
+	}
+	if (md5($data) == $hash)
 	{
 		echo 'Nothing to replace in ', $file, '<br />';
 	}
@@ -84,9 +95,9 @@ else for($i=0; $i<count($files); $i++)
 
 // Check if there are invalid images in imageset
 $list = array_merge($images_global, $images_en);
-foreach($list as $key => $row)
+foreach ($list as $key => $row)
 {
-	if($row['skip'])
+	if ($row['skip'])
 	{
 		echo 'Unable to generate code to add to CSS files because some images are missing or invalid. See errors above.';
 		echo ob_get_clean();
@@ -112,14 +123,22 @@ span.imageset {
 
 /* English images for fallback */
 ' . css($images_en, './en/');
+if (strlen($bidi_code))
+{
+	$code .= "\n/* RTL imageset entries */\n" . $bidi_code;
+}
 echo 'Code to add to CSS file:', dump_code($code, 'imageset.css');
 
+
 $list = list_languages($imageset_path);
-for($i=0; $i<count($list); $i++)
+for ($i=0; $i<count($list); $i++)
 {
 	$lang = $list[$i];
 	$images = get_imageset($imageset_path . '/' . $lang);
-	if(!count($images)) continue;
+	if (!count($images))
+	{
+		continue;
+	}
 	$code = '/* ' . strtoupper($lang) . ' Language Pack */
 ' . css($images, './');
 	echo 'New CSS file: ', $theme_path, '/', $lang, '/stylesheet.css', dump_code($code, 'stylesheet_' . $lang . '.css');
@@ -135,26 +154,35 @@ return;
 function get_imageset($path, $lang = '')
 {
 	$cfg = $path . ($lang ? '/' . $lang : '') . '/imageset.cfg';
-	if(!@file_exists($cfg)) return false;
+	if (!@file_exists($cfg))
+	{	
+		return false;
+	}
 	$data = file($cfg);
 	$result = array();
-	for($i=0; $i<count($data); $i++)
+	for ($i=0; $i<count($data); $i++)
 	{
 		$str = trim($data[$i]);
-		if(substr($str, 0, 4) != 'img_') continue;
+		if (substr($str, 0, 4) != 'img_') 
+		{
+			continue;
+		}
 		$list = explode('=', $data[$i]);
-		if(count($list) != 2) continue;
+		if (count($list) != 2) 
+		{
+			continue;
+		}
 		$key = trim($list[0]);
 		$row = explode('*', trim($list[1]));
 		$file = trim($row[0]);
 		$height = isset($row[1]) && intval($row[1]) ? intval($row[1]) : false;
 		$width = isset($row[2]) && intval($row[2]) ? intval($row[2]) : false;
 		$skip = false;
-		if(strlen($file) && (!$width || !$height))
+		if (strlen($file) && (!$width || !$height))
 		{
 			// Try to detect width/height
 			$filename = $path . ($lang ? '/' . $lang : '') . '/' . $file;
-			if(!@file_exists($filename))
+			if (!@file_exists($filename))
 			{
 				echo 'Error: file ', $filename, ' does not exist and its dimensions are not available in imageset.cfg<br />';
 				$skip = true;
@@ -162,7 +190,7 @@ function get_imageset($path, $lang = '')
 			else
 			{
 				$size = @getimagesize($filename);
-				if($size === false)
+				if ($size === false)
 				{
 					echo 'Error: file ', $filename, ' is not a valid image<br />';
 					$skip = true;
@@ -188,7 +216,7 @@ function get_imageset($path, $lang = '')
 function get_replacements($list)
 {
 	$result = array();
-	foreach($list as $key => $row)
+	foreach ($list as $key => $row)
 	{
 		$key = '{' . strtoupper($key);
 		$result[$key . '_SRC}'] = strlen($row['file']) ? ($row['lang'] ? './' . $row['lang'] : './images') . '/' . $row['file'] : '';
@@ -201,9 +229,12 @@ function get_replacements($list)
 function list_files($dir, $ext)
 {
 	$res = @opendir($dir);
-	if($res === false) return false;
+	if ($res === false)
+	{
+		return false;
+	}
 	$files = array();
-	while(($file = readdir($res)) !== false)
+	while (($file = readdir($res)) !== false)
 	{
 		$list = explode('.', $file);
 		if(count($list) > 1 && strtolower($list[count($list) - 1]) == $ext)
@@ -218,13 +249,19 @@ function list_files($dir, $ext)
 function list_languages($dir)
 {
 	$res = @opendir($dir);
-	if($res === false) return array();
-	$files = array();
-	while(($file = readdir($res)) !== false)
+	if ($res === false)
 	{
-		if(substr($file, 0, 1) == '.') continue;
+		return array();
+	}
+	$files = array();
+	while (($file = readdir($res)) !== false)
+	{
+		if (substr($file, 0, 1) == '.')
+		{
+			continue;
+		}
 		$filename = $dir . '/' . $file;
-		if(is_dir($filename) && file_exists($filename . '/imageset.cfg'))
+		if (is_dir($filename) && file_exists($filename . '/imageset.cfg'))
 		{
 			$files[] = $file;
 		}
@@ -236,7 +273,7 @@ function list_languages($dir)
 function dump_code($code, $filename = 'file.txt')
 {
 	$hash = md5($code);
-	if(isset($_GET['download']) && $_GET['download'] === $hash)
+	if (isset($_GET['download']) && $_GET['download'] === $hash)
 	{
 		// Download file
 		ob_end_clean();
@@ -256,18 +293,81 @@ function dump_code($code, $filename = 'file.txt')
 	echo '<textarea id="code-', $hash, '" onfocus="this.select();" style="width: 98%; height: 200px;">', htmlspecialchars($code), '</textarea><br />';
 }
 
-function css($list, $path = './')
+function css($list, $path = './', $bidi = false)
 {
 	$code = '';
-	foreach($list as $key => $row)
+	// Change value to true if you want images to be grouped up by size
+	$group = $bidi;
+	if ($group)
 	{
-		if(!strlen($row['file'])) continue;
-		$code .= '.imageset.' . substr($key, 4) . ' {
+		// group up images by size
+		$groups = array();
+		foreach ($list as $key => $row)
+		{
+			if (!strlen($row['file']))
+			{
+				continue;
+			}
+			$groups[$row['width'] . '*' . $row['height']][] = $key;
+		}
+		foreach ($groups as $size => $keys)
+		{
+			$extra = '';
+			for ($i=0; $i<count($keys); $i++)
+			{
+				$code .= ($i == 0 ? '' : ', ') . ($bidi ? '.rtl ' : '') . '.imageset.' . substr($keys[$i], 4);
+				if (!$bidi)
+				{
+					$extra .= '.imageset.' . substr($keys[$i], 4) . ' { background-image: url("' . $path . $list[$keys[$i]]['file'] . "\"); }\n";
+				}
+			}
+			$row = $list[$keys[0]];
+			$code .= ' {';
+			if ($bidi)
+			{
+				$code .= '
+	padding-right: ' . $row['width'] . 'px;
+	padding-left: 0;
+}
+';
+			}
+			else
+			{
+				$code .= '
+	padding-left: ' . $row['width'] . 'px;
+	padding-top: ' . $row['height'] . 'px;
+}
+' . $extra;
+			}
+		}
+	}
+	else
+	{
+		foreach ($list as $key => $row)
+		{
+			if (!strlen($row['file']))
+			{
+				continue;
+			}
+			$code .= ($bidi ? '.rtl ' : '') . '.imageset.' . substr($key, 4) . ' {';
+			if ($bidi)
+			{
+				$code .= '
+	padding-right: ' . $row['width'] . 'px;
+	padding-left: 0;
+}
+';
+			}
+			else
+			{
+				$code .= '
 	background-image: url("' . $path . $row['file'] . '");
 	padding-left: ' . $row['width'] . 'px;
 	padding-top: ' . $row['height'] . 'px;
 }
 ';
+			}
+		}
 	}
 	return $code;
 }
diff --git a/phpBB/styles/prosilver/theme/bidi.css b/phpBB/styles/prosilver/theme/bidi.css
index 81b916d373..6d77cb43f0 100644
--- a/phpBB/styles/prosilver/theme/bidi.css
+++ b/phpBB/styles/prosilver/theme/bidi.css
@@ -755,3 +755,33 @@
 .rtl #wrap, .rtl .headerbar, .rtl #site-description, .rtl .navbar {
 	position: relative;
 }
+
+/* Former imageset */
+.rtl .imageset.site_logo {
+	padding-right: 139px;
+	padding-left: 0;
+}
+.rtl .imageset.forum_link, .rtl .imageset.forum_read, .rtl .imageset.forum_read_locked, .rtl .imageset.forum_read_subforum, .rtl .imageset.forum_unread, .rtl .imageset.forum_unread_locked, .rtl .imageset.forum_unread_subforum, .rtl .imageset.topic_moved, .rtl .imageset.topic_read, .rtl .imageset.topic_read_mine, .rtl .imageset.topic_read_hot, .rtl .imageset.topic_read_hot_mine, .rtl .imageset.topic_read_locked, .rtl .imageset.topic_read_locked_mine, .rtl .imageset.topic_unread, .rtl .imageset.topic_unread_mine, .rtl .imageset.topic_unread_hot, .rtl .imageset.topic_unread_hot_mine, .rtl .imageset.topic_unread_locked, .rtl .imageset.topic_unread_locked_mine, .rtl .imageset.sticky_read, .rtl .imageset.sticky_read_mine, .rtl .imageset.sticky_read_locked, .rtl .imageset.sticky_read_locked_mine, .rtl .imageset.sticky_unread, .rtl .imageset.sticky_unread_mine, .rtl .imageset.sticky_unread_locked, .rtl .imageset.sticky_unread_locked_mine, .rtl .imageset.announce_read, .rtl .imageset.announce_read_mine, .rtl .imageset.announce_read_locked, .rtl .imageset.announce_read_locked_mine, .rtl .imageset.announce_unread, .rtl .imageset.announce_unread_mine, .rtl .imageset.announce_unread_locked, .rtl .imageset.announce_unread_locked_mine, .rtl .imageset.global_read, .rtl .imageset.global_read_mine, .rtl .imageset.global_read_locked, .rtl .imageset.global_read_locked_mine, .rtl .imageset.global_unread, .rtl .imageset.global_unread_mine, .rtl .imageset.global_unread_locked, .rtl .imageset.global_unread_locked_mine, .rtl .imageset.pm_read, .rtl .imageset.pm_unread {
+	padding-right: 27px;
+	padding-left: 0;
+}
+.rtl .imageset.subforum_read, .rtl .imageset.subforum_unread, .rtl .imageset.icon_post_target, .rtl .imageset.icon_post_target_unread, .rtl .imageset.icon_topic_latest, .rtl .imageset.icon_topic_newest {
+	padding-right: 11px;
+	padding-left: 0;
+}
+.rtl .imageset.icon_back_top {
+	padding-right: 11px;
+	padding-left: 0;
+}
+.rtl .imageset.icon_contact_aim, .rtl .imageset.icon_contact_email, .rtl .imageset.icon_contact_icq, .rtl .imageset.icon_contact_jabber, .rtl .imageset.icon_contact_msnm, .rtl .imageset.icon_contact_www, .rtl .imageset.icon_contact_yahoo, .rtl .imageset.icon_post_delete, .rtl .imageset.icon_post_info, .rtl .imageset.icon_post_report, .rtl .imageset.icon_user_warn {
+	padding-right: 20px;
+	padding-left: 0;
+}
+.rtl .imageset.icon_topic_attach {
+	padding-right: 7px;
+	padding-left: 0;
+}
+.rtl .imageset.icon_topic_reported, .rtl .imageset.icon_topic_unapproved {
+	padding-right: 16px;
+	padding-left: 0;
+}
\ No newline at end of file
diff --git a/phpBB/styles/prosilver/theme/imageset.css b/phpBB/styles/prosilver/theme/imageset.css
index cebab7845d..cb99e9e715 100644
--- a/phpBB/styles/prosilver/theme/imageset.css
+++ b/phpBB/styles/prosilver/theme/imageset.css
@@ -4,7 +4,6 @@ span.imageset {
 	background: transparent none 0 0 no-repeat;
 	margin: 0;
 	padding: 0;
-	padding-right: 0 !important;
 	width: 0;
 	height: 0;
 	overflow: hidden;
diff --git a/phpBB/styles/subsilver2/theme/stylesheet.css b/phpBB/styles/subsilver2/theme/stylesheet.css
index a753c914ba..427fe85e37 100644
--- a/phpBB/styles/subsilver2/theme/stylesheet.css
+++ b/phpBB/styles/subsilver2/theme/stylesheet.css
@@ -1099,3 +1099,41 @@ a.imageset {
 	padding-left: 97px;
 	padding-top: 27px;
 }
+
+/* RTL imageset entries */
+.rtl .imageset.site_logo {
+	padding-right: 170px;
+	padding-left: 0;
+}
+.rtl .imageset.upload_bar {
+	padding-right: 280px;
+	padding-left: 0;
+}
+.rtl .imageset.poll_left, .rtl .imageset.poll_right {
+	padding-right: 4px;
+	padding-left: 0;
+}
+.rtl .imageset.poll_center {
+	padding-right: 1px;
+	padding-left: 0;
+}
+.rtl .imageset.forum_link, .rtl .imageset.forum_read, .rtl .imageset.forum_read_locked, .rtl .imageset.forum_read_subforum, .rtl .imageset.forum_unread, .rtl .imageset.forum_unread_locked, .rtl .imageset.forum_unread_subforum {
+	padding-right: 46px;
+	padding-left: 0;
+}
+.rtl .imageset.topic_moved, .rtl .imageset.topic_read, .rtl .imageset.topic_read_mine, .rtl .imageset.topic_read_hot, .rtl .imageset.topic_read_hot_mine, .rtl .imageset.topic_read_locked, .rtl .imageset.topic_read_locked_mine, .rtl .imageset.topic_unread, .rtl .imageset.topic_unread_mine, .rtl .imageset.topic_unread_hot, .rtl .imageset.topic_unread_hot_mine, .rtl .imageset.topic_unread_locked, .rtl .imageset.topic_unread_locked_mine, .rtl .imageset.sticky_read, .rtl .imageset.sticky_read_mine, .rtl .imageset.sticky_read_locked, .rtl .imageset.sticky_read_locked_mine, .rtl .imageset.sticky_unread, .rtl .imageset.sticky_unread_mine, .rtl .imageset.sticky_unread_locked, .rtl .imageset.sticky_unread_locked_mine, .rtl .imageset.announce_read, .rtl .imageset.announce_read_mine, .rtl .imageset.announce_read_locked, .rtl .imageset.announce_read_locked_mine, .rtl .imageset.announce_unread, .rtl .imageset.announce_unread_mine, .rtl .imageset.announce_unread_locked, .rtl .imageset.announce_unread_locked_mine, .rtl .imageset.global_read, .rtl .imageset.global_read_mine, .rtl .imageset.global_read_locked, .rtl .imageset.global_read_locked_mine, .rtl .imageset.global_unread, .rtl .imageset.global_unread_mine, .rtl .imageset.global_unread_locked, .rtl .imageset.global_unread_locked_mine, .rtl .imageset.pm_read, .rtl .imageset.pm_unread, .rtl .imageset.icon_topic_reported, .rtl .imageset.icon_topic_unapproved {
+	padding-right: 19px;
+	padding-left: 0;
+}
+.rtl .imageset.icon_post_target, .rtl .imageset.icon_post_target_unread {
+	padding-right: 12px;
+	padding-left: 0;
+}
+.rtl .imageset.icon_topic_attach {
+	padding-right: 14px;
+	padding-left: 0;
+}
+.rtl .imageset.icon_topic_latest, .rtl .imageset.icon_topic_newest {
+	padding-right: 18px;
+	padding-left: 0;
+}