diff -x .svn -aruN 3.0.3.src/adm/style/acp_profile.html 3.0.4.src/adm/style/acp_profile.html
--- 3.0.3.src/adm/style/acp_profile.html	2008-12-09 13:18:40.000000000 -0600
+++ 3.0.4.src/adm/style/acp_profile.html	2008-12-15 09:05:33.000000000 -0600
@@ -48,20 +48,20 @@
 		<fieldset>
 			<legend>{L_VISIBILITY_OPTION}</legend>
 		<dl>
-			<dt><label for="field_option_none">{L_DISPLAY_AT_PROFILE}:</label><br /><span>{L_DISPLAY_AT_PROFILE_EXPLAIN}</span></dt>
-			<dd><input type="radio" class="radio" id="field_option_none" name="field_option" value="none"<!-- IF not S_SHOW_ON_REG and not S_FIELD_REQUIRED and not S_FIELD_HIDE --> checked="checked"<!-- ENDIF --> /></dd>
+			<dt><label for="field_show_profile">{L_DISPLAY_AT_PROFILE}:</label><br /><span>{L_DISPLAY_AT_PROFILE_EXPLAIN}</span></dt>
+			<dd><input type="checkbox" class="radio" id="field_show_profile" name="field_show_profile" value="1"<!-- IF S_SHOW_PROFILE --> checked="checked"<!-- ENDIF --> /></dd>
 		</dl>
 		<dl>
 			<dt><label for="field_show_on_reg">{L_DISPLAY_AT_REGISTER}:</label><br /><span>{L_DISPLAY_AT_REGISTER_EXPLAIN}</span></dt>
-			<dd><input type="radio" class="radio" id="field_show_on_reg" name="field_option" value="field_show_on_reg"<!-- IF S_SHOW_ON_REG --> checked="checked"<!-- ENDIF --> /></dd>
+			<dd><input type="checkbox" class="radio" id="field_show_on_reg" name="field_show_on_reg" value="1"<!-- IF S_SHOW_ON_REG --> checked="checked"<!-- ENDIF --> /></dd>
 		</dl>
 		<dl>
 			<dt><label for="field_required">{L_REQUIRED_FIELD}:</label><br /><span>{L_REQUIRED_FIELD_EXPLAIN}</span></dt>
-			<dd><input type="radio" class="radio" id="field_required" name="field_option" value="field_required"<!-- IF S_FIELD_REQUIRED --> checked="checked"<!-- ENDIF --> /></dd>
+			<dd><input type="checkbox" class="radio" id="field_required" name="field_required" value="1"<!-- IF S_FIELD_REQUIRED --> checked="checked"<!-- ENDIF --> /></dd>
 		</dl>
 		<dl>
 			<dt><label for="field_hide">{L_HIDE_PROFILE_FIELD}:</label><br /><span>{L_HIDE_PROFILE_FIELD_EXPLAIN}</span></dt>
-			<dd><input type="radio" class="radio" id="field_hide" name="field_option" value="field_hide"<!-- IF S_FIELD_HIDE --> checked="checked"<!-- ENDIF --> /></dd>
+			<dd><input type="checkbox" class="radio" id="field_hide" name="field_hide" value="1"<!-- IF S_FIELD_HIDE --> checked="checked"<!-- ENDIF --> /></dd>
 		</dl>
 		</fieldset>
 
diff -x .svn -aruN 3.0.3.src/adm/style/install_update.html 3.0.4.src/adm/style/install_update.html
--- 3.0.3.src/adm/style/install_update.html	2008-12-09 13:18:40.000000000 -0600
+++ 3.0.4.src/adm/style/install_update.html	2008-12-15 09:05:33.000000000 -0600
@@ -63,7 +63,7 @@
 	<p>{L_UPDATE_SUCCESS_EXPLAIN}</p>
 
 	<fieldset class="submit-buttons">
-		<input class="button1" type="submit" name="check_again" value="{L_CHECK_FILES_AGAIN}" />
+		<input class="button1" type="submit" name="check_again" value="{L_CONTINUE_UPDATE}" />
 	</fieldset>
 
 	</form>
diff -x .svn -aruN 3.0.3.src/docs/CHANGELOG.html 3.0.4.src/docs/CHANGELOG.html
--- 3.0.3.src/docs/CHANGELOG.html	2008-12-09 13:18:39.000000000 -0600
+++ 3.0.4.src/docs/CHANGELOG.html	2008-12-15 09:05:32.000000000 -0600
@@ -53,6 +53,7 @@
 <ol>
 	<li><a href="#changelog">Changelog</a>
 	<ol style="list-style-type: lower-roman;">
+		<li><a href="#v303">Changes since 3.0.3</a></li>
 		<li><a href="#v302">Changes since 3.0.2</a></li>
 		<li><a href="#v301">Changes since 3.0.1</a></li>
 		<li><a href="#v300">Changes since 3.0.0</a></li>
@@ -82,8 +83,39 @@
 		<div class="inner"><span class="corners-top"><span></span></span>
 
 		<div class="content">
+	<a name="v303"></a><h3>1.i. Changes since 3.0.3</h3>
 
-	<a name="v302"></a><h3>1.i. Changes since 3.0.2</h3>
+	<ul>
+		<li>[Fix] Allow mixed-case template directories to be inherited (Bug #36725)</li>
+		<li>[Fix] Regression bug from revision #8908 regarding log display in ACP</li>
+		<li>[Fix] Allow the UCP group management to work for groups with avatars. (Bug #37375)</li>
+		<li>[Fix] Fix header list build for replying oldest PM in PM history (Bug #37275)</li>
+		<li>[Fix] Do not display COPPA group in memberlist find member dialog if COPPA disabled (Bug #37175)</li>
+		<li>[Fix] Do not try to send jabber notifications if no jid entered (Bug #36775)</li>
+		<li>[Fix] Only display special ranks to guests; no longer display normal ranks for guests (Bug #36735)</li>
+		<li>[Fix] Properly treat punctuation marks after local urls (Bug #37055)</li>
+		<li>[Fix] Make searching for members by YIM address work in prosilver</li>
+		<li>[Fix] Tell users to recreate the search index after changing the common word threshold for fulltext_native (Bug #36345)</li>
+		<li>[Fix] Adjusted phpbb_chmod() to always set permissions for group bit.</li>
+		<li>[Fix] Do not increment users post count after post approval if post had been posted in a forum with no post count increasing set (Bug #37865)</li>
+		<li>[Fix] Extend vertical line for last post column if no posts in forum (Bug #37125)</li>
+		<li>[Fix] correctly update last topic/forum information if changing guest usernames through editing posts (Bug #38095)</li>
+		<li>[Fix] fix postcount resync for situations where low and high post ids are higher than step value, resulting in users having 0 posts. (Bug #38195)</li>
+		<li>[Fix] Use a left join for the topics table on search to avoid trouble with FROM syntax on some databases (Bug #37005)</li>
+		<li>[Fix] Do not show 'Forward' button if the user cannot send PM's</li>
+		<li>[Change] Alllow applications to set custom module inclusion path (idea by HoL)</li>
+		<li>[Change] Handle checking for duplicate usernames in chunks (Bug #17285 - Patch by A_Jelly_Doughnut)</li>
+		<li>[Change] Better handling and finer control for custom profile fields visibility options. (Patch by Highway of Life)</li>
+		<li>[Change] Performance increase for format_date() (Bug #37575 - Patch by BartVB)</li>
+		<li>[Change] Changed prosilver date separator from 'on' to '&raquo;'</li>
+		<li>[Change] Performance increase for get_username_string() (Bug #37545 - Patch by BartVB)</li>
+		<li>[Change] Slight performance increase for common parameter calls to append_sid() (Bug #37555 - Patch by BartVB)</li>
+		<li>[Feature] Added 'AGO' setting to relative date strings. For example: posted 14 minutes ago. (Patch by BartVB)</li>
+		<li>[Sec] Fixed an issue where deactivated accounts could be re-activated without the required privileges. (Reported by Jorick)</li>
+		<li>[Sec] Ask for forum password if post within passworded forum quoted in private message. (Reported by nickvergessen)</li>
+	</ul>
+
+	<a name="v302"></a><h3>1.ii. Changes since 3.0.2</h3>
 
 	<ul>
 		<li>[Fix] Correctly set topic starter if first post in topic removed (Bug #30575 - Patch by blueray2048)</li>
@@ -166,6 +198,7 @@
 		<li>[Change] MCP topic view checkboxes now default to unchecked.</li>
 		<li>[Change] Adjust language key <em>SPLIT_AFTER</em> to make the action clearer.</li>
 		<li>[Change] Add links to the post and forum when viewing a report from the MCP. (Bugs #33795, #33805)</li>
+		<li>[Change] Added CSRF protection to GET-only actions like marking forums.</li>
 		<li>[Change] Remove NUL-Bytes directly in request_var() for strings and within the custom DBAL sql_escape() functions (MSSQL, Firebird, Oracle) (reported by AdhostMikeSw)</li>
 
 		<li>[Feature] Allow limited inheritance for template sets.</li>
@@ -181,7 +214,7 @@
 		<li>[Sec Precaution] Stricter validation of the HTTP_HOST header (Thanks to Techie-Micheal et al for pointing out possible issues in derived code)</li>
 	</ul>
 
-	<a name="v301"></a><h3>1.ii. Changes since 3.0.1</h3>
+	<a name="v301"></a><h3>1.iii. Changes since 3.0.1</h3>
 
 	<ul>
 		<li>[Fix] Ability to set permissions on non-mysql dbms (Bug #24955)</li>
@@ -229,7 +262,7 @@
 		<li>[Sec] Only allow urls gone through redirect() being used within login_box(). (thanks nookieman)</li>
 	</ul>
 
-	<a name="v300"></a><h3>1.iii. Changes since 3.0.0</h3>
+	<a name="v300"></a><h3>1.iv. Changes since 3.0.0</h3>
 
 	<ul>
 		<li>[Change] Validate birthdays (Bug #15004)</li>
@@ -300,7 +333,7 @@
 		<li>[Fix] Find and display colliding usernames correctly when converting from one database to another (Bug #23925)</li>
 	</ul>
 
-	<a name="v30rc8"></a><h3>1.iv. Changes since 3.0.RC8</h3>
+	<a name="v30rc8"></a><h3>1.v. Changes since 3.0.RC8</h3>
 
 	<ul>
 		<li>[Fix] Cleaned usernames contain only single spaces, so &quot;a_name&quot; and &quot;a__name&quot; are treated as the same name (Bug #15634)</li>
@@ -309,7 +342,7 @@
 		<li>[Fix] Call garbage_collection() within database updater to correctly close connections (affects Oracle for example)</li>
 	</ul>
 
-	<a name="v30rc7"></a><h3>1.v. Changes since 3.0.RC7</h3>
+	<a name="v30rc7"></a><h3>1.vi. Changes since 3.0.RC7</h3>
 
 	<ul>
 		<li>[Fix] Fixed MSSQL related bug in the update system</li>
@@ -344,7 +377,7 @@
 		<li>[Fix] No duplication of active topics (Bug #15474)</li>
 	</ul>
 
-	<a name="v30rc6"></a><h3>1.vi. Changes since 3.0.RC6</h3>
+	<a name="v30rc6"></a><h3>1.vii. Changes since 3.0.RC6</h3>
 
 	<ul>
 		<li>[Fix] Submitting language changes using acp_language (Bug #14736)</li>
@@ -354,7 +387,7 @@
 		<li>[Fix] Able to request new password (Bug #14743)</li>
 	</ul>
 
-	<a name="v30rc5"></a><h3>1.vii. Changes since 3.0.RC5</h3>
+	<a name="v30rc5"></a><h3>1.viii. Changes since 3.0.RC5</h3>
 
 	<ul>
 		<li>[Feature] Removing constant PHPBB_EMBEDDED in favor of using an exit_handler(); the constant was meant to achive this more or less.</li>
@@ -417,7 +450,7 @@
 		<li>[Sec] New password hashing mechanism for storing passwords (#i42)</li>
 	</ul>
 
-	<a name="v30rc4"></a><h3>1.viii. Changes since 3.0.RC4</h3>
+	<a name="v30rc4"></a><h3>1.ix. Changes since 3.0.RC4</h3>
 
 	<ul>
 		<li>[Fix] MySQL, PostgreSQL and SQLite related database fixes (Bug #13862)</li>
@@ -468,7 +501,7 @@
 		<li>[Fix] odbc_autocommit causing existing result sets to be dropped (Bug #14182)</li>
 	</ul>
 
-	<a name="v30rc3"></a><h3>1.ix. Changes since 3.0.RC3</h3>
+	<a name="v30rc3"></a><h3>1.x. Changes since 3.0.RC3</h3>
 
 	<ul>
 		<li>[Fix] Fixing some subsilver2 and prosilver style issues</li>
@@ -577,7 +610,7 @@
 
 	</ul>
 
-	<a name="v30rc2"></a><h3>1.x. Changes since 3.0.RC2</h3>
+	<a name="v30rc2"></a><h3>1.xi. Changes since 3.0.RC2</h3>
 
 	<ul>
 		<li>[Fix] Re-allow searching within the memberlist</li>
@@ -602,7 +635,7 @@
 		<li>[Fix] Use our global expression for checking email syntax in memberlist (Bug #12827)</li>
 		<li>[Fix] Correctly retrieve/refresh templates stored in database if using subdirectories within template directory (Bug #12839)</li>
 		<li>[Fix] Correctly translate special group names in ucp_groups.php (Bug #12597)</li>
-		<li>[Fix] Search boxes not loosing session id (changing method from get to post) (Bug #12643)</li>
+		<li>[Fix] Search boxes not losing session id (changing method from get to post) (Bug #12643)</li>
 		<li>[Fix] Make sure the automatic update is also working for those having fsockopen disabled</li>
 		<li>[Fix] Simulate recache of theme data on automatic update finished page - recaching it if css data changed</li>
 		<li>[Feature] Allow dropping in custom &quot;info_[module class]_*.php&quot; files to language/*/mods directory for inclusion into the menu structure without the need to modify phpBB language files for menu placements</li>
@@ -623,7 +656,7 @@
 
 	</ul>
 
-	<a name="v30rc1"></a><h3>1.xi. Changes since 3.0.RC1</h3>
+	<a name="v30rc1"></a><h3>1.xii. Changes since 3.0.RC1</h3>
 
 	<ul>
 		<li>[Fix] (X)HTML issues within the templates (Bug #11255, #11255)</li>
diff -x .svn -aruN 3.0.3.src/docs/INSTALL.html 3.0.4.src/docs/INSTALL.html
--- 3.0.3.src/docs/INSTALL.html	2008-12-09 13:18:39.000000000 -0600
+++ 3.0.4.src/docs/INSTALL.html	2008-12-15 09:05:32.000000000 -0600
@@ -273,7 +273,7 @@
 
 	<p>This package is meant for those wanting to only replace changed files from a previous version to the latest version. This package normally contains the changed files from up to five previous versions.</p>
 
-	<p>This package contains a number of archives, each contains the files changed from a given release to the latest version. You should select the appropriate archive for your current version, e.g. if you currently have <samp>3.0.2</samp> you should select the phpBB-3.0.2_to_3.0.3.zip/tar.gz file.</p>
+	<p>This package contains a number of archives, each contains the files changed from a given release to the latest version. You should select the appropriate archive for your current version, e.g. if you currently have <samp>3.0.3</samp> you should select the phpBB-3.0.3_to_3.0.4.zip/tar.gz file.</p>
 
 	<p>The directory structure has been preserved enabling you (if you wish) to simply upload the contents of the archive to the appropriate location on your server, i.e. simply overwrite the existing files with the new versions. Do not forget that if you have installed any MODs these files will overwrite the originals possibly destroying them in the process. You will need to re-add MODs to any affected file before uploading.</p>
 
@@ -285,7 +285,7 @@
 
 	<p>The patch file is one solution for those with many Modifications (MODs) or other changes who do not want to re-add them back to all the changed files if they use the method explained above. To use this you will need command line access to a standard UNIX type <strong>patch</strong> application. If you do not have access to such an application but still want to use this update approach, we strongly recommend the <a href="#update_auto">Automatic update package</a> explained below. It is also the preferred update method.</p>
 
-	<p>A number of patch files are provided to allow you to update from previous stable releases. Select the correct patch, e.g. if your current version is 3.0.2 you need the phpBB-3.0.2_to_3.0.3.patch file. Place the correct patch in the parent directory containing the phpBB3 core files (i.e. index.php, viewforum.php, etc.). With this done you should run the following command: <strong>patch -cl -d [PHPBB DIRECTORY] -p1 &lt; [PATCH NAME]</strong> (where PHPBB DIRECTORY is the directory name your phpBB Installation resides in, for example phpBB3, and where PATCH NAME is the relevant filename of the selected patch file). This should complete quickly, hopefully without any HUNK FAILED comments.</p>
+	<p>A number of patch files are provided to allow you to update from previous stable releases. Select the correct patch, e.g. if your current version is 3.0.3 you need the phpBB-3.0.3_to_3.0.4.patch file. Place the correct patch in the parent directory containing the phpBB3 core files (i.e. index.php, viewforum.php, etc.). With this done you should run the following command: <strong>patch -cl -d [PHPBB DIRECTORY] -p1 &lt; [PATCH NAME]</strong> (where PHPBB DIRECTORY is the directory name your phpBB Installation resides in, for example phpBB3, and where PATCH NAME is the relevant filename of the selected patch file). This should complete quickly, hopefully without any HUNK FAILED comments.</p>
 
 	<p>If you do get failures you should look at using the <a href="#update_files">Changed files only</a> package to replace the files which failed to patch, please note that you will need to manually re-add any Modifications (MODs) to these particular files. Alternatively if you know how you can examine the .rej files to determine what failed where and make manual adjustments to the relevant source.</p>
 
diff -x .svn -aruN 3.0.3.src/includes/acm/acm_file.php 3.0.4.src/includes/acm/acm_file.php
--- 3.0.3.src/includes/acm/acm_file.php	2008-12-09 13:18:40.000000000 -0600
+++ 3.0.4.src/includes/acm/acm_file.php	2008-12-15 09:05:32.000000000 -0600
@@ -2,7 +2,7 @@
 /**
 *
 * @package acm
-* @version $Id: acm_file.php 8955 2008-09-29 15:58:42Z acydburn $
+* @version $Id: acm_file.php 9076 2008-11-22 19:06:42Z acydburn $
 * @copyright (c) 2005 phpBB Group
 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
 *
@@ -93,6 +93,12 @@
 			@flock($fp, LOCK_UN);
 			fclose($fp);
 
+			if (!function_exists('phpbb_chmod'))
+			{
+				global $phpbb_root_path;
+				include($phpbb_root_path . 'includes/functions.' . $phpEx);
+			}
+
 			phpbb_chmod($this->cache_dir . 'data_global.' . $phpEx, CHMOD_WRITE);
 		}
 		else
@@ -193,10 +199,16 @@
 			if ($fp = @fopen($this->cache_dir . "data{$var_name}.$phpEx", 'wb'))
 			{
 				@flock($fp, LOCK_EX);
-				fwrite($fp, "<?php\n\$expired = (time() > " . (time() + $ttl) . ") ? true : false;\nif (\$expired) { return; }\n\n\$data = unserialize(" . var_export(serialize($var), true) . ");\n\n?>");
+				fwrite($fp, "<?php\n\$expired = (time() > " . (time() + $ttl) . ") ? true : false;\nif (\$expired) { return; }\n\n\$data =  " . (sizeof($var) ? "unserialize(" . var_export(serialize($var), true) . ");" : 'array();') . "\n\n?>");
 				@flock($fp, LOCK_UN);
 				fclose($fp);
 
+				if (!function_exists('phpbb_chmod'))
+				{
+					global $phpbb_root_path;
+					include($phpbb_root_path . 'includes/functions.' . $phpEx);
+				}
+
 				phpbb_chmod($this->cache_dir . "data{$var_name}.$phpEx", CHMOD_WRITE);
 			}
 		}
@@ -412,10 +424,16 @@
 			$file = "<?php\n\n/* " . str_replace('*/', '*\/', $query) . " */\n";
 			$file .= "\n\$expired = (time() > " . (time() + $ttl) . ") ? true : false;\nif (\$expired) { return; }\n";
 
-			fwrite($fp, $file . "\n\$this->sql_rowset[\$query_id] = unserialize(" . var_export(serialize($this->sql_rowset[$query_id]), true) . ");\n\n?>");
+			fwrite($fp, $file . "\n\$this->sql_rowset[\$query_id] = " . (sizeof($this->sql_rowset[$query_id]) ? "unserialize(" . var_export(serialize($this->sql_rowset[$query_id]), true) . ");" : 'array();') . "\n\n?>");
 			@flock($fp, LOCK_UN);
 			fclose($fp);
 
+			if (!function_exists('phpbb_chmod'))
+			{
+				global $phpbb_root_path;
+				include($phpbb_root_path . 'includes/functions.' . $phpEx);
+			}
+
 			phpbb_chmod($filename, CHMOD_WRITE);
 
 			$query_result = $query_id;
diff -x .svn -aruN 3.0.3.src/includes/acp/acp_main.php 3.0.4.src/includes/acp/acp_main.php
--- 3.0.3.src/includes/acp/acp_main.php	2008-12-09 13:18:40.000000000 -0600
+++ 3.0.4.src/includes/acp/acp_main.php	2008-12-15 09:05:32.000000000 -0600
@@ -2,7 +2,7 @@
 /**
 *
 * @package acp
-* @version $Id: acp_main.php 9056 2008-11-09 19:38:44Z toonarmy $
+* @version $Id: acp_main.php 9171 2008-12-04 14:53:04Z acydburn $
 * @copyright (c) 2005 phpBB Group
 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
 *
@@ -185,12 +185,36 @@
 						}
 
 						// Resync post counts
-						$start = 0;
-						$step = ($config['num_posts']) ? (max((int) ($config['num_posts'] / 5), 20000)) : 20000;
+						$start = $max_post_id = 0;
+
+						// Find the maximum post ID, we can only stop the cycle when we've reached it
+						$sql = 'SELECT MAX(forum_last_post_id) as max_post_id
+							FROM ' . FORUMS_TABLE;
+						$result = $db->sql_query($sql);
+						$max_post_id = (int) $db->sql_fetchfield('max_post_id');
+						$db->sql_freeresult($result);
+
+						// No maximum post id? :o
+						if (!$max_post_id)
+						{
+							$sql = 'SELECT MAX(post_id)
+								FROM ' . POSTS_TABLE;
+							$result = $db->sql_query($sql);
+							$max_post_id = (int) $db->sql_fetchfield('max_post_id');
+							$db->sql_freeresult($result);
+						}
 
+						// Still no maximum post id? Then we are finished
+						if (!$max_post_id)
+						{
+							add_log('admin', 'LOG_RESYNC_POSTCOUNTS');
+							break;
+						}
+
+						$step = ($config['num_posts']) ? (max((int) ($config['num_posts'] / 5), 20000)) : 20000;
 						$db->sql_query('UPDATE ' . USERS_TABLE . ' SET user_posts = 0');
 
-						do
+						while ($start < $max_post_id)
 						{
 							$sql = 'SELECT COUNT(post_id) AS num_posts, poster_id
 								FROM ' . POSTS_TABLE . '
@@ -207,16 +231,11 @@
 									$db->sql_query($sql);
 								}
 								while ($row = $db->sql_fetchrow($result));
-
-								$start += $step;
-							}
-							else
-							{
-								$start = 0;
 							}
 							$db->sql_freeresult($result);
+
+							$start += $step;
 						}
-						while ($start);
 
 						add_log('admin', 'LOG_RESYNC_POSTCOUNTS');
 
diff -x .svn -aruN 3.0.3.src/includes/acp/acp_modules.php 3.0.4.src/includes/acp/acp_modules.php
--- 3.0.3.src/includes/acp/acp_modules.php	2008-12-09 13:18:40.000000000 -0600
+++ 3.0.4.src/includes/acp/acp_modules.php	2008-12-15 09:05:32.000000000 -0600
@@ -2,7 +2,7 @@
 /**
 *
 * @package acp
-* @version $Id: acp_modules.php 8479 2008-03-29 00:22:48Z naderman $
+* @version $Id: acp_modules.php 9179 2008-12-06 18:23:42Z toonarmy $
 * @copyright (c) 2005 phpBB Group
 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
 *
@@ -658,6 +658,8 @@
 
 			$iteration++;
 		}
+		$db->sql_freeresult($result);
+
 		unset($padding_store);
 
 		return $module_list;
diff -x .svn -aruN 3.0.3.src/includes/acp/acp_profile.php 3.0.4.src/includes/acp/acp_profile.php
--- 3.0.3.src/includes/acp/acp_profile.php	2008-12-09 13:18:40.000000000 -0600
+++ 3.0.4.src/includes/acp/acp_profile.php	2008-12-15 09:05:32.000000000 -0600
@@ -2,7 +2,7 @@
 /**
 *
 * @package acp
-* @version $Id: acp_profile.php 8479 2008-03-29 00:22:48Z naderman $
+* @version $Id: acp_profile.php 9127 2008-11-26 19:58:35Z acydburn $
 * @copyright (c) 2005 phpBB Group
 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
 *
@@ -77,7 +77,7 @@
 			FROM ' . PROFILE_LANG_TABLE . '
 			ORDER BY lang_id';
 		$result = $db->sql_query($sql);
-	
+
 		while ($row = $db->sql_fetchrow($result))
 		{
 			// Which languages are available for each item
@@ -206,7 +206,7 @@
 						'field_id'	=> $field_id,
 					)));
 				}
-	
+
 			break;
 
 			case 'activate':
@@ -216,7 +216,7 @@
 				{
 					trigger_error($user->lang['NO_FIELD_ID'] . adm_back_link($this->u_action), E_USER_WARNING);
 				}
-	
+
 				$sql = 'SELECT lang_id
 					FROM ' . LANG_TABLE . "
 					WHERE lang_iso = '" . $db->sql_escape($config['default_lang']) . "'";
@@ -253,7 +253,7 @@
 				{
 					trigger_error($user->lang['NO_FIELD_ID'] . adm_back_link($this->u_action), E_USER_WARNING);
 				}
-	
+
 				$sql = 'UPDATE ' . PROFILE_FIELDS_TABLE . "
 					SET field_active = 0
 					WHERE field_id = $field_id";
@@ -285,7 +285,7 @@
 
 			case 'create':
 			case 'edit':
-		
+
 				$field_id = request_var('field_id', 0);
 				$step = request_var('step', 1);
 
@@ -354,18 +354,19 @@
 				{
 					// We are adding a new field, define basic params
 					$lang_options = $field_row = array();
-		
+
 					$field_type = request_var('field_type', 0);
-			
+
 					if (!$field_type)
 					{
 						trigger_error($user->lang['NO_FIELD_TYPE'] . adm_back_link($this->u_action), E_USER_WARNING);
 					}
 
 					$field_row = array_merge($default_values[$field_type], array(
-						'field_ident'		=> utf8_clean_string(request_var('field_ident', '', true)),
+						'field_ident'		=> str_replace(' ', '_', utf8_clean_string(request_var('field_ident', '', true))),
 						'field_required'	=> 0,
 						'field_hide'		=> 0,
+						'field_show_profile'=> 0,
 						'field_no_view'		=> 0,
 						'field_show_on_reg'	=> 0,
 						'lang_name'			=> utf8_normalize_nfc(request_var('field_ident', '', true)),
@@ -378,7 +379,7 @@
 
 				// $exclude contains the data we gather in each step
 				$exclude = array(
-					1	=> array('field_ident', 'lang_name', 'lang_explain', 'field_option', 'field_no_view'),
+					1	=> array('field_ident', 'lang_name', 'lang_explain', 'field_option_none', 'field_show_on_reg', 'field_required', 'field_hide', 'field_show_profile', 'field_no_view'),
 					2	=> array('field_length', 'field_maxlen', 'field_minlen', 'field_validation', 'field_novalue', 'field_default_value'),
 					3	=> array('l_lang_name', 'l_lang_explain', 'l_lang_default_value', 'l_lang_options')
 				);
@@ -400,25 +401,20 @@
 				$cp->vars['lang_explain']		= utf8_normalize_nfc(request_var('lang_explain', $field_row['lang_explain'], true));
 				$cp->vars['lang_default_value']	= utf8_normalize_nfc(request_var('lang_default_value', $field_row['lang_default_value'], true));
 
-				// Field option...
-				if (isset($_REQUEST['field_option']))
-				{
-					$field_option = request_var('field_option', '');
+				// Visibility Options...
+				$visibility_ary = array(
+					'field_required',
+					'field_show_on_reg',
+					'field_show_profile',
+					'field_hide',
+				);
 
-					$cp->vars['field_required'] = ($field_option == 'field_required') ? 1 : 0;
-					$cp->vars['field_show_on_reg'] = ($field_option == 'field_show_on_reg') ? 1 : 0;
-					$cp->vars['field_hide'] = ($field_option == 'field_hide') ? 1 : 0;
-				}
-				else
+				foreach ($visibility_ary as $val)
 				{
-					$cp->vars['field_required'] = $field_row['field_required'];
-					$cp->vars['field_show_on_reg'] = $field_row['field_show_on_reg'];
-					$cp->vars['field_hide'] = $field_row['field_hide'];
-
-					$field_option = ($field_row['field_required']) ? 'field_required' : (($field_row['field_show_on_reg']) ? 'field_show_on_reg' : (($field_row['field_hide']) ? 'field_hide' : ''));
+					$cp->vars[$val] = ($submit || $save) ? request_var($val, 0) : $field_row[$val];
 				}
 
-				$cp->vars['field_no_view'] = request_var('field_no_view', $field_row['field_no_view']);
+				$cp->vars['field_no_view'] = request_var('field_no_view', (int) $field_row['field_no_view']);
 
 				// A boolean field expects an array as the lang options
 				if ($field_type == FIELD_BOOL)
@@ -481,7 +477,7 @@
 					else if ($field_type == FIELD_DATE && $key == 'field_default_value')
 					{
 						$always_now = request_var('always_now', -1);
-						
+
 						if ($always_now == 1 || ($always_now === -1 && $var == 'now'))
 						{
 							$now = getdate();
@@ -504,7 +500,7 @@
 							{
 								list($cp->vars['field_default_value_day'], $cp->vars['field_default_value_month'], $cp->vars['field_default_value_year']) = explode('-', $var);
 							}
-						}	
+						}
 					}
 					/* else if ($field_type == FIELD_BOOL && $key == 'field_default_value')
 					{
@@ -533,7 +529,7 @@
 					}
 					$db->sql_freeresult($result);
 
-		
+
 					$sql = 'SELECT lang_id, lang_name, lang_explain, lang_default_value
 						FROM ' . PROFILE_LANG_TABLE . '
 						WHERE lang_id <> ' . $this->edit_lang_id . "
@@ -550,7 +546,7 @@
 					}
 					$db->sql_freeresult($result);
 				}
-		
+
 				foreach ($exclude[3] as $key)
 				{
 					$cp->vars[$key] = utf8_normalize_nfc(request_var($key, array(0 => ''), true));
@@ -569,7 +565,7 @@
 						{
 							$cp->vars[$key][$lang_id] = explode("\n", $options);
 						}
-						
+
 					}
 				}
 
@@ -709,7 +705,7 @@
 
 					'L_TITLE'			=> $user->lang['STEP_' . $step . '_TITLE_' . strtoupper($action)],
 					'L_EXPLAIN'			=> $user->lang['STEP_' . $step . '_EXPLAIN_' . strtoupper($action)],
-					
+
 					'U_ACTION'			=> $this->u_action . "&amp;action=$action&amp;step=$step",
 					'U_BACK'			=> $this->u_action)
 				);
@@ -719,13 +715,14 @@
 				{
 					// Create basic options - only small differences between field types
 					case 1:
-	
+
 						// Build common create options
 						$template->assign_vars(array(
 							'S_STEP_ONE'		=> true,
 							'S_FIELD_REQUIRED'	=> ($cp->vars['field_required']) ? true : false,
 							'S_SHOW_ON_REG'		=> ($cp->vars['field_show_on_reg']) ? true : false,
 							'S_FIELD_HIDE'		=> ($cp->vars['field_hide']) ? true : false,
+							'S_SHOW_PROFILE'	=> ($cp->vars['field_show_profile']) ? true : false,
 							'S_FIELD_NO_VIEW'	=> ($cp->vars['field_no_view']) ? true : false,
 
 							'L_LANG_SPECIFIC'	=> sprintf($user->lang['LANG_SPECIFIC_OPTIONS'], $config['default_lang']),
@@ -746,7 +743,7 @@
 								'LANG_DEFAULT_VALUE'		=> $cp->vars['lang_default_value'])
 							);
 						}
-			
+
 						if ($field_type == FIELD_BOOL || $field_type == FIELD_DROPDOWN)
 						{
 							// Initialize these array elements if we are creating a new field
@@ -775,11 +772,11 @@
 								'SECOND_LANG_OPTION'		=> ($field_type == FIELD_BOOL) ? $cp->vars['lang_options'][1] : '')
 							);
 						}
-					
+
 					break;
 
 					case 2:
-						
+
 						$template->assign_vars(array(
 							'S_STEP_TWO'		=> true,
 							'L_NEXT_STEP'			=> (sizeof($this->lang_defs['iso']) == 1) ? $user->lang['SAVE'] : $user->lang['PROFILE_LANG_OPTIONS'])
@@ -817,7 +814,7 @@
 								);
 							}
 						}
-		
+
 					break;
 				}
 
@@ -829,7 +826,7 @@
 
 			break;
 		}
-		
+
 		$sql = 'SELECT *
 			FROM ' . PROFILE_FIELDS_TABLE . '
 			ORDER BY field_order';
@@ -905,14 +902,14 @@
 			$languages[$row['lang_id']] = $row['lang_iso'];
 		}
 		$db->sql_freeresult($result);
-		
+
 		$options = array();
 		$options['lang_name'] = 'string';
 		if ($cp->vars['lang_explain'])
 		{
 			$options['lang_explain'] = 'text';
 		}
-	
+
 		switch ($field_type)
 		{
 			case FIELD_BOOL:
@@ -922,7 +919,7 @@
 			case FIELD_DROPDOWN:
 				$options['lang_options'] = 'optionfield';
 			break;
-			
+
 			case FIELD_TEXT:
 			case FIELD_STRING:
 				if ($cp->vars['lang_default_value'])
@@ -931,7 +928,7 @@
 				}
 			break;
 		}
-	
+
 		$lang_options = array();
 
 		foreach ($options as $field => $field_type)
@@ -957,7 +954,7 @@
 				if ($field == 'lang_options')
 				{
 					$var = (!isset($cp->vars['l_lang_options'][$lang_id]) || !is_array($cp->vars['l_lang_options'][$lang_id])) ? $cp->vars['lang_options'] : $cp->vars['l_lang_options'][$lang_id];
-					
+
 					switch ($field_type)
 					{
 						case 'two_options':
@@ -978,7 +975,7 @@
 							);
 						break;
 					}
-				
+
 					if (isset($user->lang['CP_' . strtoupper($field) . '_EXPLAIN']))
 					{
 						$lang_options[$lang_id]['fields'][$field]['EXPLAIN'] = $user->lang['CP_' . strtoupper($field) . '_EXPLAIN'];
@@ -992,7 +989,7 @@
 						'TITLE'		=> $user->lang['CP_' . strtoupper($field)],
 						'FIELD'		=> ($field_type == 'string') ? '<dd><input class="medium" type="text" name="l_' . $field . '[' . $lang_id . ']" value="' . ((isset($value[$lang_id])) ? $value[$lang_id] : $var) . '" /></dd>' : '<dd><textarea name="l_' . $field . '[' . $lang_id . ']" rows="3" cols="80">' . ((isset($value[$lang_id])) ? $value[$lang_id] : $var) . '</textarea></dd>'
 					);
-			
+
 					if (isset($user->lang['CP_' . strtoupper($field) . '_EXPLAIN']))
 					{
 						$lang_options[$lang_id]['fields'][$field]['EXPLAIN'] = $user->lang['CP_' . strtoupper($field) . '_EXPLAIN'];
@@ -1040,6 +1037,7 @@
 			'field_required'		=> $cp->vars['field_required'],
 			'field_show_on_reg'		=> $cp->vars['field_show_on_reg'],
 			'field_hide'			=> $cp->vars['field_hide'],
+			'field_show_profile'	=> $cp->vars['field_show_profile'],
 			'field_no_view'			=> $cp->vars['field_no_view']
 		);
 
@@ -1065,7 +1063,7 @@
 				WHERE field_id = $field_id";
 			$db->sql_query($sql);
 		}
-		
+
 		if ($action == 'create')
 		{
 			$field_ident = 'pf_' . $field_ident;
@@ -1082,7 +1080,7 @@
 		{
 			$sql_ary['field_id'] = $field_id;
 			$sql_ary['lang_id'] = $default_lang_id;
-		
+
 			$profile_sql[] = 'INSERT INTO ' . PROFILE_LANG_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary);
 		}
 		else
@@ -1155,7 +1153,7 @@
 						AND lang_id = " . (int) $default_lang_id;
 				$db->sql_query($sql);
 			}
-			
+
 			foreach ($cp->vars['lang_options'] as $option_id => $value)
 			{
 				$sql_ary = array(
@@ -1258,7 +1256,7 @@
 					$lang_id = $sql['lang_id'];
 					$option_id = $sql['option_id'];
 					unset($sql['lang_id'], $sql['field_id'], $sql['option_id']);
-					
+
 					$this->update_insert(PROFILE_FIELDS_LANG_TABLE, $sql, array(
 						'lang_id'	=> $lang_id,
 						'field_id'	=> $field_id,
@@ -1278,7 +1276,7 @@
 				$db->sql_query($sql);
 			}
 		}
-		
+
 		$db->sql_transaction('commit');
 
 		if ($action == 'edit')
@@ -1324,7 +1322,7 @@
 		if (!$row)
 		{
 			$sql_ary = array_merge($where_fields, $sql_ary);
-			
+
 			if (sizeof($sql_ary))
 			{
 				$db->sql_query("INSERT INTO $table " . $db->sql_build_array('INSERT', $sql_ary));
@@ -1376,7 +1374,7 @@
 					case FIELD_BOOL:
 						$sql .= 'TINYINT(2) ';
 					break;
-				
+
 					case FIELD_DROPDOWN:
 						$sql .= 'MEDIUMINT(8) ';
 					break;
@@ -1612,4 +1610,4 @@
 	}
 }
 
-?>
\ No newline at end of file
+?>
diff -x .svn -aruN 3.0.3.src/includes/acp/acp_styles.php 3.0.4.src/includes/acp/acp_styles.php
--- 3.0.3.src/includes/acp/acp_styles.php	2008-12-09 13:18:40.000000000 -0600
+++ 3.0.4.src/includes/acp/acp_styles.php	2008-12-15 09:05:32.000000000 -0600
@@ -2,7 +2,7 @@
 /**
 *
 * @package acp
-* @version $Id: acp_styles.php 9056 2008-11-09 19:38:44Z toonarmy $
+* @version $Id: acp_styles.php 9152 2008-12-02 16:49:59Z acydburn $
 * @copyright (c) 2005 phpBB Group
 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
 *
@@ -2176,10 +2176,16 @@
 			$style_default = request_var('style_default', 0);
 			$store_db = request_var('store_db', 0);
 
-			$sql = "SELECT {$mode}_id
+			// If the admin selected the style to be the default style, but forgot to activate it... we will do it for him
+			if ($style_default)
+			{
+				$style_active = 1;
+			}
+
+			$sql = "SELECT {$mode}_id, {$mode}_name
 				FROM $sql_from
 				WHERE {$mode}_id <> $style_id
-				AND {$mode}_name = '" . $db->sql_escape(strtolower($name)) . "'";
+				AND LOWER({$mode}_name) = '" . $db->sql_escape(strtolower($name)) . "'";
 			$result = $db->sql_query($sql);
 			$conflict = $db->sql_fetchrow($result);
 			$db->sql_freeresult($result);
@@ -3206,7 +3212,7 @@
 		{
 			$sql = "SELECT {$mode}_id, {$mode}_name, {$mode}_path, {$mode}_storedb
 				FROM $sql_from
-				WHERE {$mode}_name = '" . $db->sql_escape(strtolower($cfg_data['inherit_from'])) . "'
+				WHERE {$mode}_name = '" . $db->sql_escape($cfg_data['inherit_from']) . "'
 					AND {$mode}_inherits_id = 0";
 			$result = $db->sql_query($sql);
 			$row = $db->sql_fetchrow($result);
diff -x .svn -aruN 3.0.3.src/includes/constants.php 3.0.4.src/includes/constants.php
--- 3.0.3.src/includes/constants.php	2008-12-09 13:18:40.000000000 -0600
+++ 3.0.4.src/includes/constants.php	2008-12-15 09:05:33.000000000 -0600
@@ -2,7 +2,7 @@
 /**
 *
 * @package phpBB3
-* @version $Id: constants.php 9050 2008-11-08 20:02:22Z acydburn $
+* @version $Id: constants.php 9187 2008-12-12 14:47:03Z acydburn $
 * @copyright (c) 2005 phpBB Group
 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
 *
@@ -25,7 +25,7 @@
 */
 
 // phpBB Version
-define('PHPBB_VERSION', '3.0.3');
+define('PHPBB_VERSION', '3.0.4');
 
 // QA-related
 // define('PHPBB_QA', 1);
diff -x .svn -aruN 3.0.3.src/includes/db/dbal.php 3.0.4.src/includes/db/dbal.php
--- 3.0.3.src/includes/db/dbal.php	2008-12-09 13:18:40.000000000 -0600
+++ 3.0.4.src/includes/db/dbal.php	2008-12-15 09:05:32.000000000 -0600
@@ -2,7 +2,7 @@
 /**
 *
 * @package dbal
-* @version $Id: dbal.php 8900 2008-09-19 17:12:04Z acydburn $
+* @version $Id: dbal.php 9178 2008-12-06 11:11:10Z acydburn $
 * @copyright (c) 2005 phpBB Group
 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
 *
@@ -500,19 +500,62 @@
 
 				$sql = str_replace('_', ' ', $query) . ' ' . $array['SELECT'] . ' FROM ';
 
-				$table_array = array();
+				// Build table array. We also build an alias array for later checks.
+				$table_array = $aliases = array();
+				$used_multi_alias = false;
+
 				foreach ($array['FROM'] as $table_name => $alias)
 				{
 					if (is_array($alias))
 					{
+						$used_multi_alias = true;
+
 						foreach ($alias as $multi_alias)
 						{
 							$table_array[] = $table_name . ' ' . $multi_alias;
+							$aliases[] = $multi_alias;
 						}
 					}
 					else
 					{
 						$table_array[] = $table_name . ' ' . $alias;
+						$aliases[] = $alias;
+					}
+				}
+
+				// We run the following code to determine if we need to re-order the table array. ;)
+				// The reason for this is that for multi-aliased tables (two equal tables) in the FROM statement the last table need to match the first comparison.
+				// DBMS who rely on this: Oracle, PostgreSQL and MSSQL. For all other DBMS it makes absolutely no difference in which order the table is.
+				if (!empty($array['LEFT_JOIN']) && sizeof($array['FROM']) > 1 && $used_multi_alias !== false)
+				{
+					// Take first LEFT JOIN
+					$join = current($array['LEFT_JOIN']);
+
+					// Determine the table used there (even if there are more than one used, we only want to have one
+					preg_match('/(' . implode('|', $aliases) . ')\.[^\s]+/U', str_replace(array('(', ')', 'AND', 'OR', ' '), '', $join['ON']), $matches);
+
+					// If there is a first join match, we need to make sure the table order is correct
+					if (!empty($matches[1]))
+					{
+						$first_join_match = trim($matches[1]);
+						$table_array = $last = array();
+
+						foreach ($array['FROM'] as $table_name => $alias)
+						{
+							if (is_array($alias))
+							{
+								foreach ($alias as $multi_alias)
+								{
+									($multi_alias === $first_join_match) ? $last[] = $table_name . ' ' . $multi_alias : $table_array[] = $table_name . ' ' . $multi_alias;
+								}
+							}
+							else
+							{
+								($alias === $first_join_match) ? $last[] = $table_name . ' ' . $alias : $table_array[] = $table_name . ' ' . $alias;
+							}
+						}
+
+						$table_array = array_merge($table_array, $last);
 					}
 				}
 
diff -x .svn -aruN 3.0.3.src/includes/db/oracle.php 3.0.4.src/includes/db/oracle.php
--- 3.0.3.src/includes/db/oracle.php	2008-12-09 13:18:40.000000000 -0600
+++ 3.0.4.src/includes/db/oracle.php	2008-12-15 09:05:32.000000000 -0600
@@ -2,7 +2,7 @@
 /**
 *
 * @package dbal
-* @version $Id: oracle.php 8967 2008-10-02 12:04:12Z acydburn $
+* @version $Id: oracle.php 9175 2008-12-05 11:18:59Z acydburn $
 * @copyright (c) 2005 phpBB Group
 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
 *
@@ -189,7 +189,7 @@
 					$out .= ' ' . $val[1] . '(';
 					$in_array = array();
 
-					// constuct each IN() clause	
+					// constuct each IN() clause
 					foreach ($in_clause as $in_values)
 					{
 						$in_array[] = $val[2] . ' ' . (isset($val[6]) ? $val[6] : '') . 'IN(' . implode(', ', $in_values) . ')';
diff -x .svn -aruN 3.0.3.src/includes/functions.php 3.0.4.src/includes/functions.php
--- 3.0.3.src/includes/functions.php	2008-12-09 13:18:40.000000000 -0600
+++ 3.0.4.src/includes/functions.php	2008-12-15 09:05:33.000000000 -0600
@@ -2,7 +2,7 @@
 /**
 *
 * @package phpBB3
-* @version $Id: functions.php 9057 2008-11-10 16:24:18Z Kellanved $
+* @version $Id: functions.php 9153 2008-12-02 17:02:56Z acydburn $
 * @copyright (c) 2005 phpBB Group
 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
 *
@@ -462,7 +462,7 @@
 /**
 * Global function for chmodding directories and files for internal use
 * This function determines owner and group whom the file belongs to and user and group of PHP and then set safest possible file permissions.
-* The function determines owner and group from common.php file and sets the same to the provided file.
+* The function determines owner and group from common.php file and sets the same to the provided file. Permissions are mapped to the group, user always has rw(x) permission.
 * The function uses bit fields to build the permissions.
 * The function sets the appropiate execute bit on directories.
 *
@@ -511,6 +511,7 @@
 			// Will most likely not work
 			if (@chown($filename, $common_php_owner));
 			{
+				clearstatcache();
 				$file_uid = fileowner($filename);
 			}
 		}
@@ -520,6 +521,7 @@
 		{
 			if (@chgrp($filename, $common_php_group));
 			{
+				clearstatcache();
 				$file_gid = filegroup($filename);
 			}
 		}
@@ -532,7 +534,7 @@
 	// Who is PHP?
 	if ($file_uid === false || $file_gid === false || $php_uid === false || $php_gids === false)
 	{
-		$php = null;
+		$php = NULL;
 	}
 	else if ($file_uid == $php_uid /* && $common_php_owner !== false && $common_php_owner === $file_uid*/)
 	{
@@ -564,16 +566,23 @@
 	{
 		case null:
 		case 'owner':
+			/* ATTENTION: if php is owner or NULL we set it to group here. This is the most failsafe combination for the vast majority of server setups.
+
 			$result = @chmod($filename, ($owner << 6) + (0 << 3) + (0 << 0));
 
+			clearstatcache();
+
 			if (!is_null($php) || (is_readable($filename) && is_writable($filename)))
 			{
 				break;
 			}
+		*/
 
 		case 'group':
 			$result = @chmod($filename, ($owner << 6) + ($perms << 3) + (0 << 0));
 
+			clearstatcache();
+
 			if (!is_null($php) || ((!($perms & CHMOD_READ) || is_readable($filename)) && (!($perms & CHMOD_WRITE) || is_writable($filename))))
 			{
 				break;
@@ -582,6 +591,8 @@
 		case 'other':
 			$result = @chmod($filename, ($owner << 6) + ($perms << 3) + ($perms << 0));
 
+			clearstatcache();
+
 			if (!is_null($php) || ((!($perms & CHMOD_READ) || is_readable($filename)) && (!($perms & CHMOD_WRITE) || is_writable($filename))))
 			{
 				break;
@@ -1820,30 +1831,45 @@
 		}
 	}
 
-	// Assign sid if session id is not specified
-	if ($session_id === false)
-	{
-		$session_id = $_SID;
-	}
-
-	$amp_delim = ($is_amp) ? '&amp;' : '&';
-	$url_delim = (strpos($url, '?') === false) ? '?' : $amp_delim;
-
-	// Appending custom url parameter?
-	$append_url = (!empty($_EXTRA_URL)) ? implode($amp_delim, $_EXTRA_URL) : '';
+	$params_is_array = is_array($params);
 
+	// Get anchor
 	$anchor = '';
 	if (strpos($url, '#') !== false)
 	{
 		list($url, $anchor) = explode('#', $url, 2);
 		$anchor = '#' . $anchor;
 	}
-	else if (!is_array($params) && strpos($params, '#') !== false)
+	else if (!$params_is_array && strpos($params, '#') !== false)
 	{
 		list($params, $anchor) = explode('#', $params, 2);
 		$anchor = '#' . $anchor;
 	}
 
+	// Handle really simple cases quickly
+	if ($_SID == '' && $session_id === false && empty($_EXTRA_URL) && !$params_is_array && !$anchor)
+	{
+		if ($params === false)
+		{
+			return $url;
+		}
+
+		$url_delim = (strpos($url, '?') === false) ? '?' : (($is_amp) ? '&amp;' : '&');
+		return $url . ($params !== false ? $url_delim. $params : '');
+	}
+
+	// Assign sid if session id is not specified
+	if ($session_id === false)
+	{
+		$session_id = $_SID;
+	}
+
+	$amp_delim = ($is_amp) ? '&amp;' : '&';
+	$url_delim = (strpos($url, '?') === false) ? '?' : $amp_delim;
+
+	// Appending custom url parameter?
+	$append_url = (!empty($_EXTRA_URL)) ? implode($amp_delim, $_EXTRA_URL) : '';
+
 	// Use the short variant if possible ;)
 	if ($params === false)
 	{
@@ -2190,12 +2216,17 @@
 
 /**
 * Meta refresh assignment
+* Adds META template variable with meta http tag.
+*
+* @param int $time Time in seconds for meta refresh tag
+* @param string $url URL to redirect to. The url will go through redirect() first before the template variable is assigned
+* @param bool $disable_cd_check If true, meta_refresh() will redirect to an external domain. If false, the redirect point to the boards url if it does not match the current domain. Default is false.
 */
-function meta_refresh($time, $url)
+function meta_refresh($time, $url, $disable_cd_check = false)
 {
 	global $template;
 
-	$url = redirect($url, true);
+	$url = redirect($url, true, $disable_cd_check);
 	$url = str_replace('&', '&amp;', $url);
 
 	// For XHTML compatibility we change back & to &amp;
diff -x .svn -aruN 3.0.3.src/includes/functions_admin.php 3.0.4.src/includes/functions_admin.php
--- 3.0.3.src/includes/functions_admin.php	2008-12-09 13:18:40.000000000 -0600
+++ 3.0.4.src/includes/functions_admin.php	2008-12-15 09:05:33.000000000 -0600
@@ -2,7 +2,7 @@
 /**
 *
 * @package acp
-* @version $Id: functions_admin.php 8908 2008-09-23 12:01:26Z toonarmy $
+* @version $Id: functions_admin.php 9065 2008-11-13 17:32:55Z toonarmy $
 * @copyright (c) 2005 phpBB Group
 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
 *
@@ -2400,7 +2400,7 @@
 			{
 				// Check if there are more occurrences of % than arguments, if there are we fill out the arguments array
 				// It doesn't matter if we add more arguments than placeholders
-				if (substr_count($log[$i]['action'], '%') - sizeof($log_data_ary))
+				if ((substr_count($log[$i]['action'], '%') - sizeof($log_data_ary)) > 0)
 				{
 					$log_data_ary = array_merge($log_data_ary, array_fill(0, substr_count($log[$i]['action'], '%') - sizeof($log_data_ary), ''));
 				}
diff -x .svn -aruN 3.0.3.src/includes/functions_content.php 3.0.4.src/includes/functions_content.php
--- 3.0.3.src/includes/functions_content.php	2008-12-09 13:18:40.000000000 -0600
+++ 3.0.4.src/includes/functions_content.php	2008-12-15 09:05:33.000000000 -0600
@@ -2,7 +2,7 @@
 /**
 *
 * @package phpBB3
-* @version $Id: functions_content.php 8970 2008-10-06 05:44:32Z acydburn $
+* @version $Id: functions_content.php 9184 2008-12-11 14:46:38Z acydburn $
 * @copyright (c) 2005 phpBB Group
 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
 *
@@ -501,7 +501,8 @@
 */
 function make_clickable_callback($type, $whitespace, $url, $relative_url, $class)
 {
-	$orig_url		= $url . $relative_url;
+	$orig_url		= $url;
+	$orig_relative	= $relative_url;
 	$append			= '';
 	$url			= htmlspecialchars_decode($url);
 	$relative_url	= htmlspecialchars_decode($relative_url);
@@ -566,6 +567,12 @@
 				$url = substr($url, 0, -1);
 			}
 		break;
+
+		// set last_char to empty here, so the variable can be used later to
+		// check whether a character was removed
+		default:
+			$last_char = '';
+		break;
 	}
 
 	$short_url = (strlen($url) > 55) ? substr($url, 0, 39) . ' ... ' . substr($url, -10) : $url;
@@ -583,7 +590,7 @@
 			// don't touch it and let MAGIC_URL_FULL take care of it.
 			if (!$relative_url)
 			{
-				return $whitespace . $orig_url . '/'; // slash is taken away by relative url pattern
+				return $whitespace . $orig_url . '/' . $orig_relative; // slash is taken away by relative url pattern
 			}
 		break;
 
@@ -1137,6 +1144,7 @@
 
 /**
 * Get username details for placing into templates.
+* This function caches all modes on first call, except for no_profile and anonymous user - determined by $user_id.
 *
 * @param string $mode Can be profile (for getting an url to the profile), username (for obtaining the username), colour (for obtaining the user colour), full (for obtaining a html string representing a coloured link to the users profile) or no_profile (the same as full but forcing no profile link)
 * @param int $user_id The users id
@@ -1146,12 +1154,30 @@
 * @param string $custom_profile_url optional parameter to specify a profile url. The user id get appended to this url as &amp;u={user_id}
 *
 * @return string A string consisting of what is wanted based on $mode.
+* @author BartVB, Acyd Burn
 */
 function get_username_string($mode, $user_id, $username, $username_colour = '', $guest_username = false, $custom_profile_url = false)
 {
+	static $_profile_cache;
+	static $_base_profile_url;
+
+	$cache_key = $user_id;
+
+	// If the get_username_string() function had been executed once with an (to us) unkown mode, all modes are pre-filled and we can just grab it.
+	if ($user_id && $user_id != ANONYMOUS && isset($_profile_cache[$cache_key][$mode]))
+	{
+		// If the mode is 'no_profile', we simply construct the TPL code due to calls to this mode being very very rare
+		if ($mode == 'no_profile')
+		{
+			$tpl = (!$_profile_cache[$cache_key]['colour']) ? '{USERNAME}' : '<span style="color: {USERNAME_COLOUR};" class="username-coloured">{USERNAME}</span>';
+			return str_replace(array('{USERNAME_COLOUR}', '{USERNAME}'), array($_profile_cache[$cache_key]['colour'], $_profile_cache[$cache_key]['username']), $tpl);
+		}
+
+		return $_profile_cache[$cache_key][$mode];
+	}
+
 	global $phpbb_root_path, $phpEx, $user, $auth;
 
-	$profile_url = '';
 	$username_colour = ($username_colour) ? '#' . $username_colour : '';
 
 	if ($guest_username === false)
@@ -1163,64 +1189,42 @@
 		$username = ($user_id && $user_id != ANONYMOUS) ? $username : ((!empty($guest_username)) ? $guest_username : $user->lang['GUEST']);
 	}
 
-	// Only show the link if not anonymous
-	if ($mode != 'no_profile' && $user_id && $user_id != ANONYMOUS)
+	// Build cache for all modes
+	$_profile_cache[$cache_key]['colour'] = $username_colour;
+	$_profile_cache[$cache_key]['username'] = $username;
+	$_profile_cache[$cache_key]['no_profile'] = true;
+
+	// Profile url - only show if not anonymous and permission to view profile if registered user
+	// For anonymous the link leads to a login page.
+	if ($user_id && $user_id != ANONYMOUS && ($user->data['user_id'] == ANONYMOUS || $auth->acl_get('u_viewprofile')))
 	{
-		// Do not show the link if the user is already logged in but do not have u_viewprofile permissions (relevant for bots mostly).
-		// For all others the link leads to a login page or the profile.
-		if ($user->data['user_id'] != ANONYMOUS && !$auth->acl_get('u_viewprofile'))
+		if (empty($_base_profile_url))
 		{
-			$profile_url = '';
-		}
-		else
-		{
-			$profile_url = ($custom_profile_url !== false) ? $custom_profile_url . '&amp;u=' . (int) $user_id : append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=viewprofile&amp;u=' . (int) $user_id);
+			$_base_profile_url = append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=viewprofile&amp;u={USER_ID}');
 		}
+
+		$profile_url = ($custom_profile_url !== false) ? $custom_profile_url . '&amp;u=' . (int) $user_id : str_replace('={USER_ID}', '=' . (int) $user_id, $_base_profile_url);
+		$tpl = (!$username_colour) ? '<a href="{PROFILE_URL}">{USERNAME}</a>' : '<a href="{PROFILE_URL}" style="color: {USERNAME_COLOUR};" class="username-coloured">{USERNAME}</a>';
+		$_profile_cache[$cache_key]['full'] = str_replace(array('{PROFILE_URL}', '{USERNAME_COLOUR}', '{USERNAME}'), array($profile_url, $username_colour, $username), $tpl);
 	}
 	else
 	{
+		$tpl = (!$username_colour) ? '{USERNAME}' : '<span style="color: {USERNAME_COLOUR};" class="username-coloured">{USERNAME}</span>';
+		$_profile_cache[$cache_key]['full'] = str_replace(array('{USERNAME_COLOUR}', '{USERNAME}'), array($username_colour, $username), $tpl);
 		$profile_url = '';
 	}
 
-	switch ($mode)
-	{
-		case 'profile':
-			return $profile_url;
-		break;
-
-		case 'username':
-			return $username;
-		break;
-
-		case 'colour':
-			return $username_colour;
-		break;
-
-		case 'no_profile':
-		case 'full':
-		default:
-
-			$tpl = '';
-			if (!$profile_url && !$username_colour)
-			{
-				$tpl = '{USERNAME}';
-			}
-			else if (!$profile_url && $username_colour)
-			{
-				$tpl = '<span style="color: {USERNAME_COLOUR};" class="username-coloured">{USERNAME}</span>';
-			}
-			else if ($profile_url && !$username_colour)
-			{
-				$tpl = '<a href="{PROFILE_URL}">{USERNAME}</a>';
-			}
-			else if ($profile_url && $username_colour)
-			{
-				$tpl = '<a href="{PROFILE_URL}" style="color: {USERNAME_COLOUR};" class="username-coloured">{USERNAME}</a>';
-			}
+	// Use the profile url from above
+	$_profile_cache[$cache_key]['profile'] = $profile_url;
 
-			return str_replace(array('{PROFILE_URL}', '{USERNAME_COLOUR}', '{USERNAME}'), array($profile_url, $username_colour, $username), $tpl);
-		break;
+	// If - by any chance - no_profile is called before any other mode, we need to do the calculation here
+	if ($mode == 'no_profile')
+	{
+		$tpl = (!$_profile_cache[$cache_key]['colour']) ? '{USERNAME}' : '<span style="color: {USERNAME_COLOUR};" class="username-coloured">{USERNAME}</span>';
+		return str_replace(array('{USERNAME_COLOUR}', '{USERNAME}'), array($_profile_cache[$cache_key]['colour'], $_profile_cache[$cache_key]['username']), $tpl);
 	}
+
+	return $_profile_cache[$cache_key][$mode];
 }
 
 /**
diff -x .svn -aruN 3.0.3.src/includes/functions_display.php 3.0.4.src/includes/functions_display.php
--- 3.0.3.src/includes/functions_display.php	2008-12-09 13:18:40.000000000 -0600
+++ 3.0.4.src/includes/functions_display.php	2008-12-15 09:05:33.000000000 -0600
@@ -2,7 +2,7 @@
 /**
 *
 * @package phpBB3
-* @version $Id: functions_display.php 8987 2008-10-09 14:17:02Z acydburn $
+* @version $Id: functions_display.php 9082 2008-11-22 20:26:09Z acydburn $
 * @copyright (c) 2005 phpBB Group
 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
 *
@@ -1150,6 +1150,7 @@
 * @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
 *
+* 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)
 {
@@ -1167,7 +1168,7 @@
 		$rank_img = (!empty($ranks['special'][$user_rank]['rank_image'])) ? '<img src="' . $phpbb_root_path . $config['ranks_path'] . '/' . $ranks['special'][$user_rank]['rank_image'] . '" alt="' . $ranks['special'][$user_rank]['rank_title'] . '" title="' . $ranks['special'][$user_rank]['rank_title'] . '" />' : '';
 		$rank_img_src = (!empty($ranks['special'][$user_rank]['rank_image'])) ? $phpbb_root_path . $config['ranks_path'] . '/' . $ranks['special'][$user_rank]['rank_image'] : '';
 	}
-	else
+	else if ($user_posts !== false)
 	{
 		if (!empty($ranks['normal']))
 		{
diff -x .svn -aruN 3.0.3.src/includes/functions_messenger.php 3.0.4.src/includes/functions_messenger.php
--- 3.0.3.src/includes/functions_messenger.php	2008-12-09 13:18:40.000000000 -0600
+++ 3.0.4.src/includes/functions_messenger.php	2008-12-15 09:05:33.000000000 -0600
@@ -2,7 +2,7 @@
 /**
 *
 * @package phpBB3
-* @version $Id: functions_messenger.php 8971 2008-10-06 05:50:16Z acydburn $
+* @version $Id: functions_messenger.php 9078 2008-11-22 19:55:00Z acydburn $
 * @copyright (c) 2005 phpBB Group
 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
 *
@@ -97,6 +97,12 @@
 	*/
 	function im($address, $realname = '')
 	{
+		// IM-Addresses could be empty
+		if (!$address)
+		{
+			return;
+		}
+
 		$pos = isset($this->addresses['im']) ? sizeof($this->addresses['im']) : 0;
 		$this->addresses['im'][$pos]['uid'] = trim($address);
 		$this->addresses['im'][$pos]['name'] = trim($realname);
@@ -443,6 +449,11 @@
 			return false;
 		}
 
+		if (empty($this->addresses['im']))
+		{
+			return false;
+		}
+
 		$use_queue = false;
 		if ($config['jab_package_size'] && $this->use_queue)
 		{
diff -x .svn -aruN 3.0.3.src/includes/functions_module.php 3.0.4.src/includes/functions_module.php
--- 3.0.3.src/includes/functions_module.php	2008-12-09 13:18:40.000000000 -0600
+++ 3.0.4.src/includes/functions_module.php	2008-12-15 09:05:33.000000000 -0600
@@ -2,7 +2,7 @@
 /**
 *
 * @package phpBB3
-* @version $Id: functions_module.php 8782 2008-08-23 17:20:55Z acydburn $
+* @version $Id: functions_module.php 9095 2008-11-23 12:42:34Z acydburn $
 * @copyright (c) 2005 phpBB Group
 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
 *
@@ -28,12 +28,48 @@
 	var $p_mode;
 	var $p_parent;
 
+	var $include_path = false;
 	var $active_module = false;
 	var $active_module_row_id = false;
 	var $acl_forum_id = false;
 	var $module_ary = array();
 
 	/**
+	* Constuctor
+	* Set module include path
+	*/
+	function p_master($include_path = false)
+	{
+		global $phpbb_root_path;
+
+		$this->include_path = ($include_path !== false) ? $include_path : $phpbb_root_path . 'includes/';
+
+		// Make sure the path ends with /
+		if (substr($this->include_path, -1) !== '/')
+		{
+			$this->include_path .= '/';
+		}
+	}
+
+	/**
+	* Set custom include path for modules
+	* Schema for inclusion is include_path . modulebase
+	*
+	* @param string $include_path include path to be used.
+	* @access public
+	*/
+	function set_custom_include_path($include_path)
+	{
+		$this->include_path = $include_path;
+
+		// Make sure the path ends with /
+		if (substr($this->include_path, -1) !== '/')
+		{
+			$this->include_path .= '/';
+		}
+	}
+
+	/**
 	* List modules
 	*
 	* This creates a list, stored in $this->module_ary of all available
@@ -395,7 +431,7 @@
 	{
 		global $phpbb_root_path, $phpbb_admin_path, $phpEx, $user;
 
-		$module_path = $phpbb_root_path . 'includes/' . $this->p_class;
+		$module_path = $this->include_path . $this->p_class;
 		$icat = request_var('icat', '');
 
 		if ($this->active_module === false)
diff -x .svn -aruN 3.0.3.src/includes/functions_posting.php 3.0.4.src/includes/functions_posting.php
--- 3.0.3.src/includes/functions_posting.php	2008-12-09 13:18:40.000000000 -0600
+++ 3.0.4.src/includes/functions_posting.php	2008-12-15 09:05:33.000000000 -0600
@@ -2,7 +2,7 @@
 /**
 *
 * @package phpBB3
-* @version $Id: functions_posting.php 9048 2008-11-04 15:54:43Z toonarmy $
+* @version $Id: functions_posting.php 9166 2008-12-03 16:40:53Z acydburn $
 * @copyright (c) 2005 phpBB Group
 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
 *
@@ -2137,10 +2137,20 @@
 			// this post is the latest post in the forum, better update
 			if ($row['forum_last_post_id'] == $data['post_id'])
 			{
-				if ($post_approved && $row['forum_last_post_subject'] !== $subject)
+				// If post approved and subject changed, or poster is anonymous, we need to update the forum_last* rows
+				if ($post_approved && ($row['forum_last_post_subject'] !== $subject || $data['poster_id'] == ANONYMOUS))
 				{
-					// the only data that can really be changed is the post's subject
-					$sql_data[FORUMS_TABLE]['stat'][] = 'forum_last_post_subject = \'' . $db->sql_escape($subject) . '\'';
+					// the post's subject changed
+					if ($row['forum_last_post_subject'] !== $subject)
+					{
+						$sql_data[FORUMS_TABLE]['stat'][] = 'forum_last_post_subject = \'' . $db->sql_escape($subject) . '\'';
+					}
+
+					// Update the user name if poster is anonymous... just in case an admin changed it
+					if ($data['poster_id'] == ANONYMOUS)
+					{
+						$sql_data[FORUMS_TABLE]['stat'][] = "forum_last_poster_name = '" . $db->sql_escape($username) . "'";
+					}
 				}
 				else if ($data['post_approved'] !== $post_approved)
 				{
@@ -2277,6 +2287,12 @@
 		{
 			// only the subject can be changed from edit
 			$sql_data[TOPICS_TABLE]['stat'][] = "topic_last_post_subject = '" . $db->sql_escape($subject) . "'";
+
+			// Maybe not only the subject, but also changing anonymous usernames. ;)
+			if ($data['poster_id'] == ANONYMOUS)
+			{
+				$sql_data[TOPICS_TABLE]['stat'][] = "topic_last_poster_name = '" . $db->sql_escape($username) . "'";
+			}
 		}
 	}
 	else if (!$data['post_approved'] && ($post_mode == 'edit_last_post' || $post_mode == 'edit_topic' || ($post_mode == 'edit_first_post' && !$data['topic_replies'])))
diff -x .svn -aruN 3.0.3.src/includes/functions_profile_fields.php 3.0.4.src/includes/functions_profile_fields.php
--- 3.0.3.src/includes/functions_profile_fields.php	2008-12-09 13:18:40.000000000 -0600
+++ 3.0.4.src/includes/functions_profile_fields.php	2008-12-15 09:05:33.000000000 -0600
@@ -2,7 +2,7 @@
 /**
 *
 * @package phpBB3
-* @version $Id: functions_profile_fields.php 8479 2008-03-29 00:22:48Z naderman $
+* @version $Id: functions_profile_fields.php 9127 2008-11-26 19:58:35Z acydburn $
 * @copyright (c) 2005 phpBB Group
 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
 *
@@ -40,14 +40,14 @@
 		{
 			case 'register':
 				// If the field is required we show it on the registration page and do not show hidden fields
-				$sql_where .= ' AND (f.field_show_on_reg = 1 OR f.field_required = 1) AND f.field_hide = 0';
+				$sql_where .= ' AND f.field_show_on_reg = 1 AND f.field_no_view = 0';
 			break;
 
 			case 'profile':
 				// Show hidden fields to moderators/admins
 				if (!$auth->acl_gets('a_', 'm_') && !$auth->acl_getf_global('m_'))
 				{
-					$sql_where .= ' AND f.field_hide = 0';
+					$sql_where .= ' AND f.field_show_profile = 1';
 				}
 			break;
 
@@ -106,7 +106,7 @@
 		{
 			case FIELD_DATE:
 				$field_validate = explode('-', $field_value);
-				
+
 				$day = (isset($field_validate[0])) ? (int) $field_validate[0] : 0;
 				$month = (isset($field_validate[1])) ? (int) $field_validate[1] : 0;
 				$year = (isset($field_validate[2])) ? (int) $field_validate[2] : 0;
@@ -154,14 +154,14 @@
 					return 'FIELD_TOO_LARGE';
 				}
 			break;
-		
+
 			case FIELD_DROPDOWN:
 				if ($field_value == $field_data['field_novalue'] && $field_data['field_required'])
 				{
 					return 'FIELD_REQUIRED';
 				}
 			break;
-			
+
 			case FIELD_STRING:
 			case FIELD_TEXT:
 				if (empty($field_value) && !$field_data['field_required'])
@@ -205,7 +205,7 @@
 		global $db, $user, $auth;
 
 		$this->profile_cache = array();
-		
+
 		// Display hidden/no_view fields for admin/moderator
 		$sql = 'SELECT l.*, f.*
 			FROM ' . PROFILE_LANG_TABLE . ' l, ' . PROFILE_FIELDS_TABLE . ' f
@@ -234,7 +234,7 @@
 		if ($preview)
 		{
 			$lang_options = (!is_array($this->vars['lang_options'])) ? explode("\n", $this->vars['lang_options']) : $this->vars['lang_options'];
-			
+
 			foreach ($lang_options as $num => $var)
 			{
 				$this->options_lang[$field_id][$lang_id][($num + 1)] = $var;
@@ -271,14 +271,14 @@
 		{
 			case 'register':
 				// If the field is required we show it on the registration page and do not show hidden fields
-				$sql_where .= ' AND (f.field_show_on_reg = 1 OR f.field_required = 1) AND f.field_hide = 0';
+				$sql_where .= ' AND f.field_show_on_reg = 1 AND f.field_no_view = 0';
 			break;
 
 			case 'profile':
 				// Show hidden fields to moderators/admins
 				if (!$auth->acl_gets('a_', 'm_') && !$auth->acl_getf_global('m_'))
 				{
-					$sql_where .= ' AND f.field_hide = 0';
+					$sql_where .= ' AND f.field_show_profile = 1';
 				}
 			break;
 
@@ -316,12 +316,12 @@
 					case 'FIELD_TOO_SMALL':
 						$error = sprintf($user->lang[$cp_result], $row['lang_name'], $row['field_minlen']);
 					break;
-					
+
 					case 'FIELD_TOO_LONG':
 					case 'FIELD_TOO_LARGE':
 						$error = sprintf($user->lang[$cp_result], $row['lang_name'], $row['field_maxlen']);
 					break;
-					
+
 					case 'FIELD_INVALID_CHARS':
 						switch ($row['field_validation'])
 						{
@@ -339,7 +339,7 @@
 						}
 					break;
 				}
-				
+
 				if ($error != '')
 				{
 					$cp_error[] = $error;
@@ -434,7 +434,7 @@
 					'S_PROFILE_' . strtoupper($ident)		=> true
 				);
 			}
-		
+
 			return $tpl_fields;
 		}
 		else
@@ -589,7 +589,7 @@
 		else
 		{
 			$value = (isset($_REQUEST[$profile_row['field_ident']])) ? request_var($profile_row['field_ident'], $default_value, true) : ((!isset($user->profile_fields[$user_ident]) || $preview) ? $default_value : $user->profile_fields[$user_ident]);
-			
+
 			if (gettype($value) == 'string')
 			{
 				$value = utf8_normalize_nfc($value);
@@ -672,7 +672,7 @@
 			$profile_row['s_year_options'] .= '<option value="' . $i . '"' . (($i == $year) ? ' selected="selected"' : '') . ">$i</option>";
 		}
 		unset($now);
-		
+
 		$profile_row['field_value'] = 0;
 		$template->assign_block_vars($this->profile_types[$profile_row['field_type']], array_change_key_case($profile_row, CASE_UPPER));
 	}
@@ -826,7 +826,7 @@
 			$cp_data['pf_' . $row['field_ident']] = (in_array($row['field_type'], array(FIELD_TEXT, FIELD_STRING))) ? $row['lang_default_value'] : $row['field_default_value'];
 		}
 		$db->sql_freeresult($result);
-		
+
 		return $cp_data;
 	}
 
@@ -838,9 +838,9 @@
 	{
 		global $phpbb_root_path, $phpEx;
 		global $config;
-		
+
 		$var_name = 'pf_' . $profile_row['field_ident'];
-		
+
 		switch ($profile_row['field_type'])
 		{
 			case FIELD_DATE:
@@ -860,7 +860,7 @@
 					$month = request_var($var_name . '_month', 0);
 					$year = request_var($var_name . '_year', 0);
 				}
-				
+
 				$var = sprintf('%2d-%2d-%4d', $day, $month, $year);
 			break;
 
@@ -931,7 +931,7 @@
 
 		return $validate_options;
 	}
-	
+
 	/**
 	* Get string options for second step in ACP
 	*/
@@ -1086,4 +1086,4 @@
 	}
 }
 
-?>
\ No newline at end of file
+?>
diff -x .svn -aruN 3.0.3.src/includes/mcp/mcp_queue.php 3.0.4.src/includes/mcp/mcp_queue.php
--- 3.0.3.src/includes/mcp/mcp_queue.php	2008-12-09 13:18:40.000000000 -0600
+++ 3.0.4.src/includes/mcp/mcp_queue.php	2008-12-15 09:05:32.000000000 -0600
@@ -2,7 +2,7 @@
 /**
 *
 * @package mcp
-* @version $Id: mcp_queue.php 9015 2008-10-14 18:29:50Z toonarmy $
+* @version $Id: mcp_queue.php 9133 2008-11-30 12:03:43Z acydburn $
 * @copyright (c) 2005 phpBB Group
 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
 *
@@ -505,8 +505,12 @@
 				$forum_id_list[$post_data['forum_id']] = 1;
 			}
 
-			// User post update (we do not care about topic or post, since user posts are strictly connected to posts
-			$user_posts_sql[$post_data['poster_id']] = (empty($user_posts_sql[$post_data['poster_id']])) ? 1 : $user_posts_sql[$post_data['poster_id']] + 1;
+			// User post update (we do not care about topic or post, since user posts are strictly connected to posts)
+			// But we care about forums where post counts get not increased. ;)
+			if ($post_data['post_postcount'])
+			{
+				$user_posts_sql[$post_data['poster_id']] = (empty($user_posts_sql[$post_data['poster_id']])) ? 1 : $user_posts_sql[$post_data['poster_id']] + 1;
+			}
 
 			// Topic or Post. ;)
 			if ($post_data['topic_first_post_id'] == $post_id)
diff -x .svn -aruN 3.0.3.src/includes/search/fulltext_native.php 3.0.4.src/includes/search/fulltext_native.php
--- 3.0.3.src/includes/search/fulltext_native.php	2008-12-09 13:18:40.000000000 -0600
+++ 3.0.4.src/includes/search/fulltext_native.php	2008-12-15 09:05:32.000000000 -0600
@@ -2,7 +2,7 @@
 /**
 *
 * @package search
-* @version $Id: fulltext_native.php 8879 2008-09-18 14:32:15Z acydburn $
+* @version $Id: fulltext_native.php 9173 2008-12-04 17:01:39Z naderman $
 * @copyright (c) 2005 phpBB Group
 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
 *
@@ -455,6 +455,7 @@
 		);
 
 		$title_match = '';
+		$left_join_topics = false;
 		$group_by = true;
 		// Build some display specific sql strings
 		switch ($fields)
@@ -464,7 +465,7 @@
 				$group_by = false;
 			// no break
 			case 'firstpost':
-				$sql_array['FROM'][TOPICS_TABLE] = 't';
+				$left_join_topics = true;
 				$sql_where[] = 'p.post_id = t.topic_first_post_id';
 			break;
 
@@ -476,11 +477,7 @@
 
 		if ($type == 'topics')
 		{
-			if (!isset($sql_array['FROM'][TOPICS_TABLE]))
-			{
-				$sql_array['FROM'][TOPICS_TABLE] = 't';
-				$sql_where[] = 'p.topic_id = t.topic_id';
-			}
+			$left_join_topics = true;
 			$group_by = true;
 		}
 
@@ -688,11 +685,7 @@
 			break;
 
 			case 't':
-				if (!isset($sql_array['FROM'][TOPICS_TABLE]))
-				{
-					$sql_array['FROM'][TOPICS_TABLE] = 't';
-					$sql_where[] = 'p.topic_id = t.topic_id';
-				}
+				$left_join_topics = true;
 			break;
 
 			case 'f':
@@ -700,6 +693,14 @@
 				$sql_where[] = 'f.forum_id = p.forum_id';
 			break;
 		}
+		
+		if ($left_join_topics)
+		{
+			$sql_array['LEFT_JOIN'][$left_join_topics] = array(
+				'FROM'	=> array(TOPICS_TABLE => 't'),
+				'ON'	=> 'p.topic_id = t.topic_id'
+			);
+		}
 
 		$sql_array['WHERE'] = implode(' AND ', $sql_where);
 		$sql_array['GROUP_BY'] = ($group_by) ? (($type == 'posts') ? 'p.post_id' : 'p.topic_id') . ', ' . $sort_by_sql[$sort_key] : '';
@@ -1674,7 +1675,7 @@
 		</dl>
 		<dl>
 			<dt><label for="fulltext_native_common_thres">' . $user->lang['COMMON_WORD_THRESHOLD'] . ':</label><br /><span>' . $user->lang['COMMON_WORD_THRESHOLD_EXPLAIN'] . '</span></dt>
-			<dd><input id="fulltext_native_common_thres" type="text" size="3" maxlength="3" name="config[fulltext_native_common_thres]" value="' . (int) $config['fulltext_native_common_thres'] . '" /> %</dd>
+			<dd><input id="fulltext_native_common_thres" type="text" size="3" maxlength="3" name="config[fulltext_native_common_thres]" value="' . (double) $config['fulltext_native_common_thres'] . '" /> %</dd>
 		</dl>
 		';
 
diff -x .svn -aruN 3.0.3.src/includes/session.php 3.0.4.src/includes/session.php
--- 3.0.3.src/includes/session.php	2008-12-09 13:18:40.000000000 -0600
+++ 3.0.4.src/includes/session.php	2008-12-15 09:05:33.000000000 -0600
@@ -2,7 +2,7 @@
 /**
 *
 * @package phpBB3
-* @version $Id: session.php 9037 2008-10-26 10:52:43Z acydburn $
+* @version $Id: session.php 9170 2008-12-04 12:56:12Z toonarmy $
 * @copyright (c) 2005 phpBB Group
 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
 *
@@ -1851,22 +1851,36 @@
 		$args = func_get_args();
 		$key = $args[0];
 
+		if (is_array($key))
+		{
+			$lang = &$this->lang[array_shift($key)];
+
+			foreach ($key as $_key)
+			{
+				$lang = &$lang[$_key];
+			}
+		}
+		else
+		{
+			$lang = &$this->lang[$key];
+		}
+
 		// Return if language string does not exist
-		if (!isset($this->lang[$key]) || (!is_string($this->lang[$key]) && !is_array($this->lang[$key])))
+		if (!isset($lang) || (!is_string($lang) && !is_array($lang)))
 		{
 			return $key;
 		}
 
 		// If the language entry is a string, we simply mimic sprintf() behaviour
-		if (is_string($this->lang[$key]))
+		if (is_string($lang))
 		{
 			if (sizeof($args) == 1)
 			{
-				return $this->lang[$key];
+				return $lang;
 			}
 
 			// Replace key with language entry and simply pass along...
-			$args[0] = $this->lang[$key];
+			$args[0] = $lang;
 			return call_user_func_array('sprintf', $args);
 		}
 
@@ -1878,7 +1892,7 @@
 		{
 			if (is_int($args[$i]))
 			{
-				$numbers = array_keys($this->lang[$key]);
+				$numbers = array_keys($lang);
 
 				foreach ($numbers as $num)
 				{
@@ -1895,12 +1909,12 @@
 		// Ok, let's check if the key was found, else use the last entry (because it is mostly the plural form)
 		if ($key_found === false)
 		{
-			$numbers = array_keys($this->lang[$key]);
+			$numbers = array_keys($lang);
 			$key_found = end($numbers);
 		}
 
 		// Use the language string we determined and pass it to sprintf()
-		$args[0] = $this->lang[$key][$key_found];
+		$args[0] = $lang[$key_found];
 		return call_user_func_array('sprintf', $args);
 	}
 
@@ -2001,50 +2015,77 @@
 
 	/**
 	* Format user date
+	*
+	* @param int $gmepoch unix timestamp
+	* @param string $format date format in date() notation. | used to indicate relative dates, for example |d m Y|, h:i is translated to Today, h:i.
+	* @param bool $forcedate force non-relative date format.
+	*
+	* @return mixed translated date
 	*/
 	function format_date($gmepoch, $format = false, $forcedate = false)
 	{
 		static $midnight;
+		static $date_cache;
 
-		$lang_dates = $this->lang['datetime'];
 		$format = (!$format) ? $this->date_format : $format;
+		$now = time();
+		$delta = $now - $gmepoch;
 
-		// Short representation of month in format
-		if ((strpos($format, '\M') === false && strpos($format, 'M') !== false) || (strpos($format, '\r') === false && strpos($format, 'r') !== false))
+		if (!isset($date_cache[$format]))
 		{
-			$lang_dates['May'] = $lang_dates['May_short'];
-		}
-
-		unset($lang_dates['May_short']);
+			// Is the user requesting a friendly date format (i.e. 'Today 12:42')?
+			$date_cache[$format] = array(
+				'is_short'		=> strpos($format, '|'),
+				'zone_offset'	=> $this->timezone + $this->dst,
+				'format_short'	=> substr($format, 0, strpos($format, '|')) . '||' . substr(strrchr($format, '|'), 1),
+				'format_long'	=> str_replace('|', '', $format),
+				'lang'			=> $this->lang['datetime'],
+			);
 
-		if (!$midnight)
-		{
-			list($d, $m, $y) = explode(' ', gmdate('j n Y', time() + $this->timezone + $this->dst));
-			$midnight = gmmktime(0, 0, 0, $m, $d, $y) - $this->timezone - $this->dst;
+			// Short representation of month in format? Some languages use different terms for the long and short format of May
+			if ((strpos($format, '\M') === false && strpos($format, 'M') !== false) || (strpos($format, '\r') === false && strpos($format, 'r') !== false))
+			{
+				$date_cache[$format]['lang']['May'] = $this->lang['datetime']['May_short'];
+			}
 		}
 
-		if (strpos($format, '|') === false || ($gmepoch < $midnight - 86400 && !$forcedate) || ($gmepoch > $midnight + 172800 && !$forcedate))
+		// Show date <= 1 hour ago as 'xx min ago'
+		// A small tolerence is given for times in the future and times in the future but in the same minute are displayed as '< than a minute ago'
+		if ($delta <= 3600 && ($delta >= -5 || (($now / 60) % 60) == (($gmepoch / 60) % 60)) && $date_cache[$format]['is_short'] !== false && !$forcedate && isset($this->lang['datetime']['AGO']))
 		{
-			return strtr(@gmdate(str_replace('|', '', $format), $gmepoch + $this->timezone + $this->dst), $lang_dates);
+			return $this->lang(array('datetime', 'AGO'), max(0, (int) floor($delta / 60)));
 		}
 
-		if ($gmepoch > $midnight + 86400 && !$forcedate)
-		{
-			$format = substr($format, 0, strpos($format, '|')) . '||' . substr(strrchr($format, '|'), 1);
-			return str_replace('||', $this->lang['datetime']['TOMORROW'], strtr(@gmdate($format, $gmepoch + $this->timezone + $this->dst), $lang_dates));
-		}
-		else if ($gmepoch > $midnight && !$forcedate)
+		if (!$midnight)
 		{
-			$format = substr($format, 0, strpos($format, '|')) . '||' . substr(strrchr($format, '|'), 1);
-			return str_replace('||', $this->lang['datetime']['TODAY'], strtr(@gmdate($format, $gmepoch + $this->timezone + $this->dst), $lang_dates));
+			list($d, $m, $y) = explode(' ', gmdate('j n Y', time() + $date_cache[$format]['zone_offset']));
+			$midnight = gmmktime(0, 0, 0, $m, $d, $y) - $date_cache[$format]['zone_offset'];
 		}
-		else if ($gmepoch > $midnight - 86400 && !$forcedate)
+
+		if ($date_cache[$format]['is_short'] !== false && !$forcedate)
 		{
-			$format = substr($format, 0, strpos($format, '|')) . '||' . substr(strrchr($format, '|'), 1);
-			return str_replace('||', $this->lang['datetime']['YESTERDAY'], strtr(@gmdate($format, $gmepoch + $this->timezone + $this->dst), $lang_dates));
+			$day = false;
+
+			if ($gmepoch > $midnight + 86400)
+			{
+				$day = 'TOMORROW';
+			}
+			else if ($gmepoch > $midnight)
+			{
+				$day = 'TODAY';
+			}
+			else if ($gmepoch > $midnight - 86400)
+			{
+				$day = 'YESTERDAY';
+			}
+
+			if ($day !== false)
+			{
+				return str_replace('||', $this->lang['datetime'][$day], strtr(@gmdate($date_cache[$format]['format_short'], $gmepoch + $date_cache[$format]['zone_offset']), $date_cache[$format]['lang']));
+			}
 		}
 
-		return strtr(@gmdate(str_replace('|', '', $format), $gmepoch + $this->timezone + $this->dst), $lang_dates);
+		return strtr(@gmdate($date_cache[$format]['format_long'], $gmepoch + $date_cache[$format]['zone_offset']), $date_cache[$format]['lang']);
 	}
 
 	/**
diff -x .svn -aruN 3.0.3.src/includes/ucp/ucp_activate.php 3.0.4.src/includes/ucp/ucp_activate.php
--- 3.0.3.src/includes/ucp/ucp_activate.php	2008-12-09 13:18:40.000000000 -0600
+++ 3.0.4.src/includes/ucp/ucp_activate.php	2008-12-15 09:05:32.000000000 -0600
@@ -2,7 +2,7 @@
 /**
 *
 * @package ucp
-* @version $Id: ucp_activate.php 8881 2008-09-18 14:50:11Z acydburn $
+* @version $Id: ucp_activate.php 9067 2008-11-21 13:21:53Z Kellanved $
 * @copyright (c) 2005 phpBB Group
 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
 *
@@ -51,7 +51,7 @@
 			trigger_error('ALREADY_ACTIVATED');
 		}
 
-		if ($user_row['user_actkey'] != $key)
+		if (($user_row['user_inactive_reason'] ==  INACTIVE_MANUAL) || $user_row['user_actkey'] != $key)
 		{
 			trigger_error('WRONG_ACTIVATION');
 		}
diff -x .svn -aruN 3.0.3.src/includes/ucp/ucp_groups.php 3.0.4.src/includes/ucp/ucp_groups.php
--- 3.0.3.src/includes/ucp/ucp_groups.php	2008-12-09 13:18:40.000000000 -0600
+++ 3.0.4.src/includes/ucp/ucp_groups.php	2008-12-15 09:05:32.000000000 -0600
@@ -2,7 +2,7 @@
 /**
 *
 * @package ucp
-* @version $Id: ucp_groups.php 8911 2008-09-23 13:03:33Z acydburn $
+* @version $Id: ucp_groups.php 9067 2008-11-21 13:21:53Z Kellanved $
 * @copyright (c) 2005 phpBB Group
 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
 *
@@ -414,6 +414,9 @@
 				$this->page_title = 'UCP_USERGROUPS_MANAGE';
 				$action		= (isset($_POST['addusers'])) ? 'addusers' : request_var('action', '');
 				$group_id	= request_var('g', 0);
+				
+				include($phpbb_root_path . 'includes/functions_display.' . $phpEx);
+
 				add_form_key('ucp_groups');
 
 				if ($group_id)
@@ -438,6 +441,7 @@
 					
 					$group_name = $group_row['group_name'];
 					$group_type = $group_row['group_type'];
+					
 					$avatar_img = (!empty($group_row['group_avatar'])) ? get_user_avatar($group_row['group_avatar'], $group_row['group_avatar_type'], $group_row['group_avatar_width'], $group_row['group_avatar_height'], 'GROUP_AVATAR') : '<img src="' . $phpbb_root_path . 'adm/images/no_avatar.gif" alt="" />';
 
 					$template->assign_vars(array(
@@ -458,8 +462,6 @@
 				{
 					case 'edit':
 
-						include($phpbb_root_path . 'includes/functions_display.' . $phpEx);
-
 						if (!$group_id)
 						{
 							trigger_error($user->lang['NO_GROUP'] . $return_page);
diff -x .svn -aruN 3.0.3.src/includes/ucp/ucp_main.php 3.0.4.src/includes/ucp/ucp_main.php
--- 3.0.3.src/includes/ucp/ucp_main.php	2008-12-09 13:18:40.000000000 -0600
+++ 3.0.4.src/includes/ucp/ucp_main.php	2008-12-15 09:05:32.000000000 -0600
@@ -2,7 +2,7 @@
 /**
 *
 * @package ucp
-* @version $Id: ucp_main.php 8997 2008-10-11 14:31:22Z toonarmy $
+* @version $Id: ucp_main.php 9136 2008-11-30 14:36:59Z acydburn $
 * @copyright (c) 2005 phpBB Group
 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
 *
@@ -25,7 +25,7 @@
 {
 	var $p_master;
 	var $u_action;
-	
+
 	function ucp_main(&$p_master)
 	{
 		$this->p_master = &$p_master;
@@ -70,7 +70,7 @@
 				$sql = 'SELECT forum_id
 					FROM ' . FORUMS_TABLE . '
 					WHERE forum_type = ' . FORUM_POST;
-	
+
 				if (sizeof($forum_ary))
 				{
 					$sql .= ' AND ' . $db->sql_in_set('forum_id', $forum_ary, true);
@@ -258,7 +258,7 @@
 				{
 					$forbidden_forums = $auth->acl_getf('!f_read', true);
 					$forbidden_forums = array_unique(array_keys($forbidden_forums));
-					
+
 					$sql_array = array(
 						'SELECT'	=> 'f.*',
 
@@ -339,6 +339,7 @@
 							'FORUM_IMAGE'			=> ($row['forum_image']) ? '<img src="' . $phpbb_root_path . $row['forum_image'] . '" alt="' . $user->lang[$folder_alt] . '" />' : '',
 							'FORUM_IMAGE_SRC'		=> ($row['forum_image']) ? $phpbb_root_path . $row['forum_image'] : '',
 							'FORUM_NAME'			=> $row['forum_name'],
+							'FORUM_DESC'			=> generate_text_for_display($row['forum_desc'], $row['forum_desc_uid'], $row['forum_desc_bitfield'], $row['forum_desc_options']),
 							'LAST_POST_SUBJECT'		=> $row['forum_last_post_subject'],
 							'LAST_POST_TIME'		=> $last_post_time,
 
@@ -420,7 +421,7 @@
 				}
 				$forbidden_forums = $auth->acl_getf('!f_read', true);
 				$forbidden_forums = array_unique(array_keys($forbidden_forums));
-				
+
 				$this->assign_topiclist('bookmarks', $forbidden_forums);
 
 			break;
@@ -676,7 +677,7 @@
 				'WHERE'		=> 'tw.user_id = ' . $user->data['user_id'] . '
 					AND t.topic_id = tw.topic_id
 					AND ' . $db->sql_in_set('t.forum_id', $forbidden_forum_ary, true, true),
-					
+
 
 				'ORDER_BY'	=> 't.topic_last_post_time DESC'
 			);
diff -x .svn -aruN 3.0.3.src/includes/ucp/ucp_pm_compose.php 3.0.4.src/includes/ucp/ucp_pm_compose.php
--- 3.0.3.src/includes/ucp/ucp_pm_compose.php	2008-12-09 13:18:40.000000000 -0600
+++ 3.0.4.src/includes/ucp/ucp_pm_compose.php	2008-12-15 09:05:32.000000000 -0600
@@ -2,7 +2,7 @@
 /**
 *
 * @package ucp
-* @version $Id: ucp_pm_compose.php 9045 2008-11-02 15:28:00Z acydburn $
+* @version $Id: ucp_pm_compose.php 9168 2008-12-03 16:48:06Z acydburn $
 * @copyright (c) 2005 phpBB Group
 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
 *
@@ -259,6 +259,25 @@
 			{
 				trigger_error('NOT_AUTHORISED');
 			}
+
+			// Passworded forum?
+			if ($post['forum_id'])
+			{
+				$sql = 'SELECT forum_password
+					FROM ' . FORUMS_TABLE . '
+					WHERE forum_id = ' . (int) $post['forum_id'];
+				$result = $db->sql_query($sql);
+				$forum_password = (string) $db->sql_fetchfield('forum_password');
+				$db->sql_freeresult($result);
+
+				if ($forum_password)
+				{
+					login_forum_box(array(
+						'forum_id'			=> $post['forum_id'],
+						'forum_password'	=> $forum_password,
+					));
+				}
+			}
 		}
 
 		$msg_id			= (int) $post['msg_id'];
@@ -424,7 +443,9 @@
 	{
 		// We try to include every previously listed member from the TO Header
 		$list = rebuild_header(array('to' => $post['to_address']));
-		$list = $list['u'];
+
+		// Can be an empty array too ;)
+		$list = (!empty($list['u'])) ? $list['u'] : array();
 		$list[$post['author_id']] = 'to';
 
 		if (isset($list[$user->data['user_id']]))
diff -x .svn -aruN 3.0.3.src/includes/ucp/ucp_pm_viewmessage.php 3.0.4.src/includes/ucp/ucp_pm_viewmessage.php
--- 3.0.3.src/includes/ucp/ucp_pm_viewmessage.php	2008-12-09 13:18:40.000000000 -0600
+++ 3.0.4.src/includes/ucp/ucp_pm_viewmessage.php	2008-12-15 09:05:32.000000000 -0600
@@ -2,7 +2,7 @@
 /**
 *
 * @package ucp
-* @version $Id: ucp_pm_viewmessage.php 8479 2008-03-29 00:22:48Z naderman $
+* @version $Id: ucp_pm_viewmessage.php 9174 2008-12-04 19:58:42Z toonarmy $
 * @copyright (c) 2005 phpBB Group
 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
 *
@@ -83,7 +83,7 @@
 	if ($message_row['message_edit_count'] && $config['display_last_edited'])
 	{
 		$l_edit_time_total = ($message_row['message_edit_count'] == 1) ? $user->lang['EDITED_TIME_TOTAL'] : $user->lang['EDITED_TIMES_TOTAL'];
-		$l_edited_by = '<br /><br />' . sprintf($l_edit_time_total, (!$message_row['message_edit_user']) ? $message_row['username'] : $message_row['message_edit_user'], $user->format_date($message_row['message_edit_time']), $message_row['message_edit_count']);
+		$l_edited_by = '<br /><br />' . sprintf($l_edit_time_total, (!$message_row['message_edit_user']) ? $message_row['username'] : $message_row['message_edit_user'], $user->format_date($message_row['message_edit_time'], false, true), $message_row['message_edit_count']);
 	}
 	else
 	{
@@ -221,7 +221,7 @@
 		'S_SPECIAL_FOLDER'	=> in_array($folder_id, array(PRIVMSGS_NO_BOX, PRIVMSGS_OUTBOX)),
 
 		'U_PRINT_PM'		=> ($config['print_pm'] && $auth->acl_get('u_pm_printpm')) ? "$url&amp;f=$folder_id&amp;p=" . $message_row['msg_id'] . "&amp;view=print" : '',
-		'U_FORWARD_PM'		=> ($config['forward_pm'] && $auth->acl_get('u_pm_forward')) ? "$url&amp;mode=compose&amp;action=forward&amp;f=$folder_id&amp;p=" . $message_row['msg_id'] : '')
+		'U_FORWARD_PM'		=> ($config['forward_pm'] && $auth->acl_get('u_sendpm') && $auth->acl_get('u_pm_forward')) ? "$url&amp;mode=compose&amp;action=forward&amp;f=$folder_id&amp;p=" . $message_row['msg_id'] : '')
 	);
 
 	// Display not already displayed Attachments for this post, we already parsed them. ;)
diff -x .svn -aruN 3.0.3.src/language/en/acp/profile.php 3.0.4.src/language/en/acp/profile.php
--- 3.0.3.src/language/en/acp/profile.php	2008-12-09 13:18:39.000000000 -0600
+++ 3.0.4.src/language/en/acp/profile.php	2008-12-15 09:05:32.000000000 -0600
@@ -4,7 +4,7 @@
 * acp_profile [English]
 *
 * @package language
-* @version $Id: profile.php 8479 2008-03-29 00:22:48Z naderman $
+* @version $Id: profile.php 9128 2008-11-26 20:10:29Z acydburn $
 * @copyright (c) 2005 phpBB Group
 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
 *
@@ -64,10 +64,10 @@
 	'DELETE_PROFILE_FIELD_CONFIRM'	=> 'Are you sure you want to delete this profile field?',
 	'DISPLAY_AT_PROFILE'			=> 'Display in user control panel',
 	'DISPLAY_AT_PROFILE_EXPLAIN'	=> 'The user is able to change this profile field within the user control panel.',
-	'DISPLAY_AT_REGISTER'			=> 'Display at registration screen',
-	'DISPLAY_AT_REGISTER_EXPLAIN'	=> 'If this option is enabled, the field will be displayed on registration and able to be changed within the user control panel.',
+	'DISPLAY_AT_REGISTER'			=> 'Display on registration screen',
+	'DISPLAY_AT_REGISTER_EXPLAIN'	=> 'If this option is enabled, the field will be displayed on registration.',
 	'DISPLAY_PROFILE_FIELD'			=> 'Display profile field',
-	'DISPLAY_PROFILE_FIELD_EXPLAIN'	=> 'The profile field will be shown in all places allowed within the load settings. Setting this to “no” will hide the field from topic pages, profiles and the memberlist.',
+	'DISPLAY_PROFILE_FIELD_EXPLAIN'	=> 'The profile field will be shown in all locations allowed within the load settings. Setting this to “no” will hide the field from topic pages, profiles and the memberlist.',
 	'DROPDOWN_ENTRIES_EXPLAIN'		=> 'Enter your options now, every option in one line.',
 
 	'EDIT_DROPDOWN_LANG_EXPLAIN'	=> 'Please note that you are able to change your options text and also able to add new options to the end. It is not advised to add new options between existing options - this could result in wrong options assigned to your users. This can also happen if you remove options in-between. Removing options from the end result in users having assigned this item now reverting back to the default one.',
@@ -95,7 +95,7 @@
 	'FIRST_OPTION'				=> 'First option',
 
 	'HIDE_PROFILE_FIELD'			=> 'Hide profile field',
-	'HIDE_PROFILE_FIELD_EXPLAIN'	=> 'Only administrators and moderators are able to see/fill out this profile field. If this option is enabled, the profile field will be only displayed in users’ profiles.',
+	'HIDE_PROFILE_FIELD_EXPLAIN'	=> 'Hide the profile field from all other users except the user, administrators and moderators who are still able to see this field. If the Display in user control panel option is disabled, the user will not be able to see or change this field and the field can only be changed by administrators.',
 
 	'INVALID_CHARS_FIELD_IDENT'	=> 'Field identification can only contain lowercase a-z and _',
 	'INVALID_FIELD_IDENT_LEN'	=> 'Field identification can only be 17 characters long',
@@ -124,7 +124,7 @@
 	'RADIO_BUTTONS'				=> 'Radio buttons',
 	'REMOVED_PROFILE_FIELD'		=> 'Successfully removed profile field.',
 	'REQUIRED_FIELD'			=> 'Required field',
-	'REQUIRED_FIELD_EXPLAIN'	=> 'Force profile field to be filled out or specified by user. This will display the profile field at registration and within the user control panel.',
+	'REQUIRED_FIELD_EXPLAIN'	=> 'Force profile field to be filled out or specified by user or administrator. If display at registration screen option is disabled, the field will only be required when the user edits their profile.',
 	'ROWS'						=> 'Rows',
 
 	'SAVE'							=> 'Save',
@@ -148,7 +148,7 @@
 
 	'USER_FIELD_NAME'	=> 'Field name/title presented to the user',
 
-	'VISIBILITY_OPTION'				=> 'Visibility option',
+	'VISIBILITY_OPTION'				=> 'Visibility options',
 ));
 
 ?>
\ No newline at end of file
diff -x .svn -aruN 3.0.3.src/language/en/acp/search.php 3.0.4.src/language/en/acp/search.php
--- 3.0.3.src/language/en/acp/search.php	2008-12-09 13:18:39.000000000 -0600
+++ 3.0.4.src/language/en/acp/search.php	2008-12-15 09:05:32.000000000 -0600
@@ -4,7 +4,7 @@
 * acp_search [English]
 *
 * @package language
-* @version $Id: search.php 8479 2008-03-29 00:22:48Z naderman $
+* @version $Id: search.php 9126 2008-11-26 19:17:52Z naderman $
 * @copyright (c) 2005 phpBB Group
 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
 *
@@ -40,7 +40,7 @@
 	'ACP_SEARCH_SETTINGS_EXPLAIN'			=> 'Here you can define what search backend will be used for indexing posts and performing searches. You can set various options that can influence how much processing these actions require. Some of these settings are the same for all search engine backends.',
 
 	'COMMON_WORD_THRESHOLD'					=> 'Common word threshold',
-	'COMMON_WORD_THRESHOLD_EXPLAIN'			=> 'Words which are contained in a greater percentage of all posts will be regarded as common. Common words are ignored in search queries. Set to zero to disable. Only takes effect if there are more than 100 posts.',
+	'COMMON_WORD_THRESHOLD_EXPLAIN'			=> 'Words which are contained in a greater percentage of all posts will be regarded as common. Common words are ignored in search queries. Set to zero to disable. Only takes effect if there are more than 100 posts. If you want words that are currently regarded as common to be reconsidered you have to recreate the index.',
 	'CONFIRM_SEARCH_BACKEND'				=> 'Are you sure you wish to switch to a different search backend? After changing the search backend you will have to create an index for the new search backend. If you don’t plan on switching back to the old search backend you can also delete the old backend’s index in order to free system resources.',
 	'CONTINUE_DELETING_INDEX'				=> 'Continue previous index removal process',
 	'CONTINUE_DELETING_INDEX_EXPLAIN'		=> 'An index removal process has been started. In order to access the search index page you will have to complete it or cancel it.',
diff -x .svn -aruN 3.0.3.src/language/en/common.php 3.0.4.src/language/en/common.php
--- 3.0.3.src/language/en/common.php	2008-12-09 13:18:39.000000000 -0600
+++ 3.0.4.src/language/en/common.php	2008-12-15 09:05:32.000000000 -0600
@@ -4,7 +4,7 @@
 * common [English]
 *
 * @package language
-* @version $Id: common.php 9046 2008-11-02 16:19:11Z acydburn $
+* @version $Id: common.php 9162 2008-12-03 11:18:31Z acydburn $
 * @copyright (c) 2005 phpBB Group
 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
 *
@@ -697,6 +697,12 @@
 		'TODAY'		=> 'Today',
 		'TOMORROW'	=> 'Tomorrow',
 		'YESTERDAY'	=> 'Yesterday',
+		'AGO'		=> array(
+			0		=> 'less than a minute ago',
+			1		=> '%d minute ago',
+			2		=> '%d minutes ago',
+			60		=> '1 hour ago',
+		),
 
 		'Sunday'	=> 'Sunday',
 		'Monday'	=> 'Monday',
diff -x .svn -aruN 3.0.3.src/language/en/install.php 3.0.4.src/language/en/install.php
--- 3.0.3.src/language/en/install.php	2008-12-09 13:18:39.000000000 -0600
+++ 3.0.4.src/language/en/install.php	2008-12-15 09:05:32.000000000 -0600
@@ -4,7 +4,7 @@
 * install [English]
 *
 * @package language
-* @version $Id: install.php 9035 2008-10-25 14:12:13Z acydburn $
+* @version $Id: install.php 9177 2008-12-05 11:36:51Z acydburn $
 * @copyright (c) 2005 phpBB Group
 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
 *
@@ -379,7 +379,8 @@
 	'COLLECTED_INFORMATION_EXPLAIN'	=> 'The list below shows information about the files needing an update. Please read the information in front of every status block to see what they mean and what you may need to do to perform a successful update.',
 	'COLLECTING_FILE_DIFFS'			=> 'Collecting file differences',
 	'COMPLETE_LOGIN_TO_BOARD'		=> 'You should now <a href="../ucp.php?mode=login">login to your board</a> and check if everything is working fine. Do not forget to delete, rename or move your install directory!',
-	'CONTINUE_UPDATE_NOW'			=> 'Continue the update process now',
+	'CONTINUE_UPDATE_NOW'			=> 'Continue the update process now',		// Shown within the database update script at the end if called from the updater
+	'CONTINUE_UPDATE'				=> 'Continue update now',					// Shown after file upload to indicate the update process is not yet finished
 	'CURRENT_FILE'					=> 'Beginning of current original file',
 	'CURRENT_VERSION'				=> 'Current version',
 
@@ -408,7 +409,7 @@
 	'FILE_DIFF_NOT_ALLOWED'			=> 'File not allowed to be diffed.',
 	'FILE_USED'						=> 'Information used from',			// Single file
 	'FILES_CONFLICT'				=> 'Conflict files',
-	'FILES_CONFLICT_EXPLAIN'		=> 'The following files are modified and do not represent the original files from the old version. phpBB determined that these files create conflicts if they are tried to be merged. Please investigate the conflicts and try to manually resolve them or continue the update choosing the preferred merging method. If you resolve the conflicts manually check the files again after you modified them. You are also able to choose between the preferred merge method for every file. The first one will result in a file where the conflicting lines from your old file will be lost, the other one will result in loosing the changes from the newer file.',
+	'FILES_CONFLICT_EXPLAIN'		=> 'The following files are modified and do not represent the original files from the old version. phpBB determined that these files create conflicts if they are tried to be merged. Please investigate the conflicts and try to manually resolve them or continue the update choosing the preferred merging method. If you resolve the conflicts manually check the files again after you modified them. You are also able to choose between the preferred merge method for every file. The first one will result in a file where the conflicting lines from your old file will be lost, the other one will result in losing the changes from the newer file.',
 	'FILES_MODIFIED'				=> 'Modified files',
 	'FILES_MODIFIED_EXPLAIN'		=> 'The following files are modified and do not represent the original files from the old version. The updated file will be a merge between your modifications and the new file.',
 	'FILES_NEW'						=> 'New files',
diff -x .svn -aruN 3.0.3.src/language/en/ucp.php 3.0.4.src/language/en/ucp.php
--- 3.0.3.src/language/en/ucp.php	2008-12-09 13:18:39.000000000 -0600
+++ 3.0.4.src/language/en/ucp.php	2008-12-15 09:05:32.000000000 -0600
@@ -4,7 +4,7 @@
 * ucp [English]
 *
 * @package language
-* @version $Id: ucp.php 9001 2008-10-11 16:35:27Z toonarmy $
+* @version $Id: ucp.php 9162 2008-12-03 11:18:31Z acydburn $
 * @copyright (c) 2005 phpBB Group
 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
 *
@@ -118,7 +118,7 @@
 	'CHANGE_PASSWORD'			=> 'Change password',
 	'CLICK_RETURN_FOLDER'		=> '%1$sReturn to your “%3$s” folder%2$s',
 	'CONFIRMATION'				=> 'Confirmation of registration',
-	'CONFIRM_CHANGES'			=> 'Confirm changes',	
+	'CONFIRM_CHANGES'			=> 'Confirm changes',
 	'CONFIRM_EMAIL'				=> 'Confirm e-mail address',
 	'CONFIRM_EMAIL_EXPLAIN'		=> 'You only need to specify this if you are changing your e-mail address.',
 	'CONFIRM_EXPLAIN'			=> 'To prevent automated registrations the board requires you to enter a confirmation code. The code is displayed in the image you should see below. If you are visually impaired or cannot otherwise read this code please contact the %sBoard Administrator%s.',
@@ -378,7 +378,7 @@
 	'SAME_PASSWORD_ERROR'		=> 'The new password you entered is the same as your current password.',
 	'SEARCH_YOUR_POSTS'			=> 'Show your posts',
 	'SEND_PASSWORD'				=> 'Send password',
-	'SENT_AT'					=> 'Sent at',
+	'SENT_AT'					=> 'Sent',			// Used before dates in private messages
 	'SHOW_EMAIL'				=> 'Users can contact me by e-mail',
 	'SIGNATURE_EXPLAIN'			=> 'This is a block of text that can be added to posts you make. There is a %d character limit.',
 	'SIGNATURE_PREVIEW'			=> 'Your signature will appear like this in posts',
@@ -421,7 +421,7 @@
 	'UCP_PREFS_PERSONAL'		=> 'Edit global settings',
 	'UCP_PREFS_POST'			=> 'Edit posting defaults',
 	'UCP_PREFS_VIEW'			=> 'Edit display options',
-	
+
 	'UCP_PM'					=> 'Private messages',
 	'UCP_PM_COMPOSE'			=> 'Compose message',
 	'UCP_PM_DRAFTS'				=> 'Manage PM drafts',
diff -x .svn -aruN 3.0.3.src/memberlist.php 3.0.4.src/memberlist.php
--- 3.0.3.src/memberlist.php	2008-12-09 13:18:40.000000000 -0600
+++ 3.0.4.src/memberlist.php	2008-12-15 09:05:33.000000000 -0600
@@ -2,7 +2,7 @@
 /**
 *
 * @package phpBB3
-* @version $Id: memberlist.php 9054 2008-11-09 15:48:37Z toonarmy $
+* @version $Id: memberlist.php 9156 2008-12-02 18:48:25Z toonarmy $
 * @copyright (c) 2005 phpBB Group
 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
 *
@@ -238,7 +238,7 @@
 			}
 
 			$rank_title = $rank_img = '';
-			get_user_rank($row['user_rank'], $row['user_posts'], $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);
 
 			$template->assign_block_vars($which_row, array(
 				'USER_ID'		=> $row['user_id'],
@@ -570,7 +570,7 @@
 			'S_CUSTOM_FIELDS'	=> (isset($profile_fields['row']) && sizeof($profile_fields['row'])) ? true : false,
 
 			'U_USER_ADMIN'			=> ($auth->acl_get('a_user')) ? append_sid("{$phpbb_root_path}adm/index.$phpEx", 'i=users&amp;mode=overview&amp;u=' . $user_id, true, $user->session_id) : '',
-			'U_USER_BAN'			=> ($auth->acl_get('m_ban')) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=ban&amp;mode=user&amp;u=' . $user_id, true, $user->session_id) : '',
+			'U_USER_BAN'			=> ($auth->acl_get('m_ban') && $user_id != $user->data['user_id']) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=ban&amp;mode=user&amp;u=' . $user_id, true, $user->session_id) : '',
 			'U_MCP_QUEUE'			=> ($auth->acl_getf_global('m_approve')) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=queue', true, $user->session_id) : '',
 
 			'U_SWITCH_PERMISSIONS'	=> ($auth->acl_get('a_switchperm') && $user->data['user_id'] != $user_id) ? append_sid("{$phpbb_root_path}ucp.$phpEx", "mode=switch_perm&amp;u={$user_id}") : '',
@@ -1276,11 +1276,21 @@
 			$s_group_select = '<option value="0"' . ((!$group_selected) ? ' selected="selected"' : '') . '>&nbsp;</option>';
 			$group_ids = array();
 
+			/**
+			* @todo add this to a separate function (function is responsible for returning the groups the user is able to see based on the users group membership)
+			*/
+
 			if ($auth->acl_gets('a_group', 'a_groupadd', 'a_groupdel'))
 			{
 				$sql = 'SELECT group_id, group_name, group_type
-					FROM ' . GROUPS_TABLE . '
-					ORDER BY group_name ASC';
+					FROM ' . GROUPS_TABLE;
+
+				if (!$config['coppa_enable'])
+				{
+					$sql .= " WHERE group_name <> 'REGISTERED_COPPA'";
+				}
+
+				$sql .= ' ORDER BY group_name ASC';
 			}
 			else
 			{
@@ -1292,8 +1302,14 @@
 							AND ug.user_id = ' . $user->data['user_id'] . '
 							AND ug.user_pending = 0
 						)
-					WHERE (g.group_type <> ' . GROUP_HIDDEN . ' OR ug.user_id = ' . $user->data['user_id'] . ')
-					ORDER BY g.group_name ASC';
+					WHERE (g.group_type <> ' . GROUP_HIDDEN . ' OR ug.user_id = ' . $user->data['user_id'] . ')';
+
+				if (!$config['coppa_enable'])
+				{
+					$sql .= " AND g.group_name <> 'REGISTERED_COPPA'";
+				}
+
+				$sql .= ' ORDER BY g.group_name ASC';
 			}
 			$result = $db->sql_query($sql);
 
@@ -1523,7 +1539,7 @@
 	$user_id = $data['user_id'];
 
 	$rank_title = $rank_img = $rank_img_src = '';
-	get_user_rank($data['user_rank'], $data['user_posts'], $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);
 
 	if (!empty($data['user_allow_viewemail']) || $auth->acl_get('a_user'))
 	{
diff -x .svn -aruN 3.0.3.src/styles/prosilver/imageset/imageset.cfg 3.0.4.src/styles/prosilver/imageset/imageset.cfg
--- 3.0.3.src/styles/prosilver/imageset/imageset.cfg	2008-12-09 13:18:39.000000000 -0600
+++ 3.0.4.src/styles/prosilver/imageset/imageset.cfg	2008-12-15 09:05:32.000000000 -0600
@@ -19,7 +19,7 @@
 # General Information about this style
 name = prosilver
 copyright = &copy; phpBB Group, 2007
-version = 3.0.3
+version = 3.0.4
 
 # Images
 img_site_logo = site_logo.gif*52*139
diff -x .svn -aruN 3.0.3.src/styles/prosilver/style.cfg 3.0.4.src/styles/prosilver/style.cfg
--- 3.0.3.src/styles/prosilver/style.cfg	2008-12-09 13:18:39.000000000 -0600
+++ 3.0.4.src/styles/prosilver/style.cfg	2008-12-15 09:05:32.000000000 -0600
@@ -19,4 +19,4 @@
 # General Information about this style
 name = prosilver
 copyright = &copy; phpBB Group, 2007
-version = 3.0.3
\ No newline at end of file
+version = 3.0.4
\ No newline at end of file
diff -x .svn -aruN 3.0.3.src/styles/prosilver/template/forumlist_body.html 3.0.4.src/styles/prosilver/template/forumlist_body.html
--- 3.0.3.src/styles/prosilver/template/forumlist_body.html	2008-12-09 13:18:39.000000000 -0600
+++ 3.0.4.src/styles/prosilver/template/forumlist_body.html	2008-12-15 09:05:32.000000000 -0600
@@ -42,7 +42,7 @@
 					<dd class="posts">{forumrow.POSTS} <dfn>{L_POSTS}</dfn></dd>
 					<dd class="lastpost"><span>
 						<!-- IF forumrow.LAST_POST_TIME --><dfn>{L_LAST_POST}</dfn> {L_POST_BY_AUTHOR} {forumrow.LAST_POSTER_FULL}
-						<!-- IF not S_IS_BOT --><a href="{forumrow.U_LAST_POST}">{LAST_POST_IMG}</a> <!-- ENDIF --><br />{L_POSTED_ON_DATE} {forumrow.LAST_POST_TIME}<!-- ELSE -->{L_NO_POSTS}<!-- ENDIF --></span>
+						<!-- IF not S_IS_BOT --><a href="{forumrow.U_LAST_POST}">{LAST_POST_IMG}</a> <!-- ENDIF --><br />{forumrow.LAST_POST_TIME}<!-- ELSE -->{L_NO_POSTS}<br />&nbsp;<!-- ENDIF --></span>
 					</dd>
 				<!-- ENDIF -->
 			</dl>
diff -x .svn -aruN 3.0.3.src/styles/prosilver/template/mcp_forum.html 3.0.4.src/styles/prosilver/template/mcp_forum.html
--- 3.0.3.src/styles/prosilver/template/mcp_forum.html	2008-12-09 13:18:39.000000000 -0600
+++ 3.0.4.src/styles/prosilver/template/mcp_forum.html	2008-12-15 09:05:32.000000000 -0600
@@ -36,16 +36,16 @@
 		<li class="row<!-- IF topicrow.S_ROW_COUNT is odd --> bg1<!-- ELSE --> bg2<!-- ENDIF --><!-- IF topicrow.S_TOPIC_REPORTED --> reported<!-- ENDIF -->">
 			<dl class="icon" style="background-image: url({topicrow.TOPIC_FOLDER_IMG_SRC}); background-repeat: no-repeat;">
 				<dt <!-- IF topicrow.TOPIC_ICON_IMG and S_TOPIC_ICONS -->style="background-image: url({T_ICONS_PATH}{topicrow.TOPIC_ICON_IMG}); background-repeat: no-repeat;"<!-- ENDIF -->>
-					<!-- IF topicrow.S_SELECT_TOPIC --><a href="{topicrow.U_SELECT_TOPIC}" class="topictitle">[ {L_SELECT_MERGE} ]</a>&nbsp;&nbsp; <!-- ENDIF --> 
+					<!-- IF topicrow.S_SELECT_TOPIC --><a href="{topicrow.U_SELECT_TOPIC}" class="topictitle">[ {L_SELECT_MERGE} ]</a>&nbsp;&nbsp; <!-- ENDIF -->
 					<a href="{topicrow.U_VIEW_TOPIC}" class="topictitle">{topicrow.TOPIC_TITLE}</a>
 					<!-- IF topicrow.S_TOPIC_UNAPPROVED or topicrow.S_POSTS_UNAPPROVED --><a href="{topicrow.U_MCP_QUEUE}">{topicrow.UNAPPROVED_IMG}</a> <!-- ENDIF -->
 					<!-- IF topicrow.S_TOPIC_REPORTED --><a href="{topicrow.U_MCP_REPORT}">{REPORTED_IMG}</a><!-- ENDIF -->
 					<!-- IF topicrow.S_MOVED_TOPIC and S_CAN_DELETE -->&nbsp;<a href="{topicrow.U_DELETE_TOPIC}" class="topictitle">[ {L_DELETE_SHADOW_TOPIC} ]</a><!-- ENDIF -->
 					<br />
 					<!-- IF topicrow.PAGINATION --><strong class="pagination"><span>{topicrow.PAGINATION}</span></strong><!-- ENDIF -->
-					<!-- IF topicrow.ATTACH_ICON_IMG -->{topicrow.ATTACH_ICON_IMG} <!-- ENDIF -->{L_POST_BY_AUTHOR} {topicrow.TOPIC_AUTHOR_FULL} {L_POSTED_ON_DATE} {topicrow.FIRST_POST_TIME} </dt>
+					<!-- IF topicrow.ATTACH_ICON_IMG -->{topicrow.ATTACH_ICON_IMG} <!-- ENDIF -->{L_POST_BY_AUTHOR} {topicrow.TOPIC_AUTHOR_FULL} &raquo; {topicrow.FIRST_POST_TIME} </dt>
 				<dd class="posts">{topicrow.REPLIES} <dfn>{L_REPLIES}</dfn></dd>
-				<dd class="lastpost"><span><dfn>{L_LAST_POST} </dfn>{L_POST_BY_AUTHOR} {topicrow.LAST_POST_AUTHOR_FULL} {L_POSTED_ON_DATE}<br />{topicrow.LAST_POST_TIME}</span>
+				<dd class="lastpost"><span><dfn>{L_LAST_POST} </dfn>{L_POST_BY_AUTHOR} {topicrow.LAST_POST_AUTHOR_FULL}<br />{topicrow.LAST_POST_TIME}</span>
 				</dd>
 				<!-- IF not S_MERGE_SELECT -->
 				<dd class="mark">
@@ -64,9 +64,9 @@
 
 	<fieldset class="display-options">
 		<!-- IF NEXT_PAGE --><a href="{NEXT_PAGE}" class="right-box {S_CONTENT_FLOW_END}">{L_NEXT}</a><!-- ENDIF -->
-		<!-- IF PREVIOUS_PAGE --><a href="{PREVIOUS_PAGE}" class="left-box {S_CONTENT_FLOW_BEGIN}">{L_PREVIOUS}</a><!-- ENDIF -->	
-		<label>{L_DISPLAY_TOPICS}: {S_SELECT_SORT_DAYS}</label> 
-		<label>{L_SORT_BY} {S_SELECT_SORT_KEY}</label> 
+		<!-- IF PREVIOUS_PAGE --><a href="{PREVIOUS_PAGE}" class="left-box {S_CONTENT_FLOW_BEGIN}">{L_PREVIOUS}</a><!-- ENDIF -->
+		<label>{L_DISPLAY_TOPICS}: {S_SELECT_SORT_DAYS}</label>
+		<label>{L_SORT_BY} {S_SELECT_SORT_KEY}</label>
 		<label>{S_SELECT_SORT_DIR} <input type="submit" name="sort" value="{L_GO}" class="button2" /></label>
 	</fieldset>
 
diff -x .svn -aruN 3.0.3.src/styles/prosilver/template/mcp_front.html 3.0.4.src/styles/prosilver/template/mcp_front.html
--- 3.0.3.src/styles/prosilver/template/mcp_front.html	2008-12-09 13:18:39.000000000 -0600
+++ 3.0.4.src/styles/prosilver/template/mcp_front.html	2008-12-15 09:05:32.000000000 -0600
@@ -29,7 +29,7 @@
 					<dt>
 						<a href="{unapproved.U_POST_DETAILS}" class="topictitle">{unapproved.SUBJECT}</a> {unapproved.ATTACH_ICON_IMG}<br />
 						<!-- IF report.PAGINATION --><strong class="pagination"><span>{report.PAGINATION}</span></strong><!-- ENDIF -->
-						{L_POSTED} {L_POST_BY_AUTHOR} {unapproved.AUTHOR_FULL} {L_POSTED_ON_DATE} {unapproved.POST_TIME}
+						{L_POSTED} {L_POST_BY_AUTHOR} {unapproved.AUTHOR_FULL} &raquo; {unapproved.POST_TIME}
 					</dt>
 					<dd class="moderation"><span>
 						{L_TOPIC}: <a href="{unapproved.U_TOPIC}">{unapproved.TOPIC_TITLE}</a> [<a href="{unapproved.U_MCP_TOPIC}">{L_MODERATE}</a>]<br />
@@ -82,7 +82,7 @@
 				<dl>
 					<dt>
 						<a href="{report.U_POST_DETAILS}#reports" class="topictitle">{report.SUBJECT}</a> {report.ATTACH_ICON_IMG}<br />
-						<span>{L_POSTED} {L_POST_BY_AUTHOR} {report.AUTHOR_FULL} {L_POSTED_ON_DATE}  {report.POST_TIME}</span>
+						<span>{L_POSTED} {L_POST_BY_AUTHOR} {report.AUTHOR_FULL} &raquo; {report.POST_TIME}</span>
 					</dt>
 					<dd class="moderation">
 						<span>{L_REPORTED} {L_POST_BY_AUTHOR} {report.REPORTER_FULL} {L_REPORTED_ON_DATE} {report.REPORT_TIME}<br />
@@ -103,7 +103,7 @@
 <!-- IF S_SHOW_LOGS -->
 	<div class="panel">
 		<div class="inner"><span class="corners-top"><span></span></span>
-	
+
 		<h3>{L_LATEST_LOGS}</h3>
 
 		<table class="table1" cellspacing="0">
@@ -129,7 +129,7 @@
 		</tr>
 	<!-- BEGINELSE -->
 		<tr>
-			<td colspan="5">{L_NO_ENTRIES}</td>
+			<td colspan="6">{L_NO_ENTRIES}</td>
 		</tr>
 	<!-- END log -->
 		</tbody>
diff -x .svn -aruN 3.0.3.src/styles/prosilver/template/mcp_post.html 3.0.4.src/styles/prosilver/template/mcp_post.html
--- 3.0.3.src/styles/prosilver/template/mcp_post.html	2008-12-09 13:18:39.000000000 -0600
+++ 3.0.4.src/styles/prosilver/template/mcp_post.html	2008-12-15 09:05:32.000000000 -0600
@@ -51,13 +51,13 @@
 		<!-- ENDIF -->
 
 		<h3><a href="{U_VIEW_POST}">{POST_SUBJECT}</a></h3>
-		<p class="author">{MINI_POST_IMG} {L_POSTED} {L_POST_BY_AUTHOR} {POST_AUTHOR_FULL} {L_POSTED_ON_DATE}  {POST_DATE}</p>
+		<p class="author">{MINI_POST_IMG} {L_POSTED} {L_POST_BY_AUTHOR} {POST_AUTHOR_FULL} &raquo; {POST_DATE}</p>
 
 		<!-- IF S_POST_UNAPPROVED -->
 			<form method="post" id="mcp_approve" action="{U_APPROVE_ACTION}">
 
 			<p class="rules">
-				<input class="button1" type="submit" value="{L_APPROVE}" name="action[approve]" /> &nbsp; 
+				<input class="button1" type="submit" value="{L_APPROVE}" name="action[approve]" /> &nbsp;
 				<input class="button2" type="submit" value="{L_DISAPPROVE}" name="action[disapprove]" />
 				<input type="hidden" name="post_id_list[]" value="{POST_ID}" />
 				{S_FORM_TOKEN}
@@ -70,7 +70,7 @@
 				{REPORTED_IMG} <a href="{U_MCP_REPORT}"><strong>{L_MESSAGE_REPORTED}</strong></a>
 			</p>
 		<!-- ENDIF -->
-		
+
 		<div class="content">
 			{POST_PREVIEW}
 		</div>
@@ -125,7 +125,7 @@
 			</fieldset>
 			</form>
 		<!-- ENDIF -->
-	
+
 		<!-- IF S_CAN_LOCK_POST or S_CAN_DELETE_POST -->
 			<form method="post" id="mcp" action="{U_MCP_ACTION}">
 
@@ -174,7 +174,7 @@
 					<span class="small"><strong>{L_REPORTED_BY}: {usernotes.REPORT_BY} {L_REPORTED_ON_DATE} {usernotes.REPORT_AT}</strong></span>
 					<!-- IF S_CLEAR_ALLOWED --><div class="right-box"><input type="checkbox" name="marknote[]" value="{usernotes.ID}" /></div><!-- ENDIF -->
 					<div class="postbody">{usernotes.ACTION}</div>
-		
+
 					<hr class="dashed" />
 				<!-- END usernotes -->
 
@@ -194,7 +194,7 @@
 			</fieldset>
 
 			<fieldset class="submit-buttons">
-				<input class="button1" type="submit" name="action[add_feedback]" value="{L_SUBMIT}" />&nbsp; 
+				<input class="button1" type="submit" name="action[add_feedback]" value="{L_SUBMIT}" />&nbsp;
 				<input class="button2" type="reset" value="{L_RESET}" />
 				{S_FORM_TOKEN}
 			</fieldset>
@@ -214,7 +214,7 @@
 				<span class="small"><strong>{L_REPORTED_BY}: <!-- IF reports.U_REPORTER --><a href="{reports.U_REPORTER}">{reports.REPORTER}</a><!-- ELSE -->{reports.REPORTER}<!-- ENDIF --> {L_REPORTED_ON_DATE} {reports.REPORT_TIME}</strong></span>
 				<p><em>{reports.REASON_TITLE}: {reports.REASON_DESC}</em><!-- IF reports.REPORT_TEXT --><br />{reports.REPORT_TEXT}<!-- ENDIF --></p>
 			<!-- END reports -->
-	
+
 			<span class="corners-bottom"><span></span></span></div>
 		</div>
 	<!-- ENDIF -->
diff -x .svn -aruN 3.0.3.src/styles/prosilver/template/mcp_queue.html 3.0.4.src/styles/prosilver/template/mcp_queue.html
--- 3.0.3.src/styles/prosilver/template/mcp_queue.html	2008-12-09 13:18:39.000000000 -0600
+++ 3.0.4.src/styles/prosilver/template/mcp_queue.html	2008-12-15 09:05:32.000000000 -0600
@@ -21,7 +21,7 @@
 				<!-- IF TOTAL --> {TOTAL}<!-- ENDIF -->
 				<!-- IF PAGE_NUMBER --><!-- IF PAGINATION --> &bull; <a href="#" onclick="jumpto(); return false;" title="{L_JUMP_TO_PAGE}">{PAGE_NUMBER}</a> &bull; <span>{PAGINATION}</span><!-- ELSE --> &bull; {PAGE_NUMBER}<!-- ENDIF --><!-- ENDIF -->
 			</li>
-		</ul>	
+		</ul>
 		<ul class="topiclist">
 			<li class="header">
 				<dl>
@@ -38,12 +38,12 @@
 		<!-- IF postrow.S_DELETED_TOPIC -->
 			<li><p class="notopics">{L_DELETED_TOPIC}</p></li>
 		<!-- ELSE -->
-	
+
 		<li class="row<!-- IF postrow.S_ROW_COUNT is odd --> bg1<!-- ELSE --> bg2<!-- ENDIF -->">
 			<dl>
 				<dt>
 					<a href="{postrow.U_VIEW_DETAILS}" class="topictitle">{postrow.POST_SUBJECT}</a> <br />
-					<span>{L_POSTED} {L_POST_BY_AUTHOR} {postrow.POST_AUTHOR_FULL} {L_POSTED_ON_DATE}  {postrow.POST_TIME}</span>
+					<span>{L_POSTED} {L_POST_BY_AUTHOR} {postrow.POST_AUTHOR_FULL} &raquo; {postrow.POST_TIME}</span>
 				</dt>
 				<dd class="moderation">
 					<span>
@@ -51,8 +51,8 @@
 						{L_FORUM}: <a href="{postrow.U_VIEWFORUM}">{postrow.FORUM_NAME}</a>
 					</span>
 				</dd>
-				
-			
+
+
 		 		<dd class="mark"><input type="checkbox" name="post_id_list[]" value="{postrow.POST_ID}" /></dd>
 			</dl>
 		</li>
@@ -62,7 +62,7 @@
 
 		<fieldset class="display-options">
 			<!-- IF NEXT_PAGE --><a href="{NEXT_PAGE}" class="right-box {S_CONTENT_FLOW_END}">{L_NEXT}</a><!-- ENDIF -->
-			<!-- IF PREVIOUS_PAGE --><a href="{PREVIOUS_PAGE}" class="left-box {S_CONTENT_FLOW_BEGIN}">{L_PREVIOUS}</a><!-- ENDIF -->		
+			<!-- IF PREVIOUS_PAGE --><a href="{PREVIOUS_PAGE}" class="left-box {S_CONTENT_FLOW_BEGIN}">{L_PREVIOUS}</a><!-- ENDIF -->
 			<label>{L_DISPLAY_POSTS}: {S_SELECT_SORT_DAYS}</label>
 			<label>{L_SORT_BY} {S_SELECT_SORT_KEY}</label><label>{S_SELECT_SORT_DIR}</label>
 			<!-- IF TOPIC_ID --><label><input type="checkbox" class="radio" name="t" value="{TOPIC_ID}" checked="checked" />&nbsp; <strong>{L_ONLY_TOPIC}</strong></label><!-- ENDIF -->
@@ -76,7 +76,7 @@
 				<!-- IF TOTAL -->{TOTAL}<!-- ENDIF -->
 				<!-- IF PAGE_NUMBER --><!-- IF PAGINATION --> &bull; <a href="#" onclick="jumpto(); return false;" title="{L_JUMP_TO_PAGE}">{PAGE_NUMBER}</a> &bull; <span>{PAGINATION}</span><!-- ELSE --> &bull; {PAGE_NUMBER}<!-- ENDIF --><!-- ENDIF -->
 			</li>
-		</ul>		
+		</ul>
 	<!-- ELSE -->
 		<p class="notopics"><strong><!-- IF S_TOPICS -->{L_NO_TOPICS_QUEUE}<!-- ELSE -->{L_UNAPPROVED_POSTS_ZERO_TOTAL}<!-- ENDIF --></strong></p>
 	<!-- ENDIF -->
diff -x .svn -aruN 3.0.3.src/styles/prosilver/template/mcp_reports.html 3.0.4.src/styles/prosilver/template/mcp_reports.html
--- 3.0.3.src/styles/prosilver/template/mcp_reports.html	2008-12-09 13:18:39.000000000 -0600
+++ 3.0.4.src/styles/prosilver/template/mcp_reports.html	2008-12-15 09:05:32.000000000 -0600
@@ -21,7 +21,7 @@
 				<!-- IF TOTAL -->{TOTAL_REPORTS}<!-- ENDIF -->
 				<!-- IF PAGE_NUMBER --><!-- IF PAGINATION --> &bull; <a href="#" onclick="jumpto(); return false;" title="{L_JUMP_TO_PAGE}">{PAGE_NUMBER}</a> &bull; <span>{PAGINATION}</span><!-- ELSE --> &bull; {PAGE_NUMBER}<!-- ENDIF --><!-- ENDIF -->
 			</li>
-		</ul>	
+		</ul>
 		<ul class="topiclist">
 			<li class="header">
 				<dl>
@@ -38,7 +38,7 @@
 				<dl>
 					<dt>
 						<a href="{postrow.U_VIEW_DETAILS}" class="topictitle">{postrow.POST_SUBJECT}</a> {postrow.ATTACH_ICON_IMG}<br />
-						<span>{L_POSTED} {L_POST_BY_AUTHOR} {postrow.POST_AUTHOR_FULL} {L_POSTED_ON_DATE}  {postrow.POST_TIME}</span>
+						<span>{L_POSTED} {L_POST_BY_AUTHOR} {postrow.POST_AUTHOR_FULL} &raquo; {postrow.POST_TIME}</span>
 					</dt>
 					<dd class="moderation">
 						<span>{postrow.REPORTER_FULL} {L_REPORTED_ON_DATE} {postrow.REPORT_TIME}<br />
@@ -74,7 +74,7 @@
 </div>
 
 <!-- IF .postrow -->
-	<fieldset class="display-actions">		
+	<fieldset class="display-actions">
 		<input class="button2" type="submit" value="{L_DELETE_REPORTS}" name="action[delete]" />
 		<!-- IF not S_CLOSED -->&nbsp;<input class="button1" type="submit" name="action[close]" value="{L_CLOSE_REPORTS}" /><!-- ENDIF -->
 		<div><a href="#" onclick="marklist('mcp', 'report_id_list', true); return false;">{L_MARK_ALL}</a> :: <a href="#" onclick="marklist('mcp', 'report_id_list', false); return false;">{L_UNMARK_ALL}</a></div>
diff -x .svn -aruN 3.0.3.src/styles/prosilver/template/memberlist_body.html 3.0.4.src/styles/prosilver/template/memberlist_body.html
--- 3.0.3.src/styles/prosilver/template/memberlist_body.html	2008-12-09 13:18:39.000000000 -0600
+++ 3.0.4.src/styles/prosilver/template/memberlist_body.html	2008-12-15 09:05:32.000000000 -0600
@@ -87,13 +87,11 @@
 		</tr>
 		</thead>
 		<tbody>
-		<!-- ELSEIF  not .memberrow-->
-		
 	<!-- ENDIF -->
 		<!-- BEGIN memberrow -->
 			<!-- IF S_SHOW_GROUP -->
 				<!-- IF not memberrow.S_GROUP_LEADER and not $S_MEMBER_HEADER -->
-				<!-- IF memberrow.S_FIRST_ROW -->
+				<!-- IF S_LEADERS_SET and memberrow.S_FIRST_ROW -->
 				<tr class="bg1">
 					<td colspan="<!-- IF U_SORT_ACTIVE -->5<!-- ELSE -->4<!-- ENDIF -->">&nbsp;</td>
 				</tr>
diff -x .svn -aruN 3.0.3.src/styles/prosilver/template/memberlist_search.html 3.0.4.src/styles/prosilver/template/memberlist_search.html
--- 3.0.3.src/styles/prosilver/template/memberlist_search.html	2008-12-09 13:18:39.000000000 -0600
+++ 3.0.4.src/styles/prosilver/template/memberlist_search.html	2008-12-15 09:05:32.000000000 -0600
@@ -68,8 +68,8 @@
 		<dd><input type="text" name="aim" id="aim" value="{AIM}" class="inputbox" /></dd>
 	</dl>
 	<dl>
-		<dt><label for="yim">{L_YIM}:</label></dt>
-		<dd><input type="text" name="yim" id="yim" value="{YIM}" class="inputbox" /></dd>
+		<dt><label for="yahoo">{L_YIM}:</label></dt>
+		<dd><input type="text" name="yahoo" id="yahoo" value="{YAHOO}" class="inputbox" /></dd>
 	</dl>
 	<dl>
 		<dt><label for="msn">{L_MSNM}:</label></dt>
diff -x .svn -aruN 3.0.3.src/styles/prosilver/template/posting_review.html 3.0.4.src/styles/prosilver/template/posting_review.html
--- 3.0.3.src/styles/prosilver/template/posting_review.html	2008-12-09 13:18:39.000000000 -0600
+++ 3.0.4.src/styles/prosilver/template/posting_review.html	2008-12-15 09:05:32.000000000 -0600
@@ -5,10 +5,10 @@
 <!-- BEGIN post_review_row -->
 <div id="ppr{post_review_row.POST_ID}" class="post <!-- IF post_review_row.S_ROW_COUNT is odd -->bg1<!-- ELSE -->bg2<!-- ENDIF --><!-- IF post_review_row.ONLINE_STATUS --> online<!-- ENDIF -->">
 	<div class="inner"><span class="corners-top"><span></span></span>
-	
+
 	<div class="postbody">
 		<h3><a href="#ppr{post_review_row.POST_ID}">{post_review_row.POST_SUBJECT}</a></h3>
-		<p class="author"><!-- IF S_IS_BOT -->{post_review_row.MINI_POST_IMG}<!-- ELSE --><a href="{post_review_row.U_MINI_POST}">{post_review_row.MINI_POST_IMG}</a><!-- ENDIF --> {L_POST_BY_AUTHOR}<strong>  {post_review_row.POST_AUTHOR_FULL}</strong> {L_POSTED_ON_DATE} {post_review_row.POST_DATE}</p>
+		<p class="author"><!-- IF S_IS_BOT -->{post_review_row.MINI_POST_IMG}<!-- ELSE --><a href="{post_review_row.U_MINI_POST}">{post_review_row.MINI_POST_IMG}</a><!-- ENDIF --> {L_POST_BY_AUTHOR}<strong>  {post_review_row.POST_AUTHOR_FULL}</strong> &raquo; {post_review_row.POST_DATE}</p>
 		<div class="content">{post_review_row.MESSAGE}</div>
 
 		<!-- IF post_review_row.S_HAS_ATTACHMENTS -->
@@ -21,7 +21,7 @@
 		<!-- ENDIF -->
 
 	</div>
-	
+
 	<span class="corners-bottom"><span></span></span></div>
 </div>
 <!-- END post_review_row -->
diff -x .svn -aruN 3.0.3.src/styles/prosilver/template/posting_topic_review.html 3.0.4.src/styles/prosilver/template/posting_topic_review.html
--- 3.0.3.src/styles/prosilver/template/posting_topic_review.html	2008-12-09 13:18:39.000000000 -0600
+++ 3.0.4.src/styles/prosilver/template/posting_topic_review.html	2008-12-15 09:05:32.000000000 -0600
@@ -8,7 +8,7 @@
 	<!-- BEGIN topic_review_row -->
 	<div class="post <!-- IF topic_review_row.S_ROW_COUNT is odd -->bg1<!-- ELSE -->bg2<!-- ENDIF -->">
 		<div class="inner"><span class="corners-top"><span></span></span>
-		
+
 		<div class="postbody" id="pr{topic_review_row.POST_ID}">
 			<!-- IF topic_review_row.POSTER_QUOTE and topic_review_row.DECODED_MESSAGE -->
 			<ul class="profile-icons">
@@ -17,7 +17,7 @@
 			<!-- ENDIF -->
 			<!-- IF topic_review_row.U_MCP_DETAILS --><div class="right-box"><a href="{topic_review_row.U_MCP_DETAILS}">{L_POST_DETAILS}</a></div><!-- ENDIF -->
 			<h3><a href="#pr{topic_review_row.POST_ID}">{topic_review_row.POST_SUBJECT}</a></h3>
-			<p class="author"><!-- IF S_IS_BOT -->{topic_review_row.MINI_POST_IMG}<!-- ELSE --><a href="{topic_review_row.U_MINI_POST}">{topic_review_row.MINI_POST_IMG}</a><!-- ENDIF --> {L_POST_BY_AUTHOR} <strong>{topic_review_row.POST_AUTHOR_FULL}</strong> {L_POSTED_ON_DATE} {topic_review_row.POST_DATE}  </p>
+			<p class="author"><!-- IF S_IS_BOT -->{topic_review_row.MINI_POST_IMG}<!-- ELSE --><a href="{topic_review_row.U_MINI_POST}">{topic_review_row.MINI_POST_IMG}</a><!-- ENDIF --> {L_POST_BY_AUTHOR} <strong>{topic_review_row.POST_AUTHOR_FULL}</strong> &raquo; {topic_review_row.POST_DATE}  </p>
 			<div class="content">{topic_review_row.MESSAGE}</div>
 
 			<!-- IF topic_review_row.S_HAS_ATTACHMENTS -->
diff -x .svn -aruN 3.0.3.src/styles/prosilver/template/search_results.html 3.0.4.src/styles/prosilver/template/search_results.html
--- 3.0.3.src/styles/prosilver/template/search_results.html	2008-12-09 13:18:39.000000000 -0600
+++ 3.0.4.src/styles/prosilver/template/search_results.html	2008-12-15 09:05:32.000000000 -0600
@@ -59,20 +59,20 @@
 						<!-- IF searchresults.S_TOPIC_UNAPPROVED or searchresults.S_POSTS_UNAPPROVED --><a href="{searchresults.U_MCP_QUEUE}">{searchresults.UNAPPROVED_IMG}</a> <!-- ENDIF -->
 						<!-- IF searchresults.S_TOPIC_REPORTED --><a href="{searchresults.U_MCP_REPORT}">{REPORTED_IMG}</a><!-- ENDIF --><br />
 						<!-- IF searchresults.PAGINATION --><strong class="pagination"><span>{searchresults.PAGINATION}</span></strong><!-- ENDIF -->
-						{L_POST_BY_AUTHOR} {searchresults.TOPIC_AUTHOR_FULL} {L_POSTED_ON_DATE} {searchresults.FIRST_POST_TIME} 
+						{L_POST_BY_AUTHOR} {searchresults.TOPIC_AUTHOR_FULL} &raquo; {searchresults.FIRST_POST_TIME}
 						<!-- IF not searchresults.S_TOPIC_GLOBAL -->{L_IN} <a href="{searchresults.U_VIEW_FORUM}">{searchresults.FORUM_TITLE}</a><!-- ELSE --> ({L_GLOBAL})<!-- ENDIF -->
 					</dt>
 					<dd class="posts">{searchresults.TOPIC_REPLIES}</dd>
 					<dd class="views">{searchresults.TOPIC_VIEWS}</dd>
 					<dd class="lastpost"><span>
 						{L_POST_BY_AUTHOR} {searchresults.LAST_POST_AUTHOR_FULL}
-						<!-- IF not S_IS_BOT --><a href="{searchresults.U_LAST_POST}">{LAST_POST_IMG}</a> <!-- ENDIF --><br />{L_POSTED_ON_DATE} {searchresults.LAST_POST_TIME}<br /> </span>
+						<!-- IF not S_IS_BOT --><a href="{searchresults.U_LAST_POST}">{LAST_POST_IMG}</a> <!-- ENDIF --><br />{searchresults.LAST_POST_TIME}<br /> </span>
 					</dd>
 				</dl>
 			</li>
 		<!-- END searchresults -->
 		</ul>
-		
+
 		<span class="corners-bottom"><span></span></span></div>
 	</div>
 	<!-- ELSE -->
@@ -87,37 +87,37 @@
 
 	<!-- BEGIN searchresults -->
 		<div class="search post <!-- IF searchresults.S_ROW_COUNT is odd -->bg1<!-- ELSE -->bg2<!-- ENDIF --><!-- IF searchresults.S_POST_REPORTED --> reported<!-- ENDIF -->">
-			<div class="inner"><span class="corners-top"><span></span></span>	
-	
+			<div class="inner"><span class="corners-top"><span></span></span>
+
 	<!-- IF searchresults.S_IGNORE_POST -->
-		<div class="postbody">		
+		<div class="postbody">
 			{searchresults.L_IGNORE_POST}
 		</div>
 	<!-- ELSE -->
 		<div class="postbody">
-			<h3><a href="{searchresults.U_VIEW_POST}">{searchresults.POST_SUBJECT}</a></h3>		
+			<h3><a href="{searchresults.U_VIEW_POST}">{searchresults.POST_SUBJECT}</a></h3>
 			<div class="content">{searchresults.MESSAGE}</div>
 		</div>
-	
+
 		<dl class="postprofile">
 			<dt class="author">{L_POST_BY_AUTHOR} {searchresults.POST_AUTHOR_FULL}</dt>
-			<dd>{L_POSTED_ON_DATE} {searchresults.POST_DATE}</dd>
-			<dd>&nbsp;</dd>		
+			<dd>{searchresults.POST_DATE}</dd>
+			<dd>&nbsp;</dd>
 			<!-- IF searchresults.FORUM_TITLE -->
 				<dd>{L_FORUM}: <a href="{searchresults.U_VIEW_FORUM}">{searchresults.FORUM_TITLE}</a></dd>
-				<dd>{L_TOPIC}: <a href="{searchresults.U_VIEW_TOPIC}">{searchresults.TOPIC_TITLE}</a></dd>	
+				<dd>{L_TOPIC}: <a href="{searchresults.U_VIEW_TOPIC}">{searchresults.TOPIC_TITLE}</a></dd>
 			<!-- ELSE -->
-				<dd>{L_GLOBAL}: <a href="{searchresults.U_VIEW_TOPIC}">{searchresults.TOPIC_TITLE}</a></dd>	
+				<dd>{L_GLOBAL}: <a href="{searchresults.U_VIEW_TOPIC}">{searchresults.TOPIC_TITLE}</a></dd>
 			<!-- ENDIF -->
 			<dd>{L_REPLIES}: <strong>{searchresults.TOPIC_REPLIES}</strong></dd>
-			<dd>{L_VIEWS}: <strong>{searchresults.TOPIC_VIEWS}</strong></dd> 
-		</dl>	
+			<dd>{L_VIEWS}: <strong>{searchresults.TOPIC_VIEWS}</strong></dd>
+		</dl>
 	<!-- ENDIF -->
-	
+
 	<!-- IF not searchresults.S_IGNORE_POST -->
 		<ul class="searchresults">
 			<li ><a href="{searchresults.U_VIEW_POST}" class="{S_CONTENT_FLOW_END}">{L_JUMP_TO_POST}</a></li>
-		</ul>	
+		</ul>
 	<!-- ENDIF -->
 
 			<span class="corners-bottom"><span></span></span></div>
diff -x .svn -aruN 3.0.3.src/styles/prosilver/template/simple_header.html 3.0.4.src/styles/prosilver/template/simple_header.html
--- 3.0.3.src/styles/prosilver/template/simple_header.html	2008-12-09 13:18:39.000000000 -0600
+++ 3.0.4.src/styles/prosilver/template/simple_header.html	2008-12-15 09:05:32.000000000 -0600
@@ -19,6 +19,7 @@
 
 	var onload_functions = new Array();
 	var onunload_functions = new Array();
+	var style_cookie_settings = '{A_COOKIE_SETTINGS}';
 
 	/**
 	* New function for handling multiple calls to window.onload and window.unload by pentapenguin
diff -x .svn -aruN 3.0.3.src/styles/prosilver/template/template.cfg 3.0.4.src/styles/prosilver/template/template.cfg
--- 3.0.3.src/styles/prosilver/template/template.cfg	2008-12-09 13:18:39.000000000 -0600
+++ 3.0.4.src/styles/prosilver/template/template.cfg	2008-12-15 09:05:32.000000000 -0600
@@ -19,7 +19,7 @@
 # General Information about this template
 name = prosilver
 copyright = &copy; phpBB Group, 2007
-version = 3.0.3
+version = 3.0.4
 
 # Defining a different template bitfield
 template_bitfield = lNg=
diff -x .svn -aruN 3.0.3.src/styles/prosilver/template/ucp_main_bookmarks.html 3.0.4.src/styles/prosilver/template/ucp_main_bookmarks.html
--- 3.0.3.src/styles/prosilver/template/ucp_main_bookmarks.html	2008-12-09 13:18:39.000000000 -0600
+++ 3.0.4.src/styles/prosilver/template/ucp_main_bookmarks.html	2008-12-15 09:05:32.000000000 -0600
@@ -6,9 +6,9 @@
 
 <div class="panel">
 	<div class="inner"><span class="corners-top"><span></span></span>
-	
+
 	<p>{L_BOOKMARKS_EXPLAIN}</p>
-	
+
 <!-- IF S_NO_DISPLAY_BOOKMARKS -->
 	<p class="error">{L_BOOKMARKS_DISABLED}</p>
 <!-- ELSE -->
@@ -37,10 +37,10 @@
 					<!-- IF topicrow.S_TOPIC_UNAPPROVED or topicrow.S_POSTS_UNAPPROVED --><a href="{topicrow.U_MCP_QUEUE}">{topicrow.UNAPPROVED_IMG}</a> <!-- ENDIF -->
 					<!-- IF topicrow.S_TOPIC_REPORTED --><a href="{topicrow.U_MCP_REPORT}">{REPORTED_IMG}</a><!-- ENDIF --><br />
 					<!-- IF topicrow.PAGINATION --><strong class="pagination"><span>{topicrow.PAGINATION}</span></strong><!-- ENDIF -->
-					<!-- IF topicrow.ATTACH_ICON_IMG -->{topicrow.ATTACH_ICON_IMG} <!-- ENDIF -->{L_POST_BY_AUTHOR} {topicrow.TOPIC_AUTHOR_FULL} {L_POSTED_ON_DATE} {topicrow.FIRST_POST_TIME} 
+					<!-- IF topicrow.ATTACH_ICON_IMG -->{topicrow.ATTACH_ICON_IMG} <!-- ENDIF -->{L_POST_BY_AUTHOR} {topicrow.TOPIC_AUTHOR_FULL} &raquo; {topicrow.FIRST_POST_TIME}
 				</dt>
 				<dd class="lastpost"><span><dfn>{L_LAST_POST} </dfn>{L_POST_BY_AUTHOR} {topicrow.LAST_POST_AUTHOR_FULL}
-					<a href="{topicrow.U_LAST_POST}">{LAST_POST_IMG}</a> <br />{L_POSTED_ON_DATE} {topicrow.LAST_POST_TIME}</span>
+					<a href="{topicrow.U_LAST_POST}">{LAST_POST_IMG}</a> <br />{topicrow.LAST_POST_TIME}</span>
 				</dd>
 				<dd class="mark"><input type="checkbox" name="t[{topicrow.TOPIC_ID}]" id="t{topicrow.TOPIC_ID}" /></dd>
 			</dl>
@@ -64,7 +64,7 @@
 </div>
 
 <!-- IF .topicrow and not S_NO_DISPLAY_BOOKMARKS -->
-	<fieldset class="display-actions">		
+	<fieldset class="display-actions">
 		<input type="submit" name="unbookmark" value="{L_REMOVE_BOOKMARK_MARKED}" class="button2" />
 		<div><a href="#" onclick="marklist('ucp', '', true); return false;">{L_MARK_ALL}</a> &bull; <a href="#" onclick="marklist('ucp', '', false); return false;">{L_UNMARK_ALL}</a></div>
 		{S_FORM_TOKEN}
diff -x .svn -aruN 3.0.3.src/styles/prosilver/template/ucp_main_front.html 3.0.4.src/styles/prosilver/template/ucp_main_front.html
--- 3.0.3.src/styles/prosilver/template/ucp_main_front.html	2008-12-09 13:18:39.000000000 -0600
+++ 3.0.4.src/styles/prosilver/template/ucp_main_front.html	2008-12-15 09:05:32.000000000 -0600
@@ -17,10 +17,10 @@
 				<dt <!-- IF topicrow.TOPIC_ICON_IMG -->style="background-image: url({T_ICONS_PATH}{topicrow.TOPIC_ICON_IMG}); background-repeat: no-repeat;"<!-- ENDIF -->>
 					<!-- IF topicrow.S_UNREAD --><a href="{topicrow.U_NEWEST_POST}">{NEWEST_POST_IMG}</a> <!-- ENDIF --><a href="{topicrow.U_VIEW_TOPIC}" class="topictitle">{topicrow.TOPIC_TITLE}</a><br />
 					<!-- IF topicrow.PAGINATION --><strong class="pagination"><span>{topicrow.PAGINATION}</span></strong><!-- ENDIF -->
-					<!-- IF topicrow.ATTACH_ICON_IMG -->{topicrow.ATTACH_ICON_IMG} <!-- ENDIF -->{L_POST_BY_AUTHOR} {topicrow.TOPIC_AUTHOR_FULL} {L_POSTED_ON_DATE} {topicrow.FIRST_POST_TIME} 
+					<!-- IF topicrow.ATTACH_ICON_IMG -->{topicrow.ATTACH_ICON_IMG} <!-- ENDIF -->{L_POST_BY_AUTHOR} {topicrow.TOPIC_AUTHOR_FULL} &raquo; {topicrow.FIRST_POST_TIME}
 				</dt>
 				<dd class="lastpost"><span>{L_LAST_POST} {L_POST_BY_AUTHOR} {topicrow.LAST_POST_AUTHOR_FULL}
-					<a href="{topicrow.U_LAST_POST}">{LAST_POST_IMG}</a> <br />{L_POSTED_ON_DATE} {topicrow.LAST_POST_TIME}</span>
+					<a href="{topicrow.U_LAST_POST}">{LAST_POST_IMG}</a> <br />{topicrow.LAST_POST_TIME}</span>
 				</dd>
 			</dl>
 		</li>
diff -x .svn -aruN 3.0.3.src/styles/prosilver/template/ucp_main_subscribed.html 3.0.4.src/styles/prosilver/template/ucp_main_subscribed.html
--- 3.0.3.src/styles/prosilver/template/ucp_main_subscribed.html	2008-12-09 13:18:39.000000000 -0600
+++ 3.0.4.src/styles/prosilver/template/ucp_main_subscribed.html	2008-12-15 09:05:32.000000000 -0600
@@ -13,6 +13,7 @@
 		<li class="header">
 			<dl class="icon">
 				<dt>{L_WATCHED_FORUMS}</dt>
+				<dd class="lastpost">{L_LAST_POST}</dd>
 				<dd class="mark">{L_MARK}</dd>
 			</dl>
 		</li>
@@ -22,10 +23,11 @@
 	<!-- BEGIN forumrow -->
 		<li class="row<!-- IF forumrow.S_ROW_COUNT is odd --> bg1<!-- ELSE --> bg2<!-- ENDIF -->">
 			<dl class="icon" style="background-image: url({forumrow.FORUM_FOLDER_IMG_SRC}); background-repeat: no-repeat;">
-				<dt><a href="{forumrow.U_VIEWFORUM}" class="forumtitle">{forumrow.FORUM_NAME}</a><br />
-				<!-- IF forumrow.LAST_POST_TIME -->{L_LAST_POST} {forumrow.LAST_POST_AUTHOR_FULL} <a href="{forumrow.U_LAST_POST}">{LAST_POST_IMG}</a> {L_POSTED_ON_DATE} {forumrow.LAST_POST_TIME}
-				<!-- ELSE -->{L_NO_POSTS}<!-- ENDIF -->
-				</dt>
+				<dt><a href="{forumrow.U_VIEWFORUM}" class="forumtitle">{forumrow.FORUM_NAME}</a><br />{forumrow.FORUM_DESC}</dt>
+				<dd class="lastpost"><!-- IF forumrow.LAST_POST_TIME --><span><dfn>{L_LAST_POST} </dfn>{L_POST_BY_AUTHOR} {forumrow.LAST_POST_AUTHOR_FULL}
+					<a href="{topicrow.U_LAST_POST}">{LAST_POST_IMG}</a> <br />{forumrow.LAST_POST_TIME}</span>
+					<!-- ELSE -->{L_NO_POSTS}<br />&nbsp;<!-- ENDIF -->
+				</dd>
 				<dd class="mark"><input type="checkbox" name="f[{forumrow.FORUM_ID}]" id="f{forumrow.FORUM_ID}" /></dd>
 			</dl>
 		</li>
@@ -41,6 +43,7 @@
 			<dl class="icon">
 				<dt>{L_WATCHED_TOPICS}</dt>
 				<dd class="lastpost">{L_LAST_POST}</dd>
+				<dd class="mark">{L_MARK}</dd>
 			</dl>
 		</li>
 	</ul>
@@ -54,10 +57,10 @@
 					<!-- IF topicrow.S_TOPIC_UNAPPROVED or topicrow.S_POSTS_UNAPPROVED --><a href="{topicrow.U_MCP_QUEUE}">{topicrow.UNAPPROVED_IMG}</a> <!-- ENDIF -->
 					<!-- IF topicrow.S_TOPIC_REPORTED --><a href="{topicrow.U_MCP_REPORT}">{REPORTED_IMG}</a><!-- ENDIF --><br />
 					<!-- IF topicrow.PAGINATION --><strong class="pagination"><span>{topicrow.PAGINATION}</span></strong><!-- ENDIF -->
-					<!-- IF topicrow.ATTACH_ICON_IMG -->{topicrow.ATTACH_ICON_IMG} <!-- ENDIF -->{L_POST_BY_AUTHOR} {topicrow.TOPIC_AUTHOR_FULL} {L_POSTED_ON_DATE} {topicrow.FIRST_POST_TIME} 
+					<!-- IF topicrow.ATTACH_ICON_IMG -->{topicrow.ATTACH_ICON_IMG} <!-- ENDIF -->{L_POST_BY_AUTHOR} {topicrow.TOPIC_AUTHOR_FULL} &raquo; {topicrow.FIRST_POST_TIME}
 				</dt>
 				<dd class="lastpost"><span><dfn>{L_LAST_POST} </dfn>{L_POST_BY_AUTHOR} {topicrow.LAST_POST_AUTHOR_FULL}
-					<a href="{topicrow.U_LAST_POST}">{LAST_POST_IMG}</a> <br />{L_POSTED_ON_DATE} {topicrow.LAST_POST_TIME}</span>
+					<a href="{topicrow.U_LAST_POST}">{LAST_POST_IMG}</a> <br />{topicrow.LAST_POST_TIME}</span>
 				</dd>
 				<dd class="mark"><input type="checkbox" name="t[{topicrow.TOPIC_ID}]" id="t{topicrow.TOPIC_ID}" /></dd>
 			</dl>
@@ -73,12 +76,12 @@
 <!-- ELSEIF S_TOPIC_NOTIFY -->
 	<p><strong>{L_NO_WATCHED_TOPICS}</strong></p>
 <!-- ENDIF -->
-	
+
 	<span class="corners-bottom"><span></span></span></div>
 </div>
 
 <!-- IF .topicrow or .forumrow -->
-	<fieldset class="display-actions">	
+	<fieldset class="display-actions">
 		<input type="submit" name="unwatch" value="{L_UNWATCH_MARKED}" class="button2" />
 		<div><a href="#" onclick="marklist('ucp', 't', true); marklist('ucp', 'f', true); return false;">{L_MARK_ALL}</a> &bull; <a href="#" onclick="marklist('ucp', 't', false); marklist('ucp', 'f', false); return false;">{L_UNMARK_ALL}</a></div>
 		{S_FORM_TOKEN}
diff -x .svn -aruN 3.0.3.src/styles/prosilver/template/ucp_pm_history.html 3.0.4.src/styles/prosilver/template/ucp_pm_history.html
--- 3.0.3.src/styles/prosilver/template/ucp_pm_history.html	2008-12-09 13:18:39.000000000 -0600
+++ 3.0.4.src/styles/prosilver/template/ucp_pm_history.html	2008-12-15 09:05:32.000000000 -0600
@@ -12,7 +12,7 @@
 		<div class="postbody" id="pr{history_row.MSG_ID}">
 			<!-- IF history_row.U_QUOTE or history_row.MESSAGE_AUTHOR_QUOTE -->
 			<ul class="profile-icons">
-				<li class="quote-icon"><a <!-- IF history_row.U_QUOTE -->href="{history_row.U_QUOTE}"<!-- ELSE -->href="#postingbox" onclick="addquote({history_row.MSG_ID}, '{history_row.MESSAGE_AUTHOR_QUOTE}');"<!-- ENDIF -->" title="{L_QUOTE} {history_row.MESSAGE_AUTHOR}"><span>{L_QUOTE} {history_row.MESSAGE_AUTHOR}</span></a></li>
+				<li class="quote-icon"><a <!-- IF history_row.U_QUOTE -->href="{history_row.U_QUOTE}"<!-- ELSE -->href="#postingbox" onclick="addquote({history_row.MSG_ID}, '{history_row.MESSAGE_AUTHOR_QUOTE}');"<!-- ENDIF --> title="{L_QUOTE} {history_row.MESSAGE_AUTHOR}"><span>{L_QUOTE} {history_row.MESSAGE_AUTHOR}</span></a></li>
 			</ul>
 			<!-- ENDIF -->
 
diff -x .svn -aruN 3.0.3.src/styles/prosilver/template/ucp_pm_viewfolder.html 3.0.4.src/styles/prosilver/template/ucp_pm_viewfolder.html
--- 3.0.3.src/styles/prosilver/template/ucp_pm_viewfolder.html	2008-12-09 13:18:39.000000000 -0600
+++ 3.0.4.src/styles/prosilver/template/ucp_pm_viewfolder.html	2008-12-15 09:05:32.000000000 -0600
@@ -9,7 +9,7 @@
 	<h2>{L_EXPORT_AS_CSV}</h2>
 	<form id="viewfolder" method="post" action="{S_PM_ACTION}">
 	<div class="panel">
-		<div class="inner"><span class="corners-top"><span></span></span>				
+		<div class="inner"><span class="corners-top"><span></span></span>
 		<h3>{L_OPTIONS}</h3>
 		<fieldset>
 			<dl>
@@ -19,10 +19,10 @@
 			<dl>
 				<dt><label for="enclosure">{L_ENCLOSURE}:</label></dt>
 				<dd><input class="inputbox" type="text" id="enclosure" name="enclosure" value="&#034;" /></dd>
-			</dl>	
+			</dl>
 		</fieldset>
-		<span class="corners-bottom"><span></span></span></div>	
-	</div>	
+		<span class="corners-bottom"><span></span></span></div>
+	</div>
 	<fieldset class="submit-buttons">
 		<input type="hidden" name="export_option" value="CSV" />
 		<input class="button1" type="submit" name="submit_export" value="{L_EXPORT_FOLDER}" />&nbsp;
@@ -38,13 +38,13 @@
 			<p>{RULE_REMOVED_MESSAGES}</p>
 		</div>
 	<!-- ENDIF -->
-	
+
 	<!-- IF NUM_NOT_MOVED -->
 		<div class="notice">
 			<p>{NOT_MOVED_MESSAGES}<br />{RELEASE_MESSAGE_INFO}</p>
-		</div>	
+		</div>
 	<!-- ENDIF -->
-	
+
 	<!-- IF .messagerow -->
 		<ul class="topiclist">
 			<li class="header">
@@ -55,7 +55,7 @@
 			</li>
 		</ul>
 		<ul class="topiclist cplist pmlist">
-	
+
 		<!-- BEGIN messagerow -->
 			<li class="row<!-- IF messagerow.S_ROW_COUNT is odd --> bg1<!-- ELSE --> bg2<!-- ENDIF --><!-- IF messagerow.PM_CLASS --> {messagerow.PM_CLASS}<!-- ENDIF -->">
 				<dl class="icon" style="background-image: url({messagerow.FOLDER_IMG_SRC}); background-repeat: no-repeat;">
@@ -72,29 +72,29 @@
 						<!-- ENDIF -->
 
 						<!-- IF messagerow.S_TOPIC_REPORTED --><a href="{messagerow.U_MCP_REPORT}">{REPORTED_IMG}</a><!-- ENDIF --> {messagerow.ATTACH_ICON_IMG}<br />
-						<!-- IF S_SHOW_RECIPIENTS -->{L_MESSAGE_TO} {messagerow.RECIPIENTS}<!-- ELSE -->{L_MESSAGE_BY_AUTHOR} {messagerow.MESSAGE_AUTHOR_FULL} {L_MESSAGE_SENT_ON} {messagerow.SENT_TIME}<!-- ENDIF -->
+						<!-- IF S_SHOW_RECIPIENTS -->{L_MESSAGE_TO} {messagerow.RECIPIENTS}<!-- ELSE -->{L_MESSAGE_BY_AUTHOR} {messagerow.MESSAGE_AUTHOR_FULL} &raquo; {messagerow.SENT_TIME}<!-- ENDIF -->
 					</dt>
-					<!-- IF S_SHOW_RECIPIENTS --><dd class="info"><span>{L_SENT_AT} {messagerow.SENT_TIME}</span></dd><!-- ENDIF -->
+					<!-- IF S_SHOW_RECIPIENTS --><dd class="info"><span>{L_SENT_AT}: {messagerow.SENT_TIME}</span></dd><!-- ENDIF -->
 					<!-- IF S_UNREAD --><dd class="info"><!-- IF messagerow.FOLDER --><a href="{messagerow.U_FOLDER}">{messagerow.FOLDER}</a><!-- ELSE -->{L_UNKNOWN_FOLDER}<!-- ENDIF --></dd><!-- ENDIF -->
 					<dd class="mark"><input type="checkbox" name="marked_msg_id[]" value="{messagerow.MESSAGE_ID}" /></dd>
 				</dl>
 			</li>
 		<!-- END messagerow -->
-	
+
 		</ul>
 	<!-- ELSE -->
 		<p><strong>{L_NO_MESSAGES}</strong></p>
 	<!-- ENDIF -->
-	
+
 	<!-- IF FOLDER_CUR_MESSAGES neq 0 -->
 	<fieldset class="display-actions">
 		<div class="left-box"><label for="export_option">{L_EXPORT_FOLDER}: <select name="export_option" id="export_option"><option value="CSV">{L_EXPORT_AS_CSV}</option><option value="CSV_EXCEL">{L_EXPORT_AS_CSV_EXCEL}</option><option value="XML">{L_EXPORT_AS_XML}</option></select></label> <input class="button2" type="submit" name="submit_export" value="{L_GO}" /><br /></div>
 		<select name="mark_option">{S_MARK_OPTIONS}{S_MOVE_MARKED_OPTIONS}</select> <input class="button2" type="submit" name="submit_mark" value="{L_GO}" />
-		<div><a href="#" onclick="marklist('viewfolder', 'marked_msg', true); return false;">{L_MARK_ALL}</a> &bull; <a href="#" onclick="marklist('viewfolder', 'marked_msg', false); return false;">{L_UNMARK_ALL}</a></div>			
+		<div><a href="#" onclick="marklist('viewfolder', 'marked_msg', true); return false;">{L_MARK_ALL}</a> &bull; <a href="#" onclick="marklist('viewfolder', 'marked_msg', false); return false;">{L_UNMARK_ALL}</a></div>
 	</fieldset>
 
 	<hr />
-	
+
 	<ul class="linklist">
 		<!-- IF TOTAL_MESSAGES or S_VIEW_MESSAGE -->
 		<li class="rightside pagination">
@@ -104,16 +104,16 @@
 		<!-- ENDIF -->
 	</ul>
 	<!-- ENDIF -->
-	
-		<span class="corners-bottom"><span></span></span></div>	
+
+		<span class="corners-bottom"><span></span></span></div>
 	</div>
 
 	<!-- IF FOLDER_CUR_MESSAGES neq 0 -->
 	<fieldset class="display-options">
 		<!-- IF PREVIOUS_PAGE --><a href="{PREVIOUS_PAGE}" class="left-box {S_CONTENT_FLOW_BEGIN}">{L_PREVIOUS}</a><!-- ENDIF -->
 		<!-- IF NEXT_PAGE --><a href="{NEXT_PAGE}" class="right-box {S_CONTENT_FLOW_END}">{L_NEXT}</a><!-- ENDIF -->
-		<label>{L_DISPLAY}: {S_SELECT_SORT_DAYS}</label> 
-		<label>{L_SORT_BY} {S_SELECT_SORT_KEY}</label> 
+		<label>{L_DISPLAY}: {S_SELECT_SORT_DAYS}</label>
+		<label>{L_SORT_BY} {S_SELECT_SORT_KEY}</label>
 		<label>{S_SELECT_SORT_DIR} <input type="submit" name="sort" value="{L_GO}" class="button2" /></label>
 		<input type="hidden" name="cur_folder_id" value="{CUR_FOLDER_ID}" />
 	</fieldset>
diff -x .svn -aruN 3.0.3.src/styles/prosilver/template/viewforum_body.html 3.0.4.src/styles/prosilver/template/viewforum_body.html
--- 3.0.3.src/styles/prosilver/template/viewforum_body.html	2008-12-09 13:18:39.000000000 -0600
+++ 3.0.4.src/styles/prosilver/template/viewforum_body.html	2008-12-15 09:05:32.000000000 -0600
@@ -142,12 +142,12 @@
 					<!-- IF topicrow.S_TOPIC_UNAPPROVED or topicrow.S_POSTS_UNAPPROVED --><a href="{topicrow.U_MCP_QUEUE}">{topicrow.UNAPPROVED_IMG}</a> <!-- ENDIF -->
 					<!-- IF topicrow.S_TOPIC_REPORTED --><a href="{topicrow.U_MCP_REPORT}">{REPORTED_IMG}</a><!-- ENDIF --><br />
 					<!-- IF topicrow.PAGINATION --><strong class="pagination"><span>{topicrow.PAGINATION}</span></strong><!-- ENDIF -->
-					<!-- IF topicrow.ATTACH_ICON_IMG -->{topicrow.ATTACH_ICON_IMG} <!-- ENDIF -->{L_POST_BY_AUTHOR} {topicrow.TOPIC_AUTHOR_FULL} {L_POSTED_ON_DATE} {topicrow.FIRST_POST_TIME}
+					<!-- IF topicrow.ATTACH_ICON_IMG -->{topicrow.ATTACH_ICON_IMG} <!-- ENDIF -->{L_POST_BY_AUTHOR} {topicrow.TOPIC_AUTHOR_FULL} &raquo; {topicrow.FIRST_POST_TIME}
 				</dt>
 				<dd class="posts">{topicrow.REPLIES} <dfn>{L_REPLIES}</dfn></dd>
 				<dd class="views">{topicrow.VIEWS} <dfn>{L_VIEWS}</dfn></dd>
 				<dd class="lastpost"><span><dfn>{L_LAST_POST} </dfn>{L_POST_BY_AUTHOR} {topicrow.LAST_POST_AUTHOR_FULL}
-					<!-- IF not S_IS_BOT --><a href="{topicrow.U_LAST_POST}">{LAST_POST_IMG}</a> <!-- ENDIF --><br />{L_POSTED_ON_DATE} {topicrow.LAST_POST_TIME}</span>
+					<!-- IF not S_IS_BOT --><a href="{topicrow.U_LAST_POST}">{LAST_POST_IMG}</a> <!-- ENDIF --><br />{topicrow.LAST_POST_TIME}</span>
 				</dd>
 			</dl>
 		</li>
diff -x .svn -aruN 3.0.3.src/styles/prosilver/template/viewtopic_body.html 3.0.4.src/styles/prosilver/template/viewtopic_body.html
--- 3.0.3.src/styles/prosilver/template/viewtopic_body.html	2008-12-09 13:18:39.000000000 -0600
+++ 3.0.4.src/styles/prosilver/template/viewtopic_body.html	2008-12-15 09:05:32.000000000 -0600
@@ -136,7 +136,7 @@
 		<!-- ENDIF -->
 
 			<h3 <!-- IF postrow.S_FIRST_ROW -->class="first"<!-- ENDIF -->><!-- IF postrow.POST_ICON_IMG --><img src="{T_ICONS_PATH}{postrow.POST_ICON_IMG}" width="{postrow.POST_ICON_IMG_WIDTH}" height="{postrow.POST_ICON_IMG_HEIGHT}" alt="" /> <!-- ENDIF --><a href="#p{postrow.POST_ID}">{postrow.POST_SUBJECT}</a></h3>
-			<p class="author"><!-- IF S_IS_BOT -->{postrow.MINI_POST_IMG}<!-- ELSE --><a href="{postrow.U_MINI_POST}">{postrow.MINI_POST_IMG}</a><!-- ENDIF -->{L_POST_BY_AUTHOR} <strong>{postrow.POST_AUTHOR_FULL}</strong> {L_POSTED_ON_DATE} {postrow.POST_DATE} </p>
+			<p class="author"><!-- IF S_IS_BOT -->{postrow.MINI_POST_IMG}<!-- ELSE --><a href="{postrow.U_MINI_POST}">{postrow.MINI_POST_IMG}</a><!-- ENDIF -->{L_POST_BY_AUTHOR} <strong>{postrow.POST_AUTHOR_FULL}</strong> &raquo; {postrow.POST_DATE} </p>
 
 			<!-- IF postrow.S_POST_UNAPPROVED or postrow.S_POST_REPORTED -->
 				<p class="rules">
diff -x .svn -aruN 3.0.3.src/styles/prosilver/theme/theme.cfg 3.0.4.src/styles/prosilver/theme/theme.cfg
--- 3.0.3.src/styles/prosilver/theme/theme.cfg	2008-12-09 13:18:39.000000000 -0600
+++ 3.0.4.src/styles/prosilver/theme/theme.cfg	2008-12-15 09:05:32.000000000 -0600
@@ -21,7 +21,7 @@
 # General Information about this theme
 name = prosilver
 copyright = &copy; phpBB Group, 2007
-version = 3.0.3
+version = 3.0.4
 
 # Some configuration options
 
diff -x .svn -aruN 3.0.3.src/styles/subsilver2/imageset/imageset.cfg 3.0.4.src/styles/subsilver2/imageset/imageset.cfg
--- 3.0.3.src/styles/subsilver2/imageset/imageset.cfg	2008-12-09 13:18:39.000000000 -0600
+++ 3.0.4.src/styles/subsilver2/imageset/imageset.cfg	2008-12-15 09:05:32.000000000 -0600
@@ -19,7 +19,7 @@
 # General Information about this style
 name = subsilver2
 copyright = &copy; phpBB Group, 2003
-version = 3.0.3
+version = 3.0.4
 
 # Images 
 img_site_logo = site_logo.gif*94*170
diff -x .svn -aruN 3.0.3.src/styles/subsilver2/style.cfg 3.0.4.src/styles/subsilver2/style.cfg
--- 3.0.3.src/styles/subsilver2/style.cfg	2008-12-09 13:18:39.000000000 -0600
+++ 3.0.4.src/styles/subsilver2/style.cfg	2008-12-15 09:05:32.000000000 -0600
@@ -19,4 +19,4 @@
 # General Information about this style
 name = subsilver2
 copyright = &copy; 2005 phpBB Group
-version = 3.0.3
+version = 3.0.4
diff -x .svn -aruN 3.0.3.src/styles/subsilver2/template/template.cfg 3.0.4.src/styles/subsilver2/template/template.cfg
--- 3.0.3.src/styles/subsilver2/template/template.cfg	2008-12-09 13:18:39.000000000 -0600
+++ 3.0.4.src/styles/subsilver2/template/template.cfg	2008-12-15 09:05:32.000000000 -0600
@@ -19,5 +19,5 @@
 # General Information about this template
 name = subsilver2
 copyright = &copy; phpBB Group, 2003
-version = 3.0.3
+version = 3.0.4
 
diff -x .svn -aruN 3.0.3.src/styles/subsilver2/theme/theme.cfg 3.0.4.src/styles/subsilver2/theme/theme.cfg
--- 3.0.3.src/styles/subsilver2/theme/theme.cfg	2008-12-09 13:18:39.000000000 -0600
+++ 3.0.4.src/styles/subsilver2/theme/theme.cfg	2008-12-15 09:05:32.000000000 -0600
@@ -21,7 +21,7 @@
 # General Information about this theme
 name = subsilver2
 copyright = &copy; phpBB Group, 2003
-version = 3.0.3
+version = 3.0.4
 
 # Some configuration options
 
diff -x .svn -aruN 3.0.3.src/viewtopic.php 3.0.4.src/viewtopic.php
--- 3.0.3.src/viewtopic.php	2008-12-09 13:18:40.000000000 -0600
+++ 3.0.4.src/viewtopic.php	2008-12-15 09:05:33.000000000 -0600
@@ -2,7 +2,7 @@
 /**
 *
 * @package phpBB3
-* @version $Id: viewtopic.php 9022 2008-10-16 19:03:02Z toonarmy $
+* @version $Id: viewtopic.php 9138 2008-11-30 16:53:36Z acydburn $
 * @copyright (c) 2005 phpBB Group
 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
 *
@@ -1047,7 +1047,7 @@
 				'allow_pm'			=> 0,
 			);
 
-			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']);
+			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']);
 		}
 		else
 		{
@@ -1348,7 +1348,7 @@
 				$display_username = get_username_string('full', $row['post_edit_user'], $post_edit_list[$row['post_edit_user']]['username'], $post_edit_list[$row['post_edit_user']]['user_colour']);
 			}
 
-			$l_edited_by = sprintf($l_edit_time_total, $display_username, $user->format_date($row['post_edit_time']), $row['post_edit_count']);
+			$l_edited_by = sprintf($l_edit_time_total, $display_username, $user->format_date($row['post_edit_time'], false, true), $row['post_edit_count']);
 		}
 		else
 		{
@@ -1367,7 +1367,7 @@
 				$display_username = get_username_string('full', $row['post_edit_user'], $user_cache[$row['post_edit_user']]['username'], $user_cache[$row['post_edit_user']]['user_colour']);
 			}
 
-			$l_edited_by = sprintf($l_edit_time_total, $display_username, $user->format_date($row['post_edit_time']), $row['post_edit_count']);
+			$l_edited_by = sprintf($l_edit_time_total, $display_username, $user->format_date($row['post_edit_time'], false, true), $row['post_edit_count']);
 		}
 	}
 	else
