diff -x .svn -aruN 3.0.7-PL1.src/adm/index.php 3.0.8.src/adm/index.php
--- 3.0.7-PL1.src/adm/index.php	2010-03-05 14:36:57.000000000 -0600
+++ 3.0.8.src/adm/index.php	2010-11-19 06:22:12.000000000 -0600
@@ -432,6 +432,20 @@
 				{
 					$error[] = sprintf($user->lang['SETTING_TOO_BIG'], $user->lang[$config_definition['lang']], $validator[$max]);
 				}
+
+				if (strpos($config_name, '_max') !== false)
+				{
+					// Min/max pairs of settings should ensure that min <= max
+					// Replace _max with _min to find the name of the minimum
+					// corresponding configuration variable
+					$min_name = str_replace('_max', '_min', $config_name);
+
+					if (isset($cfg_array[$min_name]) && is_numeric($cfg_array[$min_name]) && $cfg_array[$config_name] < $cfg_array[$min_name])
+					{
+						// A minimum value exists and the maximum value is less than it
+						$error[] = sprintf($user->lang['SETTING_TOO_LOW'], $user->lang[$config_definition['lang']], (int) $cfg_array[$min_name]);
+					}
+				}
 			break;
 
 			// Absolute path
@@ -533,7 +547,7 @@
 				// Check if the path is writable
 				if ($config_definition['validate'] == 'wpath' || $config_definition['validate'] == 'rwpath')
 				{
-					if (file_exists($phpbb_root_path . $cfg_array[$config_name]) && !@is_writable($phpbb_root_path . $cfg_array[$config_name]))
+					if (file_exists($phpbb_root_path . $cfg_array[$config_name]) && !phpbb_is_writable($phpbb_root_path . $cfg_array[$config_name]))
 					{
 						$error[] = sprintf($user->lang['DIRECTORY_NOT_WRITABLE'], $cfg_array[$config_name]);
 					}
diff -x .svn -aruN 3.0.7-PL1.src/adm/style/acp_ban.html 3.0.8.src/adm/style/acp_ban.html
--- 3.0.7-PL1.src/adm/style/acp_ban.html	2010-03-05 14:36:57.000000000 -0600
+++ 3.0.8.src/adm/style/acp_ban.html	2010-11-19 06:22:12.000000000 -0600
@@ -31,9 +31,9 @@
 
 	function display_details(option)
 	{
-		document.getElementById('acp_unban').unbangivereason.value = ban_give_reason[option];
-		document.getElementById('acp_unban').unbanreason.value = ban_reason[option];
-		document.getElementById('acp_unban').unbanlength.value = ban_length[option];
+		document.getElementById('acp_unban').unbangivereason.innerHTML = ban_give_reason[option];
+		document.getElementById('acp_unban').unbanreason.innerHTML = ban_reason[option];
+		document.getElementById('acp_unban').unbanlength.innerHTML = ban_length[option];
 	}
 
 // ]]>
diff -x .svn -aruN 3.0.7-PL1.src/adm/style/acp_forums.html 3.0.8.src/adm/style/acp_forums.html
--- 3.0.7-PL1.src/adm/style/acp_forums.html	2010-03-05 14:36:57.000000000 -0600
+++ 3.0.8.src/adm/style/acp_forums.html	2010-11-19 06:22:12.000000000 -0600
@@ -189,8 +189,8 @@
 			<legend>{L_GENERAL_FORUM_SETTINGS}</legend>
 		<dl>
 			<dt><label for="display_active">{L_DISPLAY_ACTIVE_TOPICS}:</label><br /><span>{L_DISPLAY_ACTIVE_TOPICS_EXPLAIN}</span></dt>
-			<dd><label><input type="radio" class="radio" name="display_active" value="1"<!-- IF S_DISPLAY_ACTIVE_TOPICS --> id="display_active" checked="checked"<!-- ENDIF --> /> {L_YES}</label>
-				<label><input type="radio" class="radio" name="display_active" value="0"<!-- IF not S_DISPLAY_ACTIVE_TOPICS --> id="display_active" checked="checked"<!-- ENDIF --> /> {L_NO}</label></dd>
+			<dd><label><input type="radio" class="radio" name="display_active" value="1"<!-- IF S_ENABLE_ACTIVE_TOPICS --> id="display_active" checked="checked"<!-- ENDIF --> /> {L_YES}</label>
+				<label><input type="radio" class="radio" name="display_active" value="0"<!-- IF not S_ENABLE_ACTIVE_TOPICS --> id="display_active" checked="checked"<!-- ENDIF --> /> {L_NO}</label></dd>
 		</dl>
 		</fieldset>
 	</div>
diff -x .svn -aruN 3.0.7-PL1.src/adm/style/acp_update.html 3.0.8.src/adm/style/acp_update.html
--- 3.0.7-PL1.src/adm/style/acp_update.html	2010-03-05 14:36:57.000000000 -0600
+++ 3.0.8.src/adm/style/acp_update.html	2010-11-19 06:22:12.000000000 -0600
@@ -18,6 +18,12 @@
 		</div>
 	<!-- ENDIF -->
 
+	<!-- IF NEXT_FEATURE_VERSION -->
+		<div class="errorbox">
+			<p>{UPGRADE_INSTRUCTIONS}</p>
+		</div>
+	<!-- ENDIF -->
+
 	<fieldset>
 		<legend></legend>
 	<dl>
diff -x .svn -aruN 3.0.7-PL1.src/adm/style/acp_users_overview.html 3.0.8.src/adm/style/acp_users_overview.html
--- 3.0.7-PL1.src/adm/style/acp_users_overview.html	2010-03-05 14:36:57.000000000 -0600
+++ 3.0.8.src/adm/style/acp_users_overview.html	2010-11-19 06:22:12.000000000 -0600
@@ -140,7 +140,7 @@
 		<legend>{L_DELETE_USER}</legend>
 		<dl>
 			<dt><label for="delete_type">{L_DELETE_USER}:</label><br /><span>{L_DELETE_USER_EXPLAIN}</span></dt>
-			<dd><select id="delete_type" name="delete_type"><option value="retain">{L_RETAIN_POSTS}</option><option value="remove">{L_DELETE_POSTS}</option></select></dd>
+			<dd><select id="delete_type" name="delete_type"><option class="sep" value="">{L_SELECT_OPTION}</option><option value="retain">{L_RETAIN_POSTS}</option><option value="remove">{L_DELETE_POSTS}</option></select></dd>
 		</dl>
 		<p class="quick">
 			<input class="button1" type="submit" name="update" value="{L_SUBMIT}" />
@@ -148,6 +148,6 @@
 			{S_FORM_TOKEN}
 		</p>
 	</fieldset>
-	<!-- ENDIF -->
 	</form>
+	<!-- ENDIF -->
 <!-- ENDIF -->
diff -x .svn -aruN 3.0.7-PL1.src/adm/style/acp_users_signature.html 3.0.8.src/adm/style/acp_users_signature.html
--- 3.0.7-PL1.src/adm/style/acp_users_signature.html	2010-03-05 14:36:57.000000000 -0600
+++ 3.0.8.src/adm/style/acp_users_signature.html	2010-11-19 06:22:12.000000000 -0600
@@ -56,7 +56,7 @@
 			<input type="button" class="button2" accesskey="c" name="addbbcode8" value="Code" style="width: 40px" onclick="bbstyle(8)" onmouseover="helpline('c')" onmouseout="helpline('tip')" />
 			<input type="button" class="button2" accesskey="l" name="addbbcode10" value="List" style="width: 40px" onclick="bbstyle(10)" onmouseover="helpline('l')" onmouseout="helpline('tip')" />
 			<input type="button" class="button2" accesskey="o" name="addbbcode12" value="List=" style="width: 40px" onclick="bbstyle(12)" onmouseover="helpline('o')" onmouseout="helpline('tip')" />
-			<input type="button" class="button2" accesskey="t" name="addlitsitem" value="[*]" style="width: 40px" onclick="bbstyle(-1)" onmouseover="helpline('e')" onmouseout="helpline('tip')" />
+			<input type="button" class="button2" accesskey="y" name="addlitsitem" value="[*]" style="width: 40px" onclick="bbstyle(-1)" onmouseover="helpline('e')" onmouseout="helpline('tip')" />
 			<!-- IF S_BBCODE_IMG -->
 				<input type="button" class="button2" accesskey="p" name="addbbcode14" value="Img" style="width: 40px" onclick="bbstyle(14)" onmouseover="helpline('p')" onmouseout="helpline('tip')" />
 			<!-- ENDIF -->
@@ -93,8 +93,8 @@
 				// ]]>
 				</script>
 			</dt>
-			<dd style="margin-left: 90px;"><textarea name="signature" rows="10" cols="60" style="width: 95%;" onselect="storeCaret(this);" onclick="storeCaret(this);" onkeyup="storeCaret(this);" onfocus="initInsertions();">{SIGNATURE}</textarea></dd>
-			<dd style="margin-left: 90px; margin-top: 5px;">
+			<dd style="margin-{S_CONTENT_FLOW_BEGIN}: 90px;"><textarea name="signature" rows="10" cols="60" style="width: 95%;" onselect="storeCaret(this);" onclick="storeCaret(this);" onkeyup="storeCaret(this);" onfocus="initInsertions();">{SIGNATURE}</textarea></dd>
+			<dd style="margin-{S_CONTENT_FLOW_BEGIN}: 90px; margin-top: 5px;">
 			<!-- IF S_BBCODE_ALLOWED -->
 				<label><input type="checkbox" class="radio" name="disable_bbcode"{S_BBCODE_CHECKED} /> {L_DISABLE_BBCODE}</label>
 			<!-- ENDIF -->
@@ -105,7 +105,7 @@
 				<label><input type="checkbox" class="radio" name="disable_magic_url"{S_MAGIC_URL_CHECKED} /> {L_DISABLE_MAGIC_URL}</label>
 			<!-- ENDIF -->
 			</dd>
-			<dd style="margin-left: 90px; margin-top: 10px;"><strong>{L_OPTIONS}: </strong>{BBCODE_STATUS} :: {IMG_STATUS} :: {FLASH_STATUS} :: {URL_STATUS} :: {SMILIES_STATUS}</dd>
+			<dd style="margin-{S_CONTENT_FLOW_BEGIN}: 90px; margin-top: 10px;"><strong>{L_OPTIONS}: </strong>{BBCODE_STATUS} :: {IMG_STATUS} :: {FLASH_STATUS} :: {URL_STATUS} :: {SMILIES_STATUS}</dd>
 		</dl>
 	</fieldset>
 
diff -x .svn -aruN 3.0.7-PL1.src/adm/style/admin.css 3.0.8.src/adm/style/admin.css
--- 3.0.7-PL1.src/adm/style/admin.css	2010-03-05 14:36:57.000000000 -0600
+++ 3.0.8.src/adm/style/admin.css	2010-11-19 06:22:12.000000000 -0600
@@ -670,14 +670,10 @@
 	position: relative;
 	text-transform: none;
 	line-height: 1.2em;
-	top: 0;
+	top: -.2em;
 	vertical-align: middle;
 }
 
-/* Hide from macIE \*/
-legend { top: -1.2em; }
-/* end */
-
 * html legend {
 	margin: 0 0 -10px -7px;
 	line-height: 1em;
diff -x .svn -aruN 3.0.7-PL1.src/adm/style/captcha_recaptcha.html 3.0.8.src/adm/style/captcha_recaptcha.html
--- 3.0.7-PL1.src/adm/style/captcha_recaptcha.html	2010-03-05 14:36:57.000000000 -0600
+++ 3.0.8.src/adm/style/captcha_recaptcha.html	2010-11-19 06:22:12.000000000 -0600
@@ -4,7 +4,8 @@
 		<script type="text/javascript">
 		// <![CDATA[
 		var RecaptchaOptions = {
-			lang : '{LA_RECAPTCHA_LANG}'
+			lang : '{LA_RECAPTCHA_LANG}',
+			theme : 'clean',
 		};
 		// ]]>
 		</script>
diff -x .svn -aruN 3.0.7-PL1.src/adm/style/editor.js 3.0.8.src/adm/style/editor.js
--- 3.0.7-PL1.src/adm/style/editor.js	2010-03-05 14:36:57.000000000 -0600
+++ 3.0.8.src/adm/style/editor.js	2010-11-19 06:22:12.000000000 -0600
@@ -46,7 +46,11 @@
 	{
 		textarea.focus();
 		baseHeight = doc.selection.createRange().duplicate().boundingHeight;
-		// document.body.focus();
+
+		if (!document.forms[form_name])
+		{
+			document.body.focus();
+		}
 	}
 }
 
@@ -152,7 +156,7 @@
 		var sel_start = textarea.selectionStart;
 		var sel_end = textarea.selectionEnd;
 
-		mozWrap(textarea, text, '')
+		mozWrap(textarea, text, '');
 		textarea.selectionStart = sel_start + text.length;
 		textarea.selectionEnd = sel_end + text.length;
 	}	
@@ -230,6 +234,7 @@
 			theSelection = theSelection.replace(/&lt\;/ig, '<');
 			theSelection = theSelection.replace(/&gt\;/ig, '>');
 			theSelection = theSelection.replace(/&amp\;/ig, '&');			
+			theSelection = theSelection.replace(/&nbsp\;/ig, ' ');
 		}
 		else if (document.all)
 		{
@@ -269,12 +274,12 @@
 	}
 
 	var s1 = (txtarea.value).substring(0,selStart);
-	var s2 = (txtarea.value).substring(selStart, selEnd)
+	var s2 = (txtarea.value).substring(selStart, selEnd);
 	var s3 = (txtarea.value).substring(selEnd, selLength);
 
 	txtarea.value = s1 + open + s2 + close + s3;
-	txtarea.selectionStart = selEnd + open.length + close.length;
-	txtarea.selectionEnd = txtarea.selectionStart;
+	txtarea.selectionStart = selStart + open.length;
+	txtarea.selectionEnd = selEnd + open.length;
 	txtarea.focus();
 	txtarea.scrollTop = scrollTop;
 
@@ -327,8 +332,8 @@
 			for (b = 0; b < 5; b++)
 			{
 				color = String(numberList[r]) + String(numberList[g]) + String(numberList[b]);
-				document.write('<td bgcolor="#' + color + '">');
-				document.write('<a href="#" onclick="bbfontstyle(\'[color=#' + color + ']\', \'[/color]\'); return false;" onmouseover="helpline(\'s\');"  onmouseout="helpline(\'tip\');"><img src="images/spacer.gif" width="' + width + '" height="' + height + '" alt="#' + color + '" title="#' + color + '" /></a>');
+				document.write('<td bgcolor="#' + color + '" style="width: ' + width + 'px; height: ' + height + 'px;">');
+				document.write('<a href="#" onclick="bbfontstyle(\'[color=#' + color + ']\', \'[/color]\'); return false;"><img src="images/spacer.gif" width="' + width + '" height="' + height + '" alt="#' + color + '" title="#' + color + '" /></a>');
 				document.writeln('</td>');
 			}
 
diff -x .svn -aruN 3.0.7-PL1.src/adm/style/install_update.html 3.0.8.src/adm/style/install_update.html
--- 3.0.7-PL1.src/adm/style/install_update.html	2010-03-05 14:36:57.000000000 -0600
+++ 3.0.8.src/adm/style/install_update.html	2010-11-19 06:22:12.000000000 -0600
@@ -200,7 +200,7 @@
 				<legend><img src="{T_IMAGE_PATH}file_up_to_date.gif" alt="{L_STATUS_UP_TO_DATE}" /></legend>
 			<!-- BEGIN up_to_date -->
 				<dl>
-					<dd class="full" style="text-align: left;"><strong>{up_to_date.FILENAME}</strong></dd>
+					<dd class="full" style="text-align: {S_CONTENT_FLOW_BEGIN};"><strong>{up_to_date.FILENAME}</strong></dd>
 				</dl>
 			<!-- END up_to_date -->
 			</fieldset>
@@ -218,11 +218,11 @@
 					<dt style="width: 60%;"><strong><!-- IF new.DIR_PART -->{new.DIR_PART}<br /><!-- ENDIF -->{new.FILE_PART}</strong>
 					<!-- IF new.S_CUSTOM --><br /><span><em>{L_FILE_USED}: </em>{new.CUSTOM_ORIGINAL}</span><!-- ENDIF -->
 				</dt>
-				<dd style="margin-left: 60%;">
+				<dd style="margin-{S_CONTENT_FLOW_BEGIN}: 60%;">
 					<!-- IF not new.S_BINARY -->[<a href="{new.U_SHOW_DIFF}" onclick="diff_popup(this.href); return false;">{new.L_SHOW_DIFF}</a>]<!-- ELSE -->{L_BINARY_FILE}<!-- ENDIF -->
 				</dd>
 				<!-- IF new.S_CUSTOM -->
-					<dd style="margin-left: 60%;"><label><input type="checkbox" name="no_update[]" value="{new.FILENAME}" class="radio" /> {L_DO_NOT_UPDATE}</label></dd>
+					<dd style="margin-{S_CONTENT_FLOW_BEGIN}: 60%;"><label><input type="checkbox" name="no_update[]" value="{new.FILENAME}" class="radio" /> {L_DO_NOT_UPDATE}</label></dd>
 				<!-- ENDIF -->
 				</dl>
 			<!-- END new -->
@@ -242,9 +242,9 @@
 					<dt style="width: 60%;"><strong><!-- IF not_modified.DIR_PART -->{not_modified.DIR_PART}<br /><!-- ENDIF -->{not_modified.FILE_PART}</strong>
 						<!-- IF not_modified.S_CUSTOM --><br /><span><em>{L_FILE_USED}: </em>{not_modified.CUSTOM_ORIGINAL}</span><!-- ENDIF -->
 					</dt>
-					<dd style="margin-left: 60%;"><!-- IF not not_modified.S_BINARY -->[<a href="{not_modified.U_SHOW_DIFF}" onclick="diff_popup(this.href); return false;">{not_modified.L_SHOW_DIFF}</a>]<!-- ELSE -->{L_BINARY_FILE}<!-- ENDIF --></dd>
+					<dd style="margin-{S_CONTENT_FLOW_BEGIN}: 60%;"><!-- IF not not_modified.S_BINARY -->[<a href="{not_modified.U_SHOW_DIFF}" onclick="diff_popup(this.href); return false;">{not_modified.L_SHOW_DIFF}</a>]<!-- ELSE -->{L_BINARY_FILE}<!-- ENDIF --></dd>
 					<!-- IF not_modified.S_CUSTOM -->
-						<dd style="margin-left: 60%;"><label><input type="checkbox" name="no_update[]" value="{not_modified.FILENAME}" class="radio" /> {L_DO_NOT_UPDATE}</label></dd>
+						<dd style="margin-{S_CONTENT_FLOW_BEGIN}: 60%;"><label><input type="checkbox" name="no_update[]" value="{not_modified.FILENAME}" class="radio" /> {L_DO_NOT_UPDATE}</label></dd>
 					<!-- ENDIF -->
 				</dl>
 			<!-- END not_modified -->
@@ -263,22 +263,22 @@
 					<dt style="width: 60%;"><strong><!-- IF modified.DIR_PART -->{modified.DIR_PART}<br /><!-- ENDIF -->{modified.FILE_PART}</strong>
 					<!-- IF modified.S_CUSTOM --><br /><span><em>{L_FILE_USED}: </em>{modified.CUSTOM_ORIGINAL}</span><!-- ENDIF -->
 				</dt>
-				<dd style="margin-left: 60%;">&nbsp;</dd>
+				<dd style="margin-{S_CONTENT_FLOW_BEGIN}: 60%;">&nbsp;</dd>
 				<!-- IF modified.S_CUSTOM -->
-					<dd style="margin-left: 60%;"><label><input type="checkbox" name="no_update[]" value="{modified.FILENAME}" class="radio" /> {L_DO_NOT_UPDATE}</label></dd>
+					<dd style="margin-{S_CONTENT_FLOW_BEGIN}: 60%;"><label><input type="checkbox" name="no_update[]" value="{modified.FILENAME}" class="radio" /> {L_DO_NOT_UPDATE}</label></dd>
 				<!-- ENDIF -->
 				</dl>
 				<dl>
 					<dt style="width: 60%"><label><input type="radio" class="radio" name="modified[{modified.FILENAME}]" value="0" checked="checked" /> {L_MERGE_MODIFICATIONS_OPTION}</label></dt>
-					<dd style="margin-left: 60%;"><!-- IF not modified.S_BINARY -->[<a href="{modified.U_SHOW_DIFF}" onclick="diff_popup(this.href); return false;">{modified.L_SHOW_DIFF}</a>]<!-- ELSE -->{L_BINARY_FILE}<!-- ENDIF --></dd>
+					<dd style="margin-{S_CONTENT_FLOW_BEGIN}: 60%;"><!-- IF not modified.S_BINARY -->[<a href="{modified.U_SHOW_DIFF}" onclick="diff_popup(this.href); return false;">{modified.L_SHOW_DIFF}</a>]<!-- ELSE -->{L_BINARY_FILE}<!-- ENDIF --></dd>
 				</dl>
 				<dl>
 					<dt style="width: 60%"><label><input type="radio" class="radio" name="modified[{modified.FILENAME}]" value="1" /> {L_MERGE_NO_MERGE_NEW_OPTION}</label></dt>
-					<dd style="margin-left: 60%;"><!-- IF not modified.S_BINARY -->[<a href="{modified.U_VIEW_NO_MERGE_NEW}" onclick="diff_popup(this.href); return false;">{L_SHOW_DIFF_FINAL}</a>]<!-- ELSE -->&nbsp;<!-- ENDIF --></dd>
+					<dd style="margin-{S_CONTENT_FLOW_BEGIN}: 60%;"><!-- IF not modified.S_BINARY -->[<a href="{modified.U_VIEW_NO_MERGE_NEW}" onclick="diff_popup(this.href); return false;">{L_SHOW_DIFF_FINAL}</a>]<!-- ELSE -->&nbsp;<!-- ENDIF --></dd>
 				</dl>
 				<dl>
 					<dt style="width: 60%"><label><input type="radio" class="radio" name="modified[{modified.FILENAME}]" value="2" /> {L_MERGE_NO_MERGE_MOD_OPTION}</label></dt>
-					<dd style="margin-left: 60%;"><!-- IF not modified.S_BINARY -->[<a href="{modified.U_VIEW_NO_MERGE_MOD}" onclick="diff_popup(this.href); return false;">{L_SHOW_DIFF_FINAL}</a>]<!-- ELSE -->&nbsp;<!-- ENDIF --></dd>
+					<dd style="margin-{S_CONTENT_FLOW_BEGIN}: 60%;"><!-- IF not modified.S_BINARY -->[<a href="{modified.U_VIEW_NO_MERGE_MOD}" onclick="diff_popup(this.href); return false;">{L_SHOW_DIFF_FINAL}</a>]<!-- ELSE -->&nbsp;<!-- ENDIF --></dd>
 				</dl>
 			</fieldset>
 			<!-- END modified -->
@@ -296,11 +296,11 @@
 					<dt style="width: 60%;"><strong><!-- IF new_conflict.DIR_PART -->{new_conflict.DIR_PART}<br /><!-- ENDIF -->{new_conflict.FILE_PART}</strong>
 					<!-- IF new_conflict.S_CUSTOM --><br /><span><em>{L_FILE_USED}: </em>{new_conflict.CUSTOM_ORIGINAL}</span><!-- ENDIF -->
 				</dt>
-				<dd style="margin-left: 60%;">
+				<dd style="margin-{S_CONTENT_FLOW_BEGIN}: 60%;">
 					<!-- IF not new_conflict.S_BINARY -->[<a href="{new_conflict.U_SHOW_DIFF}" onclick="diff_popup(this.href); return false;">{new_conflict.L_SHOW_DIFF}</a>]<!-- ELSE -->{L_BINARY_FILE}<!-- ENDIF -->
 				</dd>
 				<!-- IF new_conflict.S_CUSTOM -->
-					<dd style="margin-left: 60%;"><label><input type="checkbox" name="no_update[]" value="{new_conflict.FILENAME}" class="radio" /> {L_DO_NOT_UPDATE}</label></dd>
+					<dd style="margin-{S_CONTENT_FLOW_BEGIN}: 60%;"><label><input type="checkbox" name="no_update[]" value="{new_conflict.FILENAME}" class="radio" /> {L_DO_NOT_UPDATE}</label></dd>
 				<!-- ENDIF -->
 				</dl>
 			<!-- END new_conflict -->
@@ -320,35 +320,35 @@
 						<!-- IF conflict.S_CUSTOM --><br /><span><em>{L_FILE_USED}: </em>{conflict.CUSTOM_ORIGINAL}</span><!-- ENDIF -->
 						<!-- IF conflict.NUM_CONFLICTS --><br /><span>{L_NUM_CONFLICTS}: {conflict.NUM_CONFLICTS}</span><!-- ENDIF -->
 					</dt>
-					<dd style="margin-left: 60%;">
+					<dd style="margin-{S_CONTENT_FLOW_BEGIN}: 60%;">
 						<!-- IF not conflict.S_BINARY -->[<a href="{conflict.U_SHOW_DIFF}">{L_DOWNLOAD_CONFLICTS}</a>]<br />{L_DOWNLOAD_CONFLICTS_EXPLAIN}
 						<!-- ELSE -->{L_BINARY_FILE}<!-- ENDIF -->
 					</dd>
 					<!-- IF conflict.S_CUSTOM -->
-						<dd style="margin-left: 60%;"><label><input type="checkbox" name="no_update[]" value="{conflict.FILENAME}" class="radio" /> {L_DO_NOT_UPDATE}</label></dd>
+						<dd style="margin-{S_CONTENT_FLOW_BEGIN}: 60%;"><label><input type="checkbox" name="no_update[]" value="{conflict.FILENAME}" class="radio" /> {L_DO_NOT_UPDATE}</label></dd>
 					<!-- ENDIF -->
 				</dl>
 				<!-- IF conflict.S_BINARY -->
 					<dl>
 						<dt style="width: 60%"><label><input type="radio" class="radio" name="conflict[{conflict.FILENAME}]" value="1" checked="checked" /> {L_MERGE_NO_MERGE_NEW_OPTION}</label></dt>
-						<dd style="margin-left: 60%;">&nbsp;</dd>
+						<dd style="margin-{S_CONTENT_FLOW_BEGIN}: 60%;">&nbsp;</dd>
 					</dl>
 				<!-- ELSE -->
 					<dl>
 						<dt style="width: 60%"><label><input type="radio" class="radio" name="conflict[{conflict.FILENAME}]" value="3" checked="checked" /> {L_MERGE_NEW_FILE_OPTION}</label></dt>
-						<dd style="margin-left: 60%;">[<a href="{conflict.U_VIEW_NEW_FILE}" onclick="diff_popup(this.href); return false;">{L_SHOW_DIFF_MODIFIED}</a>]</dd>
+						<dd style="margin-{S_CONTENT_FLOW_BEGIN}: 60%;">[<a href="{conflict.U_VIEW_NEW_FILE}" onclick="diff_popup(this.href); return false;">{L_SHOW_DIFF_MODIFIED}</a>]</dd>
 					</dl>
 					<dl>
 						<dt style="width: 60%"><label><input type="radio" class="radio" name="conflict[{conflict.FILENAME}]" value="4" /> {L_MERGE_MOD_FILE_OPTION}</label></dt>
-						<dd style="margin-left: 60%;">[<a href="{conflict.U_VIEW_MOD_FILE}" onclick="diff_popup(this.href); return false;">{L_SHOW_DIFF_MODIFIED}</a>]</dd>
+						<dd style="margin-{S_CONTENT_FLOW_BEGIN}: 60%;">[<a href="{conflict.U_VIEW_MOD_FILE}" onclick="diff_popup(this.href); return false;">{L_SHOW_DIFF_MODIFIED}</a>]</dd>
 					</dl>
 					<dl>
 						<dt style="width: 60%"><label><input type="radio" class="radio" name="conflict[{conflict.FILENAME}]" value="1" /> {L_MERGE_NO_MERGE_NEW_OPTION}</label></dt>
-						<dd style="margin-left: 60%;">[<a href="{conflict.U_VIEW_NO_MERGE_NEW}" onclick="diff_popup(this.href); return false;">{L_SHOW_DIFF_FINAL}</a>]</dd>
+						<dd style="margin-{S_CONTENT_FLOW_BEGIN}: 60%;">[<a href="{conflict.U_VIEW_NO_MERGE_NEW}" onclick="diff_popup(this.href); return false;">{L_SHOW_DIFF_FINAL}</a>]</dd>
 					</dl>
 					<dl>
 						<dt style="width: 60%"><label><input type="radio" class="radio" name="conflict[{conflict.FILENAME}]" value="2" /> {L_MERGE_NO_MERGE_MOD_OPTION}</label></dt>
-						<dd style="margin-left: 60%;">[<a href="{conflict.U_VIEW_NO_MERGE_MOD}" onclick="diff_popup(this.href); return false;">{L_SHOW_DIFF_FINAL}</a>]</dd>
+						<dd style="margin-{S_CONTENT_FLOW_BEGIN}: 60%;">[<a href="{conflict.U_VIEW_NO_MERGE_MOD}" onclick="diff_popup(this.href); return false;">{L_SHOW_DIFF_FINAL}</a>]</dd>
 					</dl>
 				<!-- ENDIF -->
 			</fieldset>
diff -x .svn -aruN 3.0.7-PL1.src/adm/style/permission_mask.html 3.0.8.src/adm/style/permission_mask.html
--- 3.0.7-PL1.src/adm/style/permission_mask.html	2010-03-05 14:36:57.000000000 -0600
+++ 3.0.8.src/adm/style/permission_mask.html	2010-11-19 06:22:12.000000000 -0600
@@ -40,7 +40,7 @@
 		<dl class="permissions-simple">
 			<dt style="width: 20%"><label for="role{p_mask.S_ROW_COUNT}{p_mask.f_mask.S_ROW_COUNT}">{L_ROLE}:</label></dt>
 			<!-- IF p_mask.f_mask.S_ROLE_OPTIONS -->
-				<dd style="margin-left: 20%"><select id="role{p_mask.S_ROW_COUNT}{p_mask.f_mask.S_ROW_COUNT}" name="role[{p_mask.f_mask.UG_ID}][{p_mask.f_mask.FORUM_ID}]" onchange="set_role_settings(this.options[selectedIndex].value, 'advanced{p_mask.S_ROW_COUNT}{p_mask.f_mask.S_ROW_COUNT}'); init_colours('{p_mask.S_ROW_COUNT}{p_mask.f_mask.S_ROW_COUNT}')">{p_mask.f_mask.S_ROLE_OPTIONS}</select></dd>
+				<dd style="margin-{S_CONTENT_FLOW_BEGIN}: 20%"><select id="role{p_mask.S_ROW_COUNT}{p_mask.f_mask.S_ROW_COUNT}" name="role[{p_mask.f_mask.UG_ID}][{p_mask.f_mask.FORUM_ID}]" onchange="set_role_settings(this.options[selectedIndex].value, 'advanced{p_mask.S_ROW_COUNT}{p_mask.f_mask.S_ROW_COUNT}'); init_colours('{p_mask.S_ROW_COUNT}{p_mask.f_mask.S_ROW_COUNT}')">{p_mask.f_mask.S_ROLE_OPTIONS}</select></dd>
 			<!-- ELSE -->
 				<dd>{L_NO_ROLE_AVAILABLE}</dd>
 			<!-- ENDIF -->
@@ -118,7 +118,7 @@
 			</div>
 			
 			<!-- IF not p_mask.S_VIEW -->
-			<fieldset class="quick" style="margin-right: 11px;">
+			<fieldset class="quick" style="margin-{S_CONTENT_FLOW_END}: 11px;">
 				<p class="small">{L_APPLY_PERMISSIONS_EXPLAIN}</p>
 				<input class="button1" type="submit" name="psubmit[{p_mask.f_mask.UG_ID}][{p_mask.f_mask.FORUM_ID}]" value="{L_APPLY_PERMISSIONS}" />
 				<!-- IF .p_mask.f_mask gt 1 or .p_mask gt 1 -->
diff -x .svn -aruN 3.0.7-PL1.src/common.php 3.0.8.src/common.php
--- 3.0.7-PL1.src/common.php	2010-03-05 14:36:59.000000000 -0600
+++ 3.0.8.src/common.php	2010-11-19 06:22:12.000000000 -0600
@@ -123,13 +123,11 @@
 	$phpbb_root_path = dirname(__FILE__) . DIRECTORY_SEPARATOR;
 }
 
-if (!file_exists($phpbb_root_path . 'config.' . $phpEx))
+if (file_exists($phpbb_root_path . 'config.' . $phpEx))
 {
-	die("<p>The config.$phpEx file could not be found.</p><p><a href=\"{$phpbb_root_path}install/index.$phpEx\">Click here to install phpBB</a></p>");
+	require($phpbb_root_path . 'config.' . $phpEx);
 }
 
-require($phpbb_root_path . 'config.' . $phpEx);
-
 if (!defined('PHPBB_INSTALLED'))
 {
 	// Redirect the user to the installer
diff -x .svn -aruN 3.0.7-PL1.src/docs/auth_api.html 3.0.8.src/docs/auth_api.html
--- 3.0.7-PL1.src/docs/auth_api.html	2010-03-05 14:37:00.000000000 -0600
+++ 3.0.8.src/docs/auth_api.html	2010-11-19 06:22:12.000000000 -0600
@@ -61,6 +61,9 @@
 		<li><a href="#acl_getf">acl_getf</a></li>
 		<li><a href="#acl_getf_global">acl_getf_global</a></li>
 		<li><a href="#acl_cache">acl_cache</a></li>
+		<li><a href="#acl_clear_prefetch">acl_clear_prefetch</a></li>
+		<li><a href="#acl_get_list">acl_get_list</a></li>
+		<li><a href="#misc">Miscellaneous</a></li>
 	</ol>
 	</li>
 	<li><a href="#admin_related">Admin related functions</a></li>
@@ -176,7 +179,7 @@
 	<p>This method is used to find out whether a user has a permission in at least one forum or globally. This method is similar to checking whether <code>acl_getf(option, true)</code> returned one or more forums but it's faster. It should be called in the following way:</p>
 
 	<div class="codebox"><pre>
-$result = acl_getf_global(<code>option</code>)
+$result = $auth-&gt;acl_getf_global(<code>option</code>)
 	</pre></div>
 
 	<p>As with the previous methods option is a string specifying the permission which has to be checked.</p>
@@ -187,6 +190,49 @@
 
 	<p>This should be considered a private method and not be called externally. It handles the generation of the user_permissions data from the basic user and group authorisation data. When necessary this method is called automatically by <code>acl</code>.</p>
 
+	<a name="acl_clear_prefetch"></a><h3>2.vii. acl_clear_prefetch</h3>
+
+	<p>This method clears the user_permissions column in the users table for the given user.  If the user ID passed is zero, the permissions cache is cleared for all users.  This method should be called whenever permissions are set.</p>
+
+	<div class="codebox"><pre>
+// clear stored permissions for user 2
+$user_id = 2;
+$auth->acl_clear_prefetch($user_id);
+</pre></div>
+
+	<p>This method returns void.</p>
+
+	<a name="acl_get_list"></a><h3>2.viii. acl_get_list</h3>
+
+	<p>This method returns an an array describing which users have permissions in given fora.  The resultant array contains an entry for permission that every user has in every forum when no arguments are passed.</p>
+
+	<div class="codebox"><pre>
+$user_id = array(2, 53);
+$permissions = array('f_list', 'f_read');
+$forum_id = array(1, 2, 3);
+$result = $auth-&gt;acl_get_list($user_id, $permissions, $forum_id);
+</pre></div>
+
+	<p>The parameters may be of the following legal types:</p>
+		<ul>
+			<li><strong>$user_id</strong>: <code>false</code>, int, array(int, int, int, ...)</li>
+			<li><strong>$permissions</strong>: <code>false</code>, string, array(string, string, ...)</li>
+			<li><strong>$forum_id</strong>: <code>false</code>, int, array(int, int, int, ...)</li>
+		</ul>
+
+	<a name="misc"></a><h3>2.ix. Miscellaneous</h3>
+
+	<p>There are other methods defined in the auth class which serve mostly as private methods, but are available for use if needed.  Each of them is used to pull data directly from the database tables.  They are:</p>
+		<ul>
+			<li><pre>function acl_group_raw_data($group_id = false, $opts = false, $forum_id = false)</pre></li>
+			<li><pre>function acl_user_raw_data($user_id = false, $opts = false, $forum_id = false)</pre></li>
+			<li><pre>function acl_raw_data_single_user($user_id)</pre></li>
+			<li><pre>function acl_raw_data($user_id = false, $opts = false, $forum_id = false)</pre></li>
+			<li><pre>function acl_role_data($user_type, $role_type, $ug_id = false, $forum_id = false)</pre></li>
+		</ul>
+
+	<p>Of these, <code>acl_raw_data</code> is the most general, but the others will be faster if you need a smaller amount of data.</p>
+
 		</div>
 
 		<div class="back2top"><a href="#wrap" class="top">Back to Top</a></div>
@@ -241,7 +287,7 @@
 <!-- END DOCUMENT -->
 
 	<div id="page-footer">
-		<div class="version"> $Id$ </div>
+		<div class="version">&nbsp;</div>
 	</div>
 </div></div>
 
diff -x .svn -aruN 3.0.7-PL1.src/docs/AUTHORS 3.0.8.src/docs/AUTHORS
--- 3.0.7-PL1.src/docs/AUTHORS	2010-03-05 14:37:00.000000000 -0600
+++ 3.0.8.src/docs/AUTHORS	2010-11-19 06:22:12.000000000 -0600
@@ -26,17 +26,17 @@
                        Acyd Burn (Meik Sievertsen) [Lead 09/2005 - 01/2010]
                        APTX (Marek A. R.)
                        bantu (Andreas Fischer)
-                       DavidMJ (David M.)
                        dhn (Dominik Dröscher)
+                       igorw (Igor Wiedler)
                        kellanved (Henry Sudhof)
+                       nickvergessen (Joas Schilling)
+                       rxu (Ruslan Uzdenov)
                        Terrafrost (Jim Wigginton)
                        ToonArmy (Chris Smith)
 
 Contributions by:      Brainy (Cullen Walsh)
                        leviatan21 (Gabriel Vazquez)
-                       nickvergessen (Joas Schilling)
                        Raimon (Raimon Meuldijk)
-                       rxu (Ruslan Uzdenov)
                        Xore (Robert Hetzler)
 
 
@@ -49,6 +49,7 @@
 
 phpBB Developers:      Ashe (Ludovic Arnaud)       [10/2002 - 11/2003, 06/2006 - 10/2006]
                        BartVB (Bart van Bragt)     [11/2000 - 03/2006]
+                       DavidMJ (David M.)          [12/2005 - 08/2009]
                        GrahamJE (Graham Eames)     [09/2005 - 11/2006]
                        Vic D'Elfant (Vic D'Elfant) [04/2007 - 04/2009]
 
diff -x .svn -aruN 3.0.7-PL1.src/docs/CHANGELOG.html 3.0.8.src/docs/CHANGELOG.html
--- 3.0.7-PL1.src/docs/CHANGELOG.html	2010-03-05 14:37:00.000000000 -0600
+++ 3.0.8.src/docs/CHANGELOG.html	2010-11-19 06:22:12.000000000 -0600
@@ -53,6 +53,7 @@
 <ol>
 	<li><a href="#changelog">Changelog</a>
 	<ol style="list-style-type: lower-roman;">
+		<li><a href="#v307-PL1">Changes since 3.0.7-PL1</a></li>
 		<li><a href="#v307">Changes since 3.0.7</a></li>
 		<li><a href="#v306">Changes since 3.0.6</a></li>
 		<li><a href="#v305">Changes since 3.0.5</a></li>
@@ -88,13 +89,471 @@
 
 		<div class="content">
 
-	<a name="v307"></a><h3>1.i. Changes since 3.0.7</h3>
+	<a name="v307-PL1"></a><h3>1.i. Changes since 3.0.7-PL1</h3>
+<h4>        Security
+</h4>
+<ul>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9903'>PHPBB3-9903</a>] -         Execute javascript in [flash=] BBCode
+</li>
+</ul>
+
+<h4>        Bug
+</h4>
+<ul>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-4923'>PHPBB3-4923</a>] -         compress_tar incorrectly determines type
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-5164'>PHPBB3-5164</a>] -         Honor minimum and maximum password length in generated passwords as much as possible.
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-6726'>PHPBB3-6726</a>] -         Connecting to PostgreSQL using &#39;localhost&#39; doesn&#39;t try to use a TCP connection
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-6747'>PHPBB3-6747</a>] -         word censoring * does not handle space for two or more words
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-7260'>PHPBB3-7260</a>] -         Do not delete polls if one exists and editing user lacks permissions
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-7296'>PHPBB3-7296</a>] -         Style export to tar(.*) does not work
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-7369'>PHPBB3-7369</a>] -         Custom Profile dates display incorrectly
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-7417'>PHPBB3-7417</a>] -         Search keywords field does not initially get focus
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-7538'>PHPBB3-7538</a>] -         Query exceeds maximum value for user_login_attempts
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-7716'>PHPBB3-7716</a>] -         Data too long for column &#39;message_subject&#39;
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-7720'>PHPBB3-7720</a>] -         Fix alternative image-description for unread posts.
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-7782'>PHPBB3-7782</a>] -         Send HTTP 404 if topic, forum or user do not exist
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-7972'>PHPBB3-7972</a>] -         Copied topics are not indexed
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-8169'>PHPBB3-8169</a>] -         Parse CSS Regex accepts invalid code
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-8792'>PHPBB3-8792</a>] -         Misleading error message in auth_ldap.php, function init_ldap()
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-8894'>PHPBB3-8894</a>] -         JavaScript error and visible quote button on topic review if BBCodes disallowed
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-8924'>PHPBB3-8924</a>] -         spelling in admin_welcome_inactive.txt
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-8929'>PHPBB3-8929</a>] -         MS SQL error on view all smilies after 3.0.6 upgrade
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-8935'>PHPBB3-8935</a>] -         able to set minimal avatar size larger than maximum
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-8944'>PHPBB3-8944</a>] -         Error on database update (must specify size of index on MySQL4)
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9012'>PHPBB3-9012</a>] -         Retain original topic title in shadow topic when moving a topic and editing the title.
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9034'>PHPBB3-9034</a>] -         Redirect() fails with directory traversal
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9047'>PHPBB3-9047</a>] -         Active topics and reported posts
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9049'>PHPBB3-9049</a>] -         Password reminder system generates confusable passwords
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9053'>PHPBB3-9053</a>] -         Correctly sort database backup file list by date on database restore page
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9061'>PHPBB3-9061</a>] -         Race condition in queue locking
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9068'>PHPBB3-9068</a>] -         Grammatical Error under Load Settings
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9075'>PHPBB3-9075</a>] -         Missing / bad default values of CPFs result in SQL errors on registration of new users
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9091'>PHPBB3-9091</a>] -         Wrong IP checking for IPv4 addresses mapped into IPv6
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9094'>PHPBB3-9094</a>] -         Hide &quot;Copy permissions&quot; message, when permissions were copied.
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9095'>PHPBB3-9095</a>] -         Misleading setting text for CAPTCHA
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9099'>PHPBB3-9099</a>] -         Missing comma in PASSWORD_EXPLAIN acp language strings
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9101'>PHPBB3-9101</a>] -         Bad text placement for reCAPTCHA description
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9104'>PHPBB3-9104</a>] -         Safari does not display box headers correctly in the ACP.
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9107'>PHPBB3-9107</a>] -         Can&#39;t Set Parent Forum
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9108'>PHPBB3-9108</a>] -         RSS feeds does not work on Postgres
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9112'>PHPBB3-9112</a>] -         Most active forum post count does not respect m_approve permission
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9114'>PHPBB3-9114</a>] -         Recent bug fix for smilies causing problems on older MySQL versions
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9117'>PHPBB3-9117</a>] -         Wrong redirection after login
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9119'>PHPBB3-9119</a>] -         Language selection is disregarded in automatic update
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9120'>PHPBB3-9120</a>] -         Typo fix in a comment in functions.php
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9121'>PHPBB3-9121</a>] -         Forum feed shows posts that are currently on the moderation queue
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9125'>PHPBB3-9125</a>] -         ACP User Overview: Unmatched &lt;/form&gt; tag when viewing own user
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9126'>PHPBB3-9126</a>] -         Invalid redirection after login to forum not in web root
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9132'>PHPBB3-9132</a>] -         Oracle CLOB support is broken, preventing storage of long strings
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9135'>PHPBB3-9135</a>] -         Fix report-icon for moderators in PM folders.
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9140'>PHPBB3-9140</a>] -         Check current board version in incremental update packages
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9145'>PHPBB3-9145</a>] -         Fix open_basedir issues when accessing styles- and language-management
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9146'>PHPBB3-9146</a>] -         Quick-Reply tabindex=&quot;6&quot; set twice
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9147'>PHPBB3-9147</a>] -         &quot;Change topic type&quot;-option &quot;Normal&quot; always selected.
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9154'>PHPBB3-9154</a>] -         Correctly check for double inclusion in captcha garbage collection
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9158'>PHPBB3-9158</a>] -         viewforum/viewtopic pages unnecessarily duplicated with start=0
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9162'>PHPBB3-9162</a>] -         BBCode in poll options is broken, when posting without question.
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9167'>PHPBB3-9167</a>] -         Remove shadow topics from remaining forums when deleting a forum including posts
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9170'>PHPBB3-9170</a>] -         Unable to get image size in img bbcode when URL has multiple parameters.
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9173'>PHPBB3-9173</a>] -         sql_config_count() artificially limits number scope to 4byte-integer on PostgreSQL and Firebird
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9176'>PHPBB3-9176</a>] -         When setting the board&#39;s date format the board&#39;s timezone settings aren&#39;t taken into account
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9451'>PHPBB3-9451</a>] -         Unnecessary overhead in avatar_process_user function
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9478'>PHPBB3-9478</a>] -         Validate maximum number of allowed recipients per PM value
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9495'>PHPBB3-9495</a>] -         Loginbox &lt;input /&gt; redirect breaks xHTML
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9499'>PHPBB3-9499</a>] -         Javascript function dE does not correctly detect element visibility
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9504'>PHPBB3-9504</a>] -         Allow gallery avatars with whitespaces in the filename
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9509'>PHPBB3-9509</a>] -         phpBB Coding Guidelines state subversion as the version control system for phpBB
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9510'>PHPBB3-9510</a>] -         Unable to copy permissions from and to forums you cannot see
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9512'>PHPBB3-9512</a>] -         Fix dead link in MCP on reports for global announcements in prosilver.
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9514'>PHPBB3-9514</a>] -         Correctly delete big datasets when deleting a forum including  topics/posts on non-MySQL databases
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9518'>PHPBB3-9518</a>] -         Postgres DBAL does not correctly create a new database connection when passing $new_link as true
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9519'>PHPBB3-9519</a>] -         Replace remaining is_writable() calls with phpbb_is_writable().
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9521'>PHPBB3-9521</a>] -         MSSQL error reporting returns String instead of an error
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9524'>PHPBB3-9524</a>] -         IPv6 regular expression does not match addresses starting in ::
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9526'>PHPBB3-9526</a>] -         User Preference to hide online status does not work for bots
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9528'>PHPBB3-9528</a>] -         Quoting in a PM does not fall back to bbcode-less quotes using &quot;&gt; &quot; when bbcodes are disabled
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9529'>PHPBB3-9529</a>] -         Topic review does not display all selected posts
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9530'>PHPBB3-9530</a>] -         subsilver2 missing fallback option on quoting when bbcodes are disabled
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9531'>PHPBB3-9531</a>] -         BBCode-less fall back option for quotes is missing &quot;Author wrote:&quot; line when quoting from topic-review.
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9535'>PHPBB3-9535</a>] -         Incorrect margins in RTL languages: signatures, permission ACP &amp; updater
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9545'>PHPBB3-9545</a>] -         &#39;Your first forum&#39; should have &#39;Display active topics:&#39; set to &#39;Yes&#39;
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9546'>PHPBB3-9546</a>] -         Moving all posts from one topic to another does not delete bookmarks
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9547'>PHPBB3-9547</a>] -         Changing forum type applies FORUM_FLAG_ACTIVE_TOPICS to new forum type.
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9548'>PHPBB3-9548</a>] -         Delete user quicktool drop down should have an empty or invalid selection as the default
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9559'>PHPBB3-9559</a>] -         Messenger Queue Batch Size configuration option is overridden
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9567'>PHPBB3-9567</a>] -         Newly registered users group ACP wording
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9582'>PHPBB3-9582</a>] -         Missing MSSQL native driver case statements
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9587'>PHPBB3-9587</a>] -         Prosilver overrides reCaptcha class.
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9592'>PHPBB3-9592</a>] -         Test suite does not run on SQLite
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9593'>PHPBB3-9593</a>] -         Missing documentation for running unit tests
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9599'>PHPBB3-9599</a>] -         Windows workaround for checkdnsrr() returns wrong results
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9605'>PHPBB3-9605</a>] -         Wrong class added to topiclist, when there&#39;s no announcement topic.
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9615'>PHPBB3-9615</a>] -         When attaching a file whose name contains quotes, filename before last quote is cut off in display
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9623'>PHPBB3-9623</a>] -         Strings not properly normalized - acp_prune.php
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9626'>PHPBB3-9626</a>] -         Regular expressions from get_preg_expression() are untested.
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9628'>PHPBB3-9628</a>] -         Add module function does not correctly insert a module after the specified one
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9633'>PHPBB3-9633</a>] -         Newly registered users group color is not used in Our Newest Member
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9635'>PHPBB3-9635</a>] -         Useless parameter $data[&#39;post_time&#39;] in function submit_post.
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9637'>PHPBB3-9637</a>] -         SET NAMES &#39;BINARY&#39; error in convertor
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9643'>PHPBB3-9643</a>] -         DB connection error when $dbhost is an IPv6 address
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9644'>PHPBB3-9644</a>] -         submit_post shows support for options that cause a trigger_error in the call to user_notification
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9646'>PHPBB3-9646</a>] -         Cant hide/outcomment @import in stylesheet.css
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9650'>PHPBB3-9650</a>] -         It should not be possible to ban Anonymous
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9653'>PHPBB3-9653</a>] -         xhtml errors in subsilver2 when using the bbcodes code and quote in signatures
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9655'>PHPBB3-9655</a>] -         Selecting an unavailable captcha plugin looks like a successful action
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9656'>PHPBB3-9656</a>] -         PHP Information in ACP always lists error_reporting as 0
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9658'>PHPBB3-9658</a>] -         Optimize topic splitting
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9662'>PHPBB3-9662</a>] -         Search interval applied inconsistently
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9664'>PHPBB3-9664</a>] -         Another duplicate accesskey: t = top and list item
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9665'>PHPBB3-9665</a>] -         Signature &quot;0&quot; cannot be previewed
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9677'>PHPBB3-9677</a>] -         Subsilver2 is missing the bbcode-helpline for inline-attachments.
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9678'>PHPBB3-9678</a>] -         Flash attachments are not displayed in subsilver2.
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9679'>PHPBB3-9679</a>] -         &quot;Notify User&quot; checkbox appears in MCP Queue even if no notification methods are enabled
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9686'>PHPBB3-9686</a>] -         Unable to create data backup using the mssqlnative DBAL
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9694'>PHPBB3-9694</a>] -         Calling download/file.php with empty avatar parameter can throw an E_NOTICE message
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9695'>PHPBB3-9695</a>] -         Bad Display of User Input - mcp_ban
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9696'>PHPBB3-9696</a>] -         Installation of phpBB with SQLite fails
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9697'>PHPBB3-9697</a>] -         Backlink broken when the select parent forum does not exist.
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9698'>PHPBB3-9698</a>] -         Returning result of new by reference is deprecated in php 5.3
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9702'>PHPBB3-9702</a>] -         &quot;Ban until (date)&quot; appears to be based on UTC time instead of local time
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9703'>PHPBB3-9703</a>] -         Removing a user does not remove their private message folders or rules
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9704'>PHPBB3-9704</a>] -         Coding guidelines typo
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9712'>PHPBB3-9712</a>] -         Future dates display as &quot;less than one minute ago&quot;
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9714'>PHPBB3-9714</a>] -         &quot;Undefined variable: email&quot; in email regular expression unit tests
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9715'>PHPBB3-9715</a>] -         Fix email address regular expression or adjust email regular expression unit tests
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9722'>PHPBB3-9722</a>] -         &quot;New Topic&quot; button title attribute mismatch in prosilver&#39;s viewforum
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9727'>PHPBB3-9727</a>] -         Feed replaces ./ with board URL
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9743'>PHPBB3-9743</a>] -         Fix background-position of top2-class in prosilver for RTL-languages.
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9744'>PHPBB3-9744</a>] -         Mistyped word &#39;then&#39; in FAQ. It should be &#39;than&#39;.
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9748'>PHPBB3-9748</a>] -         &lt;br /&gt; not being replaced in prepare_message
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9749'>PHPBB3-9749</a>] -         fulltext_mysql.php overreacts on + and - characters in search words
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9752'>PHPBB3-9752</a>] -         Misleading text when using Q&amp;A CAPTCHA
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9754'>PHPBB3-9754</a>] -         Template variable S_USER_POSTED always set to false in search.php
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9757'>PHPBB3-9757</a>] -         Empty template variable HISTORY_TITLE in ucp_pm_history
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9760'>PHPBB3-9760</a>] -         Fulltext native search, wildcard * does not get escaped leading to long execution time
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9761'>PHPBB3-9761</a>] -         Quote nesting depth explanation is misleading
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9771'>PHPBB3-9771</a>] -         build_url() doesn&#39;t ignore empty parameters
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9772'>PHPBB3-9772</a>] -         Under some circumstances, email addresses are shown to undesired users
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9780'>PHPBB3-9780</a>] -         gen_rand_string() not respecting $num_chars parameter anymore.
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9782'>PHPBB3-9782</a>] -         Board disable radio in Board-Settings set on when server load high
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9793'>PHPBB3-9793</a>] -         Undefined function send_status_line() in download/file.php when in avatar mode.
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9807'>PHPBB3-9807</a>] -         Avatar tab displays when avatars are disabled
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9810'>PHPBB3-9810</a>] -         Clicking on &quot;Select All&quot; of code tag on print page results in a javascript error when using prosilver
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9820'>PHPBB3-9820</a>] -         Fix undefined indexes when trying to post a new topic
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9822'>PHPBB3-9822</a>] -         Can not delete style-components from the file-system as per explanation.
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9829'>PHPBB3-9829</a>] -         Recaptcha plugin result interpretation fault
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9835'>PHPBB3-9835</a>] -         Login Confirm Explain Not Working
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9840'>PHPBB3-9840</a>] -         Display view unread posts link for guests
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9841'>PHPBB3-9841</a>] -         Change &quot;Save&quot; button to &quot;Save draft&quot;
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9847'>PHPBB3-9847</a>] -         Language typo and written form (British/American)
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9854'>PHPBB3-9854</a>] -         Auth API documentation is incomplete
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9855'>PHPBB3-9855</a>] -         Tests don&#39;t run on PHPUnit 3.5
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9879'>PHPBB3-9879</a>] -         captcha_qa.php spelling, punctuation and grammar errors
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9883'>PHPBB3-9883</a>] -         CAPTCHA uses american english
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9884'>PHPBB3-9884</a>] -         Massive email delays
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9885'>PHPBB3-9885</a>] -         Default file extension groups not properly updated by database updater.
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9886'>PHPBB3-9886</a>] -         Database updater does not run on PostgreSQL because of an error in _add_module()
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9888'>PHPBB3-9888</a>] -         Update fails when Bing [Bot] was already added to the users table
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9891'>PHPBB3-9891</a>] -         Updater drops language-selection after database-update
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9509'>PHPBB3-9509</a>] -         phpBB Coding Guidelines state subversion as the version control system for phpBB
+</li>
+</ul>
+
+<h4>        Improvement
+</h4>
+<ul>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-7332'>PHPBB3-7332</a>] -         MCP post details usability
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-7717'>PHPBB3-7717</a>] -         Use user&#39;s language for standard-extensions-group name
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-8709'>PHPBB3-8709</a>] -         Multibyte keys in request_var not possible
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-8936'>PHPBB3-8936</a>] -         subsilver2 missing reply-to-all feature
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9088'>PHPBB3-9088</a>] -         Add missing semicolons in js files
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9179'>PHPBB3-9179</a>] -         improve quasi-documentation of notify_status values
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9503'>PHPBB3-9503</a>] -         Posts with empty titles in moderation queue are not easily approved
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9534'>PHPBB3-9534</a>] -         user_ipwhois() does not support IPv6 addresses
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9536'>PHPBB3-9536</a>] -         Small improvement for query against sessions table in acp_users.php
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9553'>PHPBB3-9553</a>] -         Make git hooks run with /bin/sh instead of bash
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9570'>PHPBB3-9570</a>] -         Change &quot;system timezone&quot; to &quot;guest timezone&quot; in acp, add explanation
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9578'>PHPBB3-9578</a>] -         ACP Posting tab is missing &quot;Post settings&quot; module.
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9589'>PHPBB3-9589</a>] -         Sample nginx configuration file
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9595'>PHPBB3-9595</a>] -         Search settings in ACP: Add information on minimum word size indexed when using Fulltext MySQL backend
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9598'>PHPBB3-9598</a>] -         Call checkdnsrr() on Windows with PHP 5.3
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9609'>PHPBB3-9609</a>] -         Use send_status_line instead of calling header
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9611'>PHPBB3-9611</a>] -         Increase entropy in activation keys
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9612'>PHPBB3-9612</a>] -         Split gen_rand_string() into gen_rand_string() and gen_rand_string_friendly()
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9629'>PHPBB3-9629</a>] -         sid parameter forced for style.php makes caching difficult
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9659'>PHPBB3-9659</a>] -         Default phpBB signature user_options need to be set for convertors
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9690'>PHPBB3-9690</a>] -         MSN Bot will become Bing Bot
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9777'>PHPBB3-9777</a>] -         Print useful error message in pre-commit hook when php is not installed.
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9785'>PHPBB3-9785</a>] -         Not able to recover a password when board disabled
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9825'>PHPBB3-9825</a>] -         Run tests on sqlite if available and no test db configured
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9827'>PHPBB3-9827</a>] -         IE9 Beta fixes IE8 textarea bug
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9830'>PHPBB3-9830</a>] -         Awkward message when config.php is missing
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9850'>PHPBB3-9850</a>] -         Allow version checker to display information on multiple releases
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9853'>PHPBB3-9853</a>] -         Change default reCAPTCHA theme in Prosilver &amp; Subsilver2 to better coordinate with style color scheme
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9880'>PHPBB3-9880</a>] -         Rename all mentions of CAPTCHA or visual confirmation to anti-bot
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9899'>PHPBB3-9899</a>] -         Change the style in the ACP for the recaptcha to match that displayed on prosilver
+</li>
+</ul>
+
+<h4>        New Feature
+</h4>
+<ul>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9039'>PHPBB3-9039</a>] -         Native SQL Server Support mssqlnative.php
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9511'>PHPBB3-9511</a>] -         View note for moderators on unapproved posts/topics with unapproved posts in ATOM Feed.
+</li>
+</ul>
+
+<h4>        Task
+</h4>
+<ul>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9520'>PHPBB3-9520</a>] -         Add web.config files for IIS
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9625'>PHPBB3-9625</a>] -         Update database UNIT-test
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9701'>PHPBB3-9701</a>] -         Enable notices in unit tests
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9768'>PHPBB3-9768</a>] -         Create git commit-msg hook that verifies the commit message conforms to our standards
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9769'>PHPBB3-9769</a>] -         Add install and uninstall scripts for the git hooks
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9770'>PHPBB3-9770</a>] -         Git commit message should be prefilled with branch and ticket information
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9800'>PHPBB3-9800</a>] -         Update tracker URL in docs/README.html
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9804'>PHPBB3-9804</a>] -         Update docs/AUTHORS (DavidMJ &amp; igorw)
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9808'>PHPBB3-9808</a>] -         Git commit message hook depends on GNU wc
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9816'>PHPBB3-9816</a>] -         Remove config.php from git repository
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9848'>PHPBB3-9848</a>] -         Add phpBB data files to .gitignore.
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9849'>PHPBB3-9849</a>] -         Create build script using phing
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9857'>PHPBB3-9857</a>] -         Remove visible $Id$ from docs files.
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9868'>PHPBB3-9868</a>] -         Make the test suite run and pass using the mssqlnative driver
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9904'>PHPBB3-9904</a>] -         Update WebPI Parameters.xml
+</li>
+</ul>
+
+<h4>        Sub-task
+</h4>
+<ul>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9517'>PHPBB3-9517</a>] -         Remote avatar upload does not check the filesize before and during transfer.
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9562'>PHPBB3-9562</a>] -         Advanced Search is inaccessible using the mssqlnative DBAL
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9564'>PHPBB3-9564</a>] -         Reported messages are not assigned the default report reason when a reason is removed from the ACP using the mssqlnative DBAL
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9565'>PHPBB3-9565</a>] -         It is impossible to create a custom profile field using the mssqlnative DBAL
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9566'>PHPBB3-9566</a>] -         Two debug notices are displayed when setting a custom profile field though the UCP using the mssqlnative DBAL
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9583'>PHPBB3-9583</a>] -         MSSQL native backups cannot be restored
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9606'>PHPBB3-9606</a>] -         Drop redundant SQL query for unreads fetching
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9613'>PHPBB3-9613</a>] -         Implement a load switch for unreads search feature.
+</li>
+<li>[<a href='http://tracker.phpbb.com/browse/PHPBB3-9817'>PHPBB3-9817</a>] -         Make build script create blank config.php
+</li>
+</ul>
+
+
+	<a name="v307"></a><h3>1.ii. Changes since 3.0.7</h3>
 
 	<ul>
 		<li>[Sec] Do not expose forum content of forums with ACL entries but no actual permission in ATOM Feeds. (Bug #58595)</li>
 	</ul>
 
-	<a name="v306"></a><h3>1.ii. Changes since 3.0.6</h3>
+	<a name="v306"></a><h3>1.iii. Changes since 3.0.6</h3>
 
 	<ul>
 		<li>[Fix] Allow ban reason and length to be selected and copied in ACP and subsilver2 MCP. (Bug #51095)</li>
@@ -198,7 +657,7 @@
 
 	</ul>
 
-	<a name="v305"></a><h3>1.ii. Changes since 3.0.5</h3>
+	<a name="v305"></a><h3>1.iv. Changes since 3.0.5</h3>
 
 	<ul>
 		<li>[Fix] Allow whitespaces in avatar gallery names. (Bug #44955)</li>
@@ -420,7 +879,7 @@
 		<li>[Feature] Send anonymous statistical information to phpBB on installation and update (optional).</li>
 	</ul>
 
-	<a name="v304"></a><h3>1.iii. Changes since 3.0.4</h3>
+	<a name="v304"></a><h3>1.v. Changes since 3.0.4</h3>
 
 	<ul>
 		<li>[Fix] Delete user entry from ban list table upon user deletion (Bug #40015 - Patch by TerraFrost)</li>
@@ -509,7 +968,7 @@
 		<li>[Sec] Only use forum id supplied for posting if global announcement detected. (Reported by nickvergessen)</li>
 	</ul>
 
-	<a name="v303"></a><h3>1.iv. Changes since 3.0.3</h3>
+	<a name="v303"></a><h3>1.vi. Changes since 3.0.3</h3>
 
 	<ul>
 		<li>[Fix] Allow mixed-case template directories to be inherited (Bug #36725)</li>
@@ -541,7 +1000,7 @@
 		<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.v. Changes since 3.0.2</h3>
+	<a name="v302"></a><h3>1.vii. 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>
@@ -640,7 +1099,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.vi. Changes since 3.0.1</h3>
+	<a name="v301"></a><h3>1.viii. Changes since 3.0.1</h3>
 
 	<ul>
 		<li>[Fix] Ability to set permissions on non-mysql dbms (Bug #24955)</li>
@@ -688,7 +1147,7 @@
 		<li>[Sec] Only allow urls gone through redirect() being used within login_box(). (thanks nookieman)</li>
 	</ul>
 
-	<a name="v300"></a><h3>1.vii Changes since 3.0.0</h3>
+	<a name="v300"></a><h3>1.ix Changes since 3.0.0</h3>
 
 	<ul>
 		<li>[Change] Validate birthdays (Bug #15004)</li>
@@ -759,7 +1218,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.viii. Changes since 3.0.RC8</h3>
+	<a name="v30rc8"></a><h3>1.x. 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>
@@ -768,7 +1227,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.ix. Changes since 3.0.RC7</h3>
+	<a name="v30rc7"></a><h3>1.xi. Changes since 3.0.RC7</h3>
 
 	<ul>
 		<li>[Fix] Fixed MSSQL related bug in the update system</li>
@@ -803,7 +1262,7 @@
 		<li>[Fix] No duplication of active topics (Bug #15474)</li>
 	</ul>
 
-	<a name="v30rc6"></a><h3>1.x. Changes since 3.0.RC6</h3>
+	<a name="v30rc6"></a><h3>1.xii. Changes since 3.0.RC6</h3>
 
 	<ul>
 		<li>[Fix] Submitting language changes using acp_language (Bug #14736)</li>
@@ -813,7 +1272,7 @@
 		<li>[Fix] Able to request new password (Bug #14743)</li>
 	</ul>
 
-	<a name="v30rc5"></a><h3>1.xi. Changes since 3.0.RC5</h3>
+	<a name="v30rc5"></a><h3>1.xiii. 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>
@@ -876,7 +1335,7 @@
 		<li>[Sec] New password hashing mechanism for storing passwords (#i42)</li>
 	</ul>
 
-	<a name="v30rc4"></a><h3>1.xii. Changes since 3.0.RC4</h3>
+	<a name="v30rc4"></a><h3>1.xiv. Changes since 3.0.RC4</h3>
 
 	<ul>
 		<li>[Fix] MySQL, PostgreSQL and SQLite related database fixes (Bug #13862)</li>
@@ -927,7 +1386,7 @@
 		<li>[Fix] odbc_autocommit causing existing result sets to be dropped (Bug #14182)</li>
 	</ul>
 
-	<a name="v30rc3"></a><h3>1.xiii. Changes since 3.0.RC3</h3>
+	<a name="v30rc3"></a><h3>1.xv. Changes since 3.0.RC3</h3>
 
 	<ul>
 		<li>[Fix] Fixing some subsilver2 and prosilver style issues</li>
@@ -1036,7 +1495,7 @@
 
 	</ul>
 
-	<a name="v30rc2"></a><h3>1.xiv. Changes since 3.0.RC2</h3>
+	<a name="v30rc2"></a><h3>1.xvi. Changes since 3.0.RC2</h3>
 
 	<ul>
 		<li>[Fix] Re-allow searching within the memberlist</li>
@@ -1082,7 +1541,7 @@
 
 	</ul>
 
-	<a name="v30rc1"></a><h3>1.xv. Changes since 3.0.RC1</h3>
+	<a name="v30rc1"></a><h3>1.xvii. 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.7-PL1.src/docs/coding-guidelines.html 3.0.8.src/docs/coding-guidelines.html
--- 3.0.7-PL1.src/docs/coding-guidelines.html	2010-03-05 14:37:00.000000000 -0600
+++ 3.0.8.src/docs/coding-guidelines.html	2010-11-19 06:22:12.000000000 -0600
@@ -90,10 +90,9 @@
 	<li><a href="#vcs">VCS Guidelines</a>
 	<ol style="list-style-type: lower-roman;">
 		<li><a href="#repostruct">Repository structure</a></li>
-		<li><a href="#commitmessage">Commit messages</a></li>
+		<li><a href="#commitmessage">Commit Messages and Repository Rules</a></li>
 	</ol>
 	</li>
-	<li><a href="#changes">Guidelines Changelog</a></li>
 	<li><a href="#disclaimer">Copyright and disclaimer</a></li>
 </ol>
 
@@ -288,7 +287,7 @@
 
 		<div class="content">
 
-	<p>Please note that these Guidelines applies to all php, html, javascript and css files.</p>
+	<p>Please note that these guidelines apply to all php, html, javascript and css files.</p>
 
 	<a name="namingvars"></a><h3>2.i. Variable/Function Naming</h3>
 
@@ -2326,126 +2325,33 @@
 
 		<div class="content">
 
-	<p>The version control system for phpBB3 is subversion. The repository is available at <a href="http://code.phpbb.com/svn/phpbb" title="repository">http://code.phpbb.com/svn/phpbb</a>.</p>
+	<p>The version control system for phpBB3 is git. The repository is available at <a href="http://github.com/phpbb/phpbb3" title="repository">http://github.com/phpbb/phpbb3</a>.</p>
 
 	<a name="repostruct"></a><h3>7.i. Repository Structure</h3>
 
 	<ul>
-		<li><strong>trunk</strong><br />The latest unstable development version with new features etc. Contains the actual board in <code>/trunk/phpBB</code></li>
-		<li><strong>branches</strong><br />Development branches of stable phpBB releases. Copied from <code>/trunk</code> at the time of release.
+		<li><strong>develop</strong><br />The latest unstable development version with new features etc.</li>
+		<li><strong>develop-*</strong><br />Development branches of stable phpBB releases. Branched off of <code>develop</code> at the time of feature freeze.
 			<ul>
-				<li><strong>phpBB3.0</strong><code>/branches/phpBB-3_0_0/phpBB</code><br />Development branch of the stable 3.0 line. Bug fixes are applied here.</li>
-				<li><strong>phpBB2</strong><code>/branches/phpBB-2_0_0/phpBB</code><br />Old phpBB2 development branch.</li>
+				<li><strong>phpBB3.0</strong><code>develop-olympus</code><br />Development branch of the stable 3.0 line. Bug fixes are applied here.</li>
+				<li><strong>phpBB3.1</strong><code>develop-ascraeus</code><br />Development branch of the stable 3.1 line. Bug fixes are applied here.</li>
 			</ul>
 		</li>
-		<li><strong>tags</strong><br />Released versions. Copies of trunk or the respective branch, made at the time of release.
+		<li><strong>master</strong><br />A branch containing all stable phpBB3 release points</li>
+		<li><strong>tags</strong><br />Released versions. Stable ones get merged into the master branch.
 			<ul>
-				<li><code>/tags/release_3_0_BX</code><br />Beta release X of the 3.0 line.</li>
-				<li><code>/tags/release_3_0_RCX</code><br />Release candidate X of the 3.0 line.</li>
-				<li><code>/tags/release_3_0_X-RCY</code><br />Release candidate Y of the stable 3.0.X release.</li>
-				<li><code>/tags/release_3_0_X</code><br />Stable <strong>3.0.X</strong> release.</li>
-				<li><code>/tags/release_2_0_X</code><br />Old stable 2.0.X release.</li>
+				<li><code>release-3.Y-BX</code><br />Beta release X of the 3.Y line.</li>
+				<li><code>release-3.Y-RCX</code><br />Release candidate X of the 3.Y line.</li>
+				<li><code>release-3.Y.Z-RCX</code><br />Release candidate X of the stable 3.Y.Z release.</li>
+				<li><code>release-3.0.X</code><br />Stable <strong>3.0.X</strong> release.</li>
+				<li><code>release-2.0.X</code><br />Old stable 2.0.X release.</li>
 			</ul>
 		</li>
 	</ul>
 
-	<a name="commitmessage"></a><h3>7.ii. Commit Messages</h3>
-
-	<p>The commit message should contain a brief explanation of all changes made within the commit. Often identical to the changelog entry. A bug ticket can be referenced by specifying the ticket ID with a hash, e.g. #12345. A reference to another revision should simply be prefixed with r, e.g. r12345.</p>
-
-	<p>Junior Developers need to have their patches approved by a development team member first. The commit message must end in a line with the following format:</p>
-
-	<div class="codebox"><pre>
-Authorised by: developer1[, developer2[, ...]]
-	</pre></div>
-
-		</div>
-
-		<div class="back2top"><a href="#wrap" class="top">Back to Top</a></div>
-
-		<span class="corners-bottom"><span></span></span></div>
-	</div>
-
-	<hr />
-
-<a name="changes"></a><h2>8. Guidelines Changelog</h2>
-	<div class="paragraph">
-		<div class="inner"><span class="corners-top"><span></span></span>
-
-		<div class="content">
-<h3>Revision 10007</h3>
-
-<ul>
-	<li>Added <a href="#constants">Special Constants</a> section.</li>
-</ul>
-
-<h3>Revision 9817</h3>
-
-<ul>
-	<li>Added VCS section.</li>
-</ul>
-
-<h3>Revision 8732</h3>
-
-<ul>
-	<li>Added cfg files.</li>
-	<li>Added template <a href="#inheritance">inheritance</a>.</li>
-</ul>
-
-<h3>Revision 8596+</h3>
-
-<ul>
-	<li>Removed sql_build_array('MULTI_INSERT'... statements.</li>
-	<li>Added sql_multi_insert() explanation.</li>
-</ul>
-
-<h3>Revision 1.31</h3>
-
-<ul>
-	<li>Added add_form_key and check_form_key. </li>
-</ul>
-
-<h3>Revision 1.24</h3>
-
-<ul>
-	<li>Added <a href="#translation">5. Character Sets and Encodings</a> section to explain the recommended treatment of strings in phpBB.</li>
-</ul>
-
-<h3>Revision 1.16</h3>
-
-<ul>
-	<li>Added <a href="#translation">6. Translation (<abbr title="Internationalisation">i18n</abbr>/<abbr title="Localisation">L10n</abbr>) Guidelines</a> section to explain expected format and authoring considerations for language packs that are to be created for phpBB.</li>
-</ul>
-
-<h3>Revision 1.11-1.15</h3>
-
-<ul>
-	<li>Various document formatting, spelling, punctuation, grammar bugs.</li>
-</ul>
-
-<h3>Revision 1.9-1.10</h3>
-
-<ul>
-	<li>Added sql_query_limit to <a href="#sql">2.iii. SQL/SQL Layout</a>.</li>
-</ul>
-
-<h3>Revision 1.8</h3>
-
-<ul>
-	<li>Some adjustements to wordings</li>
-	<li>Updated paragraph <a href="#locations">1.iii. File Locations</a> to reflect recent changes</li>
-	<li>Extended paragraph <a href="#codelayout">2.ii. Code Layout</a>.</li>
-	<li>Added sql_in_set and sql_build_query explanation to <a href="#sql">2.iii. SQL/SQL Layout</a>.</li>
-	<li>Updated paragraph <a href="#styling">3. Styling</a>.</li>
-	<li>Updated paragraph <a href="#templating">4. Templating</a> to explain loop checking, loop breaking and other changes we recently made.</li>
-</ul>
-
-<h3>Revision 1.5</h3>
-
-<ul>
-	<li>Changed General function usage paragraph in <a href="#general">2.v. General Guidelines</a></li>
-</ul>
+	<a name="commitmessage"></a><h3>7.ii. Commit Messages and Repository Rules</h3>
 
+	<p>Information on repository rules, such as commit messages can be found at <a href="http://wiki.phpbb.com/display/DEV/Git" title="phpBB Git Information">http://wiki.phpbb.com/display/DEV/Git</a>.</p>
 
 		</div>
 
@@ -2475,7 +2381,7 @@
 <!-- END DOCUMENT -->
 
 	<div id="page-footer">
-		<div class="version"> $Id$ </div>
+		<div class="version">&nbsp;</div>
 	</div>
 </div></div>
 
diff -x .svn -aruN 3.0.7-PL1.src/docs/hook_system.html 3.0.8.src/docs/hook_system.html
--- 3.0.7-PL1.src/docs/hook_system.html	2010-03-05 14:37:00.000000000 -0600
+++ 3.0.8.src/docs/hook_system.html	2010-11-19 06:22:12.000000000 -0600
@@ -875,7 +875,7 @@
 	</div>
 
 	<div id="page-footer">
-		<div class="version">$Id$</div>
+		<div class="version">&nbsp;</div>
 	</div>
 </div></div>
 
diff -x .svn -aruN 3.0.7-PL1.src/docs/INSTALL.html 3.0.8.src/docs/INSTALL.html
--- 3.0.7-PL1.src/docs/INSTALL.html	2010-03-05 14:37:00.000000000 -0600
+++ 3.0.8.src/docs/INSTALL.html	2010-11-19 06:22:12.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.6</samp> you should select the phpBB-3.0.6_to_3.0.7-PL1.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.7-PL1</samp> you should select the phpBB-3.0.7-PL1_to_3.0.8.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 recommended 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.5 you need the phpBB-3.0.6_to_3.0.7-PL1.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.5 you need the phpBB-3.0.7-PL1_to_3.0.8.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.7-PL1.src/docs/nginx.conf.sample 3.0.8.src/docs/nginx.conf.sample
--- 3.0.7-PL1.src/docs/nginx.conf.sample	1969-12-31 18:00:00.000000000 -0600
+++ 3.0.8.src/docs/nginx.conf.sample	2010-11-19 06:22:12.000000000 -0600
@@ -0,0 +1,70 @@
+# Sample nginx configuration file for phpBB.
+# Global settings have been removed, copy them
+# from your system's nginx.conf.
+# Tested with nginx 0.8.35.
+
+http {
+    # Compression - requires gzip and gzip static modules.
+    gzip on;
+    gzip_static on;
+    gzip_vary on;
+    gzip_http_version 1.1;
+    gzip_min_length 700;
+    gzip_comp_level 6;
+    gzip_disable "MSIE [1-6]\.";
+
+    # Catch-all server for requests to invalid hosts.
+    # Also catches vulnerability scanners probing IP addresses.
+    # Should be first.
+    server {
+        listen 80;
+        server_name bogus;
+        return 444;
+        root /var/empty;
+    }
+
+    # If you have domains with and without www prefix,
+    # redirect one to the other.
+    server {
+        listen 80;
+        server_name myforums.com;
+        rewrite ^(.*)$ http://www.myforums.com$1 permanent;
+    }
+
+    # The actual board domain.
+    server {
+        listen 80;
+        server_name www.myforums.com;
+
+        root /path/to/phpbb;
+
+        location / {
+            # phpbb uses index.htm
+            index index.php index.html index.htm;
+        }
+
+        # Deny access to internal phpbb files.
+        location ~ /(config\.php|common\.php|includes|cache|files|store|images/avatars/upload) {
+            deny all;
+        }
+
+        # Pass the php scripts to fastcgi server specified in upstream declaration.
+        location ~ \.php$ {
+            fastcgi_pass php;
+            # Necessary for php.
+            fastcgi_param SCRIPT_FILENAME  $document_root$fastcgi_script_name;
+            # Unmodified fastcgi_params from nginx distribution.
+            include fastcgi_params;
+        }
+
+        # Deny access to version control system directories.
+        location ~ /\.svn|/\.git {
+            deny all;
+        }
+    }
+
+    # If running php as fastcgi, specify php upstream.
+    upstream php {
+        server unix:/tmp/php.sock;
+    }
+}
diff -x .svn -aruN 3.0.7-PL1.src/docs/README.html 3.0.8.src/docs/README.html
--- 3.0.7-PL1.src/docs/README.html	2010-03-05 14:37:00.000000000 -0600
+++ 3.0.8.src/docs/README.html	2010-11-19 06:22:12.000000000 -0600
@@ -242,7 +242,7 @@
 
 	<p>The phpBB Group uses a bug tracking system to store, list and manage all reported bugs, it can be found at the location listed below. Please <strong>DO NOT</strong> post bug reports to our forums, they will be locked. In addition please <strong>DO NOT</strong> use the bug tracker for support requests. Posting such a request will only see you directed to the support forums (while taking time away from working on real bugs).</p>
 
-	<p><a href="http://www.phpbb.com/bugs/">http://www.phpbb.com/bugs/</a></p>
+	<p><a href="http://tracker.phpbb.com/">http://tracker.phpbb.com/</a></p>
 
 	<p>While we very much appreciate receiving bug reports (the more reports the more stable phpBB will be) we ask you carry out a few steps before adding new entries:</p>
 
diff -x .svn -aruN 3.0.7-PL1.src/download/file.php 3.0.8.src/download/file.php
--- 3.0.7-PL1.src/download/file.php	2010-03-05 14:36:59.000000000 -0600
+++ 3.0.8.src/download/file.php	2010-11-19 06:22:12.000000000 -0600
@@ -31,6 +31,12 @@
 
 if (isset($_GET['avatar']))
 {
+	if (!defined('E_DEPRECATED'))
+	{
+		define('E_DEPRECATED', 8192);
+	}
+	error_reporting(E_ALL ^ E_NOTICE ^ E_DEPRECATED);
+
 	require($phpbb_root_path . 'config.' . $phpEx);
 
 	if (!defined('PHPBB_INSTALLED') || empty($dbms) || empty($acm_type))
@@ -42,6 +48,7 @@
 	require($phpbb_root_path . 'includes/cache.' . $phpEx);
 	require($phpbb_root_path . 'includes/db/' . $dbms . '.' . $phpEx);
 	require($phpbb_root_path . 'includes/constants.' . $phpEx);
+	require($phpbb_root_path . 'includes/functions.' . $phpEx);
 
 	$db = new $sql_db();
 	$cache = new cache();
@@ -61,7 +68,7 @@
 	$avatar_group = false;
 	$exit = false;
 
-	if ($filename[0] === 'g')
+	if (isset($filename[0]) && $filename[0] === 'g')
 	{
 		$avatar_group = true;
 		$filename = substr($filename, 1);
@@ -70,7 +77,7 @@
 	// '==' is not a bug - . as the first char is as bad as no dot at all
 	if (strpos($filename, '.') == false)
 	{
-		header('HTTP/1.0 403 Forbidden');
+		send_status_line(403, 'Forbidden');
 		$exit = true;
 	}
 
@@ -84,7 +91,7 @@
 	if (!$exit && !in_array($ext, array('png', 'gif', 'jpg', 'jpeg')))
 	{
 		// no way such an avatar could exist. They are not following the rules, stop the show.
-		header("HTTP/1.0 403 Forbidden");
+		send_status_line(403, 'Forbidden');
 		$exit = true;
 	}
 
@@ -94,7 +101,7 @@
 		if (!$filename)
 		{
 			// no way such an avatar could exist. They are not following the rules, stop the show.
-			header("HTTP/1.0 403 Forbidden");
+			send_status_line(403, 'Forbidden');
 		}
 		else
 		{
@@ -192,7 +199,7 @@
 		$row['forum_id'] = false;
 		if (!$auth->acl_get('u_pm_download'))
 		{
-			header('HTTP/1.0 403 Forbidden');
+			send_status_line(403, 'Forbidden');
 			trigger_error('SORRY_AUTH_VIEW_ATTACH');
 		}
 
@@ -215,7 +222,7 @@
 
 		if (!$allowed)
 		{
-			header('HTTP/1.0 403 Forbidden');
+			send_status_line(403, 'Forbidden');
 			trigger_error('ERROR_NO_ATTACHMENT');
 		}
 	}
@@ -230,7 +237,7 @@
 
 if (!download_allowed())
 {
-	header('HTTP/1.0 403 Forbidden');
+	send_status_line(403, 'Forbidden');
 	trigger_error($user->lang['LINKAGE_FORBIDDEN']);
 }
 
@@ -376,7 +383,7 @@
 	}
 	else
 	{
-		header('HTTP/1.0 404 Not Found');
+		send_status_line(404, 'Not Found');
 	}
 }
 
@@ -670,15 +677,7 @@
 	{
 		if ($last_load !== false && $last_load >= $stamp)
 		{
-			if (substr(strtolower(@php_sapi_name()),0,3) === 'cgi')
-			{
-				// in theory, we shouldn't need that due to php doing it. Reality offers a differing opinion, though
-				header('Status: 304 Not Modified', true, 304);
-			}
-			else
-			{
-				header('HTTP/1.0 304 Not Modified', true, 304);
-			}
+			send_status_line(304, 'Not Modified');
 			// seems that we need those too ... browsers
 			header('Pragma: public');
 			header('Expires: ' . gmdate('D, d M Y H:i:s \G\M\T', time() + 31536000));
diff -x .svn -aruN 3.0.7-PL1.src/feed.php 3.0.8.src/feed.php
--- 3.0.7-PL1.src/feed.php	2010-03-05 14:36:59.000000000 -0600
+++ 3.0.8.src/feed.php	2010-11-19 06:22:12.000000000 -0600
@@ -276,8 +276,8 @@
 	// Add newlines
 	$content = str_replace('<br />', '<br />' . "\n", $content);
 
-	// Relative Path to Absolute path, Windows style
-	$content = str_replace('./', $board_url . '/', $content);
+	// Convert smiley Relative paths to Absolute path, Windows style
+	$content = str_replace($phpbb_root_path . $config['smilies_path'], $board_url . '/' . $config['smilies_path'], $content);
 
 	// Remove "Select all" link and mouse events
 	$content = str_replace('<a href="#" onclick="selectCode(this); return false;">' . $user->lang['SELECT_ALL_CODE'] . '</a>', '', $content);
@@ -535,12 +535,30 @@
 
 		if (!isset($forum_ids))
 		{
-			$forum_ids = array_keys($auth->acl_getf('m_approve'));
+			$forum_ids = array_keys($auth->acl_getf('m_approve', true));
 		}
 
 		return $forum_ids;
 	}
 
+	function is_moderator_approve_forum($forum_id)
+	{
+		static $forum_ids;
+
+		if (!isset($forum_ids))
+		{
+			$forum_ids = array_flip($this->get_moderator_approve_forums());
+		}
+
+		if (!$forum_id)
+		{
+			// Global announcement, your a moderator in any forum than it's okay.
+			return (!empty($forum_ids)) ? true : false;
+		}
+
+		return (isset($forum_ids[$forum_id])) ? true : false;
+	}
+
 	function get_excluded_forums()
 	{
 		global $db, $cache;
@@ -677,7 +695,8 @@
 		if ($config['feed_item_statistics'])
 		{
 			$item_row['statistics'] = $user->lang['POSTED'] . ' ' . $user->lang['POST_BY_AUTHOR'] . ' ' . $this->user_viewprofile($row)
-				. ' ' . $this->separator_stats . ' ' . $user->format_date($row['post_time']);
+				. ' ' . $this->separator_stats . ' ' . $user->format_date($row['post_time'])
+				. (($this->is_moderator_approve_forum($row['forum_id']) && !$row['post_approved']) ? ' ' . $this->separator_stats . ' ' . $user->lang['POST_UNAPPROVED'] : '');
 		}
 	}
 }
@@ -719,8 +738,9 @@
 		{
 			$item_row['statistics'] = $user->lang['POSTED'] . ' ' . $user->lang['POST_BY_AUTHOR'] . ' ' . $this->user_viewprofile($row)
 				. ' ' . $this->separator_stats . ' ' . $user->format_date($row[$this->get('date')])
-				. ' ' . $this->separator_stats . ' ' . $user->lang['REPLIES'] . ' ' . $row['topic_replies']
-				. ' ' . $this->separator_stats . ' ' . $user->lang['VIEWS'] . ' ' . $row['topic_views'];
+				. ' ' . $this->separator_stats . ' ' . $user->lang['REPLIES'] . ' ' . (($this->is_moderator_approve_forum($row['forum_id'])) ? $row['topic_replies_real'] : $row['topic_replies'])
+				. ' ' . $this->separator_stats . ' ' . $user->lang['VIEWS'] . ' ' . $row['topic_views']
+				. (($this->is_moderator_approve_forum($row['forum_id']) && ($row['topic_replies_real'] != $row['topic_replies'])) ? ' ' . $this->separator_stats . ' ' . $user->lang['POSTS_UNAPPROVED'] : '');
 		}
 	}
 }
@@ -780,11 +800,11 @@
 		// Get the actual data
 		$this->sql = array(
 			'SELECT'	=>	'f.forum_id, f.forum_name, ' .
-							'p.post_id, p.topic_id, p.post_time, p.post_subject, p.post_text, p.bbcode_bitfield, p.bbcode_uid, p.enable_bbcode, p.enable_smilies, p.enable_magic_url, ' .
+							'p.post_id, p.topic_id, p.post_time, p.post_approved, p.post_subject, p.post_text, p.bbcode_bitfield, p.bbcode_uid, p.enable_bbcode, p.enable_smilies, p.enable_magic_url, ' .
 							'u.username, u.user_id',
 			'FROM'		=> array(
-				POSTS_TABLE		=> 'p',
 				USERS_TABLE		=> 'u',
+				POSTS_TABLE		=> 'p',
 			),
 			'LEFT_JOIN'	=> array(
 				array(
@@ -912,7 +932,7 @@
 		}
 
 		$this->sql = array(
-			'SELECT'	=>	'p.post_id, p.topic_id, p.post_time, p.post_subject, p.post_text, p.bbcode_bitfield, p.bbcode_uid, p.enable_bbcode, p.enable_smilies, p.enable_magic_url, ' .
+			'SELECT'	=>	'p.post_id, p.topic_id, p.post_time, p.post_approved, p.post_subject, p.post_text, p.bbcode_bitfield, p.bbcode_uid, p.enable_bbcode, p.enable_smilies, p.enable_magic_url, ' .
 							'u.username, u.user_id',
 			'FROM'		=> array(
 				POSTS_TABLE		=> 'p',
@@ -994,7 +1014,7 @@
 			if (!$this->topic_data['topic_approved'])
 			{
 				// Also require m_approve
-				$in_fid_ary = array_intersect($in_fid_ary, array_keys($auth->acl_getf('m_approve')));
+				$in_fid_ary = array_intersect($in_fid_ary, $this->get_moderator_approve_forums());
 
 				if (empty($in_fid_ary))
 				{
@@ -1077,7 +1097,7 @@
 		global $auth, $db;
 
 		$this->sql = array(
-			'SELECT'	=>	'p.post_id, p.post_time, p.post_subject, p.post_text, p.bbcode_bitfield, p.bbcode_uid, p.enable_bbcode, p.enable_smilies, p.enable_magic_url, ' .
+			'SELECT'	=>	'p.post_id, p.post_time, p.post_approved, p.post_subject, p.post_text, p.bbcode_bitfield, p.bbcode_uid, p.enable_bbcode, p.enable_smilies, p.enable_magic_url, ' .
 							'u.username, u.user_id',
 			'FROM'		=> array(
 				POSTS_TABLE		=> 'p',
@@ -1241,7 +1261,7 @@
 
 		$this->sql = array(
 			'SELECT'	=> 'f.forum_id, f.forum_name,
-							t.topic_id, t.topic_title, t.topic_poster, t.topic_first_poster_name, t.topic_replies, t.topic_views, t.topic_time,
+							t.topic_id, t.topic_title, t.topic_poster, t.topic_first_poster_name, t.topic_replies, t.topic_replies_real, t.topic_views, t.topic_time,
 							p.post_id, p.post_time, p.post_text, p.bbcode_bitfield, p.bbcode_uid, p.enable_bbcode, p.enable_smilies, p.enable_magic_url',
 			'FROM'		=> array(
 				TOPICS_TABLE	=> 't',
@@ -1314,7 +1334,7 @@
 
 		$this->sql = array(
 			'SELECT'	=> 'f.forum_id, f.forum_name,
-							t.topic_id, t.topic_title, t.topic_poster, t.topic_first_poster_name, t.topic_replies, t.topic_views, t.topic_time,
+							t.topic_id, t.topic_title, t.topic_poster, t.topic_first_poster_name, t.topic_replies, t.topic_replies_real, t.topic_views, t.topic_time,
 							p.post_id, p.post_time, p.post_text, p.bbcode_bitfield, p.bbcode_uid, p.enable_bbcode, p.enable_smilies, p.enable_magic_url',
 			'FROM'		=> array(
 				TOPICS_TABLE	=> 't',
@@ -1412,7 +1432,7 @@
 
 		$this->sql = array(
 			'SELECT'	=> 'f.forum_id, f.forum_name,
-							t.topic_id, t.topic_title, t.topic_replies, t.topic_views,
+							t.topic_id, t.topic_title, t.topic_replies, t.topic_replies_real, t.topic_views,
 							t.topic_last_poster_id, t.topic_last_poster_name, t.topic_last_post_time,
 							p.post_id, p.post_time, p.post_text, p.bbcode_bitfield, p.bbcode_uid, p.enable_bbcode, p.enable_smilies, p.enable_magic_url',
 			'FROM'		=> array(
diff -x .svn -aruN 3.0.7-PL1.src/includes/acm/acm_file.php 3.0.8.src/includes/acm/acm_file.php
--- 3.0.7-PL1.src/includes/acm/acm_file.php	2010-03-05 14:36:58.000000000 -0600
+++ 3.0.8.src/includes/acm/acm_file.php	2010-11-19 06:22:12.000000000 -0600
@@ -78,8 +78,14 @@
 
 		if (!$this->_write('data_global'))
 		{
+			if (!function_exists('phpbb_is_writable'))
+			{
+				global $phpbb_root_path;
+				include($phpbb_root_path . 'includes/functions.' . $phpEx);
+			}
+
 			// Now, this occurred how often? ... phew, just tell the user then...
-			if (!@is_writable($this->cache_dir))
+			if (!phpbb_is_writable($this->cache_dir))
 			{
 				// We need to use die() here, because else we may encounter an infinite loop (the message handler calls $cache->unload())
 				die($this->cache_dir . ' is NOT writable.');
@@ -707,7 +713,13 @@
 	*/
 	function remove_file($filename, $check = false)
 	{
-		if ($check && !@is_writable($this->cache_dir))
+		if (!function_exists('phpbb_is_writable'))
+		{
+			global $phpbb_root_path, $phpEx;
+			include($phpbb_root_path . 'includes/functions.' . $phpEx);
+		}
+
+		if ($check && !phpbb_is_writable($this->cache_dir))
 		{
 			// E_USER_ERROR - not using language entry - intended.
 			trigger_error('Unable to remove files within ' . $this->cache_dir . '. Please check directory permissions.', E_USER_ERROR);
diff -x .svn -aruN 3.0.7-PL1.src/includes/acm/acm_memcache.php 3.0.8.src/includes/acm/acm_memcache.php
--- 3.0.7-PL1.src/includes/acm/acm_memcache.php	2010-03-05 14:36:58.000000000 -0600
+++ 3.0.8.src/includes/acm/acm_memcache.php	2010-11-19 06:22:12.000000000 -0600
@@ -37,6 +37,12 @@
 	define('PHPBB_ACM_MEMCACHE_HOST', 'localhost');
 }
 
+if (!defined('PHPBB_ACM_MEMCACHE'))
+{
+	//can define multiple servers with host1/port1,host2/port2 format
+	define('PHPBB_ACM_MEMCACHE', PHPBB_ACM_MEMCACHE_HOST . '/' . PHPBB_ACM_MEMCACHE_PORT);
+}
+
 /**
 * ACM for Memcached
 * @package acm
@@ -54,7 +60,11 @@
 		parent::acm_memory();
 
 		$this->memcache = new Memcache;
-		$this->memcache->connect(PHPBB_ACM_MEMCACHE_HOST, PHPBB_ACM_MEMCACHE_PORT);
+		foreach(explode(',', PHPBB_ACM_MEMCACHE) as $u)
+		{
+			$parts = explode('/', $u);
+			$this->memcache->addServer(trim($parts[0]), trim($parts[1]));
+		}
 		$this->flags = (PHPBB_ACM_MEMCACHE_COMPRESS) ? MEMCACHE_COMPRESSED : 0;
 	}
 
@@ -125,4 +135,4 @@
 	}
 }
 
-?>
\ No newline at end of file
+?>
diff -x .svn -aruN 3.0.7-PL1.src/includes/acm/acm_memory.php 3.0.8.src/includes/acm/acm_memory.php
--- 3.0.7-PL1.src/includes/acm/acm_memory.php	2010-03-05 14:36:58.000000000 -0600
+++ 3.0.8.src/includes/acm/acm_memory.php	2010-11-19 06:22:12.000000000 -0600
@@ -407,7 +407,13 @@
 	*/
 	function remove_file($filename, $check = false)
 	{
-		if ($check && !@is_writable($this->cache_dir))
+		if (!function_exists('phpbb_is_writable'))
+		{
+			global $phpbb_root_path, $phpEx;
+			include($phpbb_root_path . 'includes/functions.' . $phpEx);
+		}
+
+		if ($check && !phpbb_is_writable($this->cache_dir))
 		{
 			// E_USER_ERROR - not using language entry - intended.
 			trigger_error('Unable to remove files within ' . $this->cache_dir . '. Please check directory permissions.', E_USER_ERROR);
diff -x .svn -aruN 3.0.7-PL1.src/includes/acp/acp_attachments.php 3.0.8.src/includes/acp/acp_attachments.php
--- 3.0.7-PL1.src/includes/acp/acp_attachments.php	2010-03-05 14:36:58.000000000 -0600
+++ 3.0.8.src/includes/acp/acp_attachments.php	2010-11-19 06:22:12.000000000 -0600
@@ -90,6 +90,7 @@
 				$s_assigned_groups = array();
 				while ($row = $db->sql_fetchrow($result))
 				{
+					$row['group_name'] = (isset($user->lang['EXT_GROUP_' . $row['group_name']])) ? $user->lang['EXT_GROUP_' . $row['group_name']] : $row['group_name'];
 					$s_assigned_groups[$row['cat_id']][] = $row['group_name'];
 				}
 				$db->sql_freeresult($result);
@@ -494,6 +495,10 @@
 						$sql = 'SELECT group_id
 							FROM ' . EXTENSION_GROUPS_TABLE . "
 							WHERE LOWER(group_name) = '" . $db->sql_escape(utf8_strtolower($new_group_name)) . "'";
+						if ($group_id)
+						{
+							$sql .= ' AND group_id <> ' . $group_id;
+						}
 						$result = $db->sql_query($sql);
 
 						if ($db->sql_fetchrow($result))
@@ -551,6 +556,7 @@
 							$group_id = $db->sql_nextid();
 						}
 
+						$group_name = (isset($user->lang['EXT_GROUP_' . $group_name])) ? $user->lang['EXT_GROUP_' . $group_name] : $group_name;
 						add_log('admin', 'LOG_ATTACH_EXTGROUP_' . strtoupper($action), $group_name);
 					}
 
@@ -858,7 +864,7 @@
 						'U_EDIT'		=> $this->u_action . "&amp;action=edit&amp;g={$row['group_id']}",
 						'U_DELETE'		=> $this->u_action . "&amp;action=delete&amp;g={$row['group_id']}",
 
-						'GROUP_NAME'	=> $row['group_name'],
+						'GROUP_NAME'	=> (isset($user->lang['EXT_GROUP_' . $row['group_name']])) ? $user->lang['EXT_GROUP_' . $row['group_name']] : $row['group_name'],
 						'CATEGORY'		=> $cat_lang[$row['cat_id']],
 						)
 					);
@@ -1118,6 +1124,7 @@
 		$group_name = array();
 		while ($row = $db->sql_fetchrow($result))
 		{
+			$row['group_name'] = (isset($user->lang['EXT_GROUP_' . $row['group_name']])) ? $user->lang['EXT_GROUP_' . $row['group_name']] : $row['group_name'];
 			$group_name[] = $row;
 		}
 		$db->sql_freeresult($result);
@@ -1215,7 +1222,7 @@
 			return;
 		}
 
-		if (!is_writable($phpbb_root_path . $upload_dir))
+		if (!phpbb_is_writable($phpbb_root_path . $upload_dir))
 		{
 			$error[] = sprintf($user->lang['NO_WRITE_UPLOAD'], $upload_dir);
 			return;
diff -x .svn -aruN 3.0.7-PL1.src/includes/acp/acp_ban.php 3.0.8.src/includes/acp/acp_ban.php
--- 3.0.7-PL1.src/includes/acp/acp_ban.php	2010-03-05 14:36:58.000000000 -0600
+++ 3.0.8.src/includes/acp/acp_ban.php	2010-11-19 06:22:12.000000000 -0600
@@ -224,7 +224,7 @@
 				$template->assign_block_vars('ban_reason', array(
 					'BAN_ID'	=> $ban_id,
 					'REASON'	=> $reason,
-					'A_REASON'	=> addslashes(htmlspecialchars_decode($reason)),
+					'A_REASON'	=> addslashes($reason),
 				));
 			}
 		}
@@ -236,7 +236,7 @@
 				$template->assign_block_vars('ban_give_reason', array(
 					'BAN_ID'	=> $ban_id,
 					'REASON'	=> $reason,
-					'A_REASON'	=> addslashes(htmlspecialchars_decode($reason)),
+					'A_REASON'	=> addslashes($reason),
 				));
 			}
 		}
diff -x .svn -aruN 3.0.7-PL1.src/includes/acp/acp_board.php 3.0.8.src/includes/acp/acp_board.php
--- 3.0.7-PL1.src/includes/acp/acp_board.php	2010-03-05 14:36:58.000000000 -0600
+++ 3.0.8.src/includes/acp/acp_board.php	2010-11-19 06:22:12.000000000 -0600
@@ -58,7 +58,7 @@
 						'board_disable_msg'		=> false,
 						'default_lang'			=> array('lang' => 'DEFAULT_LANGUAGE',		'validate' => 'lang',	'type' => 'select', 'function' => 'language_select', 'params' => array('{CONFIG_VALUE}'), 'explain' => false),
 						'default_dateformat'	=> array('lang' => 'DEFAULT_DATE_FORMAT',	'validate' => 'string',	'type' => 'custom', 'method' => 'dateformat_select', 'explain' => true),
-						'board_timezone'		=> array('lang' => 'SYSTEM_TIMEZONE',		'validate' => 'string',	'type' => 'select', 'function' => 'tz_select', 'params' => array('{CONFIG_VALUE}', 1), 'explain' => false),
+						'board_timezone'		=> array('lang' => 'SYSTEM_TIMEZONE',		'validate' => 'string',	'type' => 'select', 'function' => 'tz_select', 'params' => array('{CONFIG_VALUE}', 1), 'explain' => true),
 						'board_dst'				=> array('lang' => 'SYSTEM_DST',			'validate' => 'bool',	'type' => 'radio:yes_no', 'explain' => false),
 						'default_style'			=> array('lang' => 'DEFAULT_STYLE',			'validate' => 'int',	'type' => 'select', 'function' => 'style_select', 'params' => array('{CONFIG_VALUE}', false), 'explain' => false),
 						'override_user_style'	=> array('lang' => 'OVERRIDE_STYLE',		'validate' => 'bool',	'type' => 'radio:yes_no', 'explain' => true),
@@ -319,6 +319,7 @@
 						'load_online_guests'	=> array('lang' => 'YES_ONLINE_GUESTS',		'validate' => 'bool',	'type' => 'radio:yes_no', 'explain' => true),
 						'load_onlinetrack'		=> array('lang' => 'YES_ONLINE_TRACK',		'validate' => 'bool',	'type' => 'radio:yes_no', 'explain' => true),
 						'load_birthdays'		=> array('lang' => 'YES_BIRTHDAYS',			'validate' => 'bool',	'type' => 'radio:yes_no', 'explain' => true),
+						'load_unreads_search'	=> array('lang' => 'YES_UNREAD_SEARCH',		'validate' => 'bool',	'type' => 'radio:yes_no', 'explain' => false),
 						'load_moderators'		=> array('lang' => 'YES_MODERATORS',		'validate' => 'bool',	'type' => 'radio:yes_no', 'explain' => false),
 						'load_jumpbox'			=> array('lang' => 'YES_JUMPBOX',			'validate' => 'bool',	'type' => 'radio:yes_no', 'explain' => false),
 						'load_user_activity'	=> array('lang' => 'LOAD_USER_ACTIVITY',	'validate' => 'bool',	'type' => 'radio:yes_no', 'explain' => true),
@@ -888,8 +889,8 @@
 		$old_tz = $user->timezone;
 		$old_dst = $user->dst;
 
-		$user->timezone = $config['board_timezone'];
-		$user->dst = $config['board_dst'];
+		$user->timezone = $config['board_timezone'] * 3600;
+		$user->dst = $config['board_dst'] * 3600;
 
 		$dateformat_options = '';
 
diff -x .svn -aruN 3.0.7-PL1.src/includes/acp/acp_captcha.php 3.0.8.src/includes/acp/acp_captcha.php
--- 3.0.7-PL1.src/includes/acp/acp_captcha.php	2010-03-05 14:36:58.000000000 -0600
+++ 3.0.8.src/includes/acp/acp_captcha.php	2010-11-19 06:22:12.000000000 -0600
@@ -89,14 +89,14 @@
 					}
 					else
 					{
-						trigger_error($user->lang['CAPTCHA_UNAVAILABLE'] . adm_back_link($this->u_action));
+						trigger_error($user->lang['CAPTCHA_UNAVAILABLE'] . adm_back_link($this->u_action), E_USER_WARNING);
 					}
 				}
 				trigger_error($user->lang['CONFIG_UPDATED'] . adm_back_link($this->u_action));
 			}
 			else if ($submit)
 			{
-				trigger_error($user->lang['FORM_INVALID'] . adm_back_link());
+				trigger_error($user->lang['FORM_INVALID'] . adm_back_link(), E_USER_WARNING);
 			}
 			else
 			{
diff -x .svn -aruN 3.0.7-PL1.src/includes/acp/acp_database.php 3.0.8.src/includes/acp/acp_database.php
--- 3.0.7-PL1.src/includes/acp/acp_database.php	2010-03-05 14:36:58.000000000 -0600
+++ 3.0.8.src/includes/acp/acp_database.php	2010-11-19 06:22:12.000000000 -0600
@@ -109,6 +109,7 @@
 
 							case 'mssql':
 							case 'mssql_odbc':
+							case 'mssqlnative':
 								$extractor = new mssql_extractor($download, $store, $format, $filename, $time);
 							break;
 
@@ -138,6 +139,7 @@
 
 									case 'mssql':
 									case 'mssql_odbc':
+									case 'mssqlnative':
 										$extractor->flush('TRUNCATE TABLE ' . $table_name . "GO\n");
 									break;
 
@@ -392,6 +394,7 @@
 
 								case 'mssql':
 								case 'mssql_odbc':
+								case 'mssqlnative':
 									while (($sql = $fgetd($fp, "GO\n", $read, $seek, $eof)) !== false)
 									{
 										$db->sql_query($sql);
@@ -435,7 +438,7 @@
 								{
 									if (in_array($matches[2], $methods))
 									{
-										$backup_files[gmdate("d-m-Y H:i:s", $matches[1])] = $file;
+										$backup_files[(int) $matches[1]] = $file;
 									}
 								}
 							}
@@ -450,7 +453,7 @@
 							{
 								$template->assign_block_vars('files', array(
 									'FILE'		=> $file,
-									'NAME'		=> $name,
+									'NAME'		=> $user->format_date($name, 'd-m-Y H:i:s', true),
 									'SUPPORTED'	=> true,
 								));
 							}
@@ -1509,6 +1512,10 @@
 		{
 			$this->write_data_mssql($table_name);
 		}
+		else if($db->sql_layer === 'mssqlnative')
+		{
+			$this->write_data_mssqlnative($table_name);
+		}
 		else
 		{
 			$this->write_data_odbc($table_name);
@@ -1608,7 +1615,111 @@
 		}
 		$this->flush($sql_data);
 	}
+	
+	function write_data_mssqlnative($table_name)
+	{
+		global $db;
+		$ary_type = $ary_name = array();
+		$ident_set = false;
+		$sql_data = '';
+
+		// Grab all of the data from current table.
+		$sql = "SELECT * FROM $table_name";
+		$db->mssqlnative_set_query_options(array('Scrollable' => SQLSRV_CURSOR_STATIC));
+		$result = $db->sql_query($sql);
+
+		$retrieved_data = $db->mssqlnative_num_rows($result);
+
+		if (!$retrieved_data)
+		{
+			$db->sql_freeresult($result);
+			return;
+		}
+
+		$sql = "SELECT * FROM $table_name";
+		$result_fields = $db->sql_query_limit($sql, 1);
+
+		$row = new result_mssqlnative($result_fields);
+		$i_num_fields = $row->num_fields();
+		
+		for ($i = 0; $i < $i_num_fields; $i++)
+		{
+			$ary_type[$i] = $row->field_type($i);
+			$ary_name[$i] = $row->field_name($i);
+		}
+		$db->sql_freeresult($result_fields);
 
+		$sql = "SELECT 1 as has_identity
+			FROM INFORMATION_SCHEMA.COLUMNS
+			WHERE COLUMNPROPERTY(object_id('$table_name'), COLUMN_NAME, 'IsIdentity') = 1";
+		$result2 = $db->sql_query($sql);
+		$row2 = $db->sql_fetchrow($result2);
+		
+		if (!empty($row2['has_identity']))
+		{
+			$sql_data .= "\nSET IDENTITY_INSERT $table_name ON\nGO\n";
+			$ident_set = true;
+		}
+		$db->sql_freeresult($result2);
+
+		while ($row = $db->sql_fetchrow($result))
+		{
+			$schema_vals = $schema_fields = array();
+
+			// Build the SQL statement to recreate the data.
+			for ($i = 0; $i < $i_num_fields; $i++)
+			{
+				$str_val = $row[$ary_name[$i]];
+
+				// defaults to type number - better quote just to be safe, so check for is_int too
+				if (is_int($ary_type[$i]) || preg_match('#char|text|bool|varbinary#i', $ary_type[$i]))
+				{
+					$str_quote = '';
+					$str_empty = "''";
+					$str_val = sanitize_data_mssql(str_replace("'", "''", $str_val));
+				}
+				else if (preg_match('#date|timestamp#i', $ary_type[$i]))
+				{
+					if (empty($str_val))
+					{
+						$str_quote = '';
+					}
+					else
+					{
+						$str_quote = "'";
+					}
+				}
+				else
+				{
+					$str_quote = '';
+					$str_empty = 'NULL';
+				}
+
+				if (empty($str_val) && $str_val !== '0' && !(is_int($str_val) || is_float($str_val)))
+				{
+					$str_val = $str_empty;
+				}
+
+				$schema_vals[$i] = $str_quote . $str_val . $str_quote;
+				$schema_fields[$i] = $ary_name[$i];
+			}
+
+			// Take the ordered fields and their associated data and build it
+			// into a valid sql statement to recreate that field in the data.
+			$sql_data .= "INSERT INTO $table_name (" . implode(', ', $schema_fields) . ') VALUES (' . implode(', ', $schema_vals) . ");\nGO\n";
+
+			$this->flush($sql_data);
+			$sql_data = '';
+		}
+		$db->sql_freeresult($result);
+
+		if ($ident_set)
+		{
+			$sql_data .= "\nSET IDENTITY_INSERT $table_name OFF\nGO\n";
+		}
+		$this->flush($sql_data);
+	}	
+	
 	function write_data_odbc($table_name)
 	{
 		global $db;
diff -x .svn -aruN 3.0.7-PL1.src/includes/acp/acp_forums.php 3.0.8.src/includes/acp/acp_forums.php
--- 3.0.7-PL1.src/includes/acp/acp_forums.php	2010-03-05 14:36:58.000000000 -0600
+++ 3.0.8.src/includes/acp/acp_forums.php	2010-11-19 06:22:12.000000000 -0600
@@ -169,7 +169,7 @@
 						$forum_data['forum_status'] = ITEM_UNLOCKED;
 					}
 
-					$forum_data['show_active'] = ($forum_data['forum_type'] == FORUM_POST) ? request_var('display_recent', true) : request_var('display_active', true);
+					$forum_data['show_active'] = ($forum_data['forum_type'] == FORUM_POST) ? request_var('display_recent', true) : request_var('display_active', false);
 
 					// Get data for forum rules if specified...
 					if ($forum_data['forum_rules'])
@@ -190,12 +190,14 @@
 						$forum_perm_from = request_var('forum_perm_from', 0);
 						$cache->destroy('sql', FORUMS_TABLE);
 
+						$copied_permissions = false;
 						// Copy permissions?
 						if ($forum_perm_from && $forum_perm_from != $forum_data['forum_id'] &&
 							($action != 'edit' || empty($forum_id) || ($auth->acl_get('a_fauth') && $auth->acl_get('a_authusers') && $auth->acl_get('a_authgroups') && $auth->acl_get('a_mauth'))))
 						{
 							copy_forum_permissions($forum_perm_from, $forum_data['forum_id'], ($action == 'edit') ? true : false);
 							cache_moderators();
+							$copied_permissions = true;
 						}
 /* Commented out because of questionable UI workflow - re-visit for 3.0.7
 						else if (!$this->parent_id && $action != 'edit' && $auth->acl_get('a_fauth') && $auth->acl_get('a_authusers') && $auth->acl_get('a_authgroups') && $auth->acl_get('a_mauth'))
@@ -211,13 +213,13 @@
 						$message = ($action == 'add') ? $user->lang['FORUM_CREATED'] : $user->lang['FORUM_UPDATED'];
 
 						// Redirect to permissions
-						if ($auth->acl_get('a_fauth'))
+						if ($auth->acl_get('a_fauth') && !$copied_permissions)
 						{
 							$message .= '<br /><br />' . sprintf($user->lang['REDIRECT_ACL'], '<a href="' . append_sid("{$phpbb_admin_path}index.$phpEx", 'i=permissions' . $acl_url) . '">', '</a>');
 						}
 
 						// redirect directly to permission settings screen if authed
-						if ($action == 'add' && !$forum_perm_from && $auth->acl_get('a_fauth'))
+						if ($action == 'add' && !$copied_permissions && $auth->acl_get('a_fauth'))
 						{
 							meta_refresh(4, append_sid("{$phpbb_admin_path}index.$phpEx", 'i=permissions' . $acl_url));
 						}
@@ -639,7 +641,8 @@
 					'S_PRUNE_OLD_POLLS'			=> ($forum_data['forum_flags'] & FORUM_FLAG_PRUNE_POLL) ? true : false,
 					'S_PRUNE_ANNOUNCE'			=> ($forum_data['forum_flags'] & FORUM_FLAG_PRUNE_ANNOUNCE) ? true : false,
 					'S_PRUNE_STICKY'			=> ($forum_data['forum_flags'] & FORUM_FLAG_PRUNE_STICKY) ? true : false,
-					'S_DISPLAY_ACTIVE_TOPICS'	=> ($forum_data['forum_flags'] & FORUM_FLAG_ACTIVE_TOPICS) ? true : false,
+					'S_DISPLAY_ACTIVE_TOPICS'	=> ($forum_data['forum_type'] == FORUM_POST) ? ($forum_data['forum_flags'] & FORUM_FLAG_ACTIVE_TOPICS) : true,
+					'S_ENABLE_ACTIVE_TOPICS'	=> ($forum_data['forum_type'] == FORUM_CAT) ? ($forum_data['forum_flags'] & FORUM_FLAG_ACTIVE_TOPICS) : false,
 					'S_ENABLE_POST_REVIEW'		=> ($forum_data['forum_flags'] & FORUM_FLAG_POST_REVIEW) ? true : false,
 					'S_ENABLE_QUICK_REPLY'		=> ($forum_data['forum_flags'] & FORUM_FLAG_QUICK_REPLY) ? true : false,
 					'S_CAN_COPY_PERMISSIONS'	=> ($action != 'edit' || empty($forum_id) || ($auth->acl_get('a_fauth') && $auth->acl_get('a_authusers') && $auth->acl_get('a_authgroups') && $auth->acl_get('a_mauth'))) ? true : false,
@@ -980,7 +983,7 @@
 
 				if (!$row)
 				{
-					trigger_error($user->lang['PARENT_NOT_EXIST'] . adm_back_link($this->u_action . '&amp;' . $this->parent_id), E_USER_WARNING);
+					trigger_error($user->lang['PARENT_NOT_EXIST'] . adm_back_link($this->u_action . '&amp;parent_id=' . $this->parent_id), E_USER_WARNING);
 				}
 
 				if ($row['forum_type'] == FORUM_LINK)
@@ -1639,6 +1642,9 @@
 
 		delete_attachments('topic', $topic_ids, false);
 
+		// Delete shadow topics pointing to topics in this forum
+		delete_topic_shadows($forum_id);
+
 		// Before we remove anything we make sure we are able to adjust the post counts later. ;)
 		$sql = 'SELECT poster_id
 			FROM ' . POSTS_TABLE . '
@@ -1705,6 +1711,9 @@
 					)
 				);
 
+				// Amount of rows we select and delete in one iteration.
+				$batch_size = 500;
+
 				foreach ($tables_ary as $field => $tables)
 				{
 					$start = 0;
@@ -1714,7 +1723,7 @@
 						$sql = "SELECT $field
 							FROM " . POSTS_TABLE . '
 							WHERE forum_id = ' . $forum_id;
-						$result = $db->sql_query_limit($sql, 500, $start);
+						$result = $db->sql_query_limit($sql, $batch_size, $start);
 
 						$ids = array();
 						while ($row = $db->sql_fetchrow($result))
@@ -1733,7 +1742,7 @@
 							}
 						}
 					}
-					while ($row);
+					while (sizeof($ids) == $batch_size);
 				}
 				unset($ids);
 
diff -x .svn -aruN 3.0.7-PL1.src/includes/acp/acp_groups.php 3.0.8.src/includes/acp/acp_groups.php
--- 3.0.7-PL1.src/includes/acp/acp_groups.php	2010-03-05 14:36:58.000000000 -0600
+++ 3.0.8.src/includes/acp/acp_groups.php	2010-11-19 06:22:12.000000000 -0600
@@ -49,7 +49,7 @@
 
 
 		// Clear some vars
-		$can_upload = (file_exists($phpbb_root_path . $config['avatar_path']) && @is_writable($phpbb_root_path . $config['avatar_path']) && $file_uploads) ? true : false;
+		$can_upload = (file_exists($phpbb_root_path . $config['avatar_path']) && phpbb_is_writable($phpbb_root_path . $config['avatar_path']) && $file_uploads) ? true : false;
 		$group_row = array();
 
 		// Grab basic data for group, if group_id is set and exists
@@ -394,6 +394,15 @@
 						}
 					}
 
+					// Validate the length of "Maximum number of allowed recipients per private message" setting.
+					// We use 16777215 as a maximum because it matches MySQL unsigned mediumint maximum value
+					// which is the lowest amongst DBMSes supported by phpBB3
+					if ($max_recipients_error = validate_data($submit_ary, array('max_recipients' => array('num', false, 0, 16777215))))
+					{
+						// Replace "error" string with its real, localised form
+						$error = array_merge($error, array_map(array(&$user, 'lang'), $max_recipients_error));
+					}
+
 					if (!sizeof($error))
 					{
 						// Only set the rank, colour, etc. if it's changed or if we're adding a new
diff -x .svn -aruN 3.0.7-PL1.src/includes/acp/acp_language.php 3.0.8.src/includes/acp/acp_language.php
--- 3.0.7-PL1.src/includes/acp/acp_language.php	2010-03-05 14:36:58.000000000 -0600
+++ 3.0.8.src/includes/acp/acp_language.php	2010-11-19 06:22:12.000000000 -0600
@@ -1120,12 +1120,12 @@
 		{
 			while (($file = readdir($dp)) !== false)
 			{
-				if (!is_dir($phpbb_root_path . 'language/' . $file))
+				if ($file[0] == '.' || !is_dir($phpbb_root_path . 'language/' . $file))
 				{
 					continue;
 				}
 
-				if ($file[0] != '.' && file_exists("{$phpbb_root_path}language/$file/iso.txt"))
+				if (file_exists("{$phpbb_root_path}language/$file/iso.txt"))
 				{
 					if (!in_array($file, $installed))
 					{
diff -x .svn -aruN 3.0.7-PL1.src/includes/acp/acp_php_info.php 3.0.8.src/includes/acp/acp_php_info.php
--- 3.0.7-PL1.src/includes/acp/acp_php_info.php	2010-03-05 14:36:58.000000000 -0600
+++ 3.0.8.src/includes/acp/acp_php_info.php	2010-11-19 06:22:12.000000000 -0600
@@ -35,9 +35,9 @@
 
 		$this->tpl_name = 'acp_php_info';
 		$this->page_title = 'ACP_PHP_INFO';
-		
+
 		ob_start();
-		@phpinfo(INFO_GENERAL | INFO_CONFIGURATION | INFO_MODULES | INFO_VARIABLES);
+		phpinfo(INFO_GENERAL | INFO_CONFIGURATION | INFO_MODULES | INFO_VARIABLES);
 		$phpinfo = ob_get_clean();
 
 		$phpinfo = trim($phpinfo);
diff -x .svn -aruN 3.0.7-PL1.src/includes/acp/acp_profile.php 3.0.8.src/includes/acp/acp_profile.php
--- 3.0.7-PL1.src/includes/acp/acp_profile.php	2010-03-05 14:36:58.000000000 -0600
+++ 3.0.8.src/includes/acp/acp_profile.php	2010-11-19 06:22:12.000000000 -0600
@@ -1480,6 +1480,7 @@
 
 			case 'mssql':
 			case 'mssql_odbc':
+			case 'mssqlnative':
 
 				// We are defining the biggest common value, because of the possibility to edit the min/max values of each field.
 				$sql = 'ALTER TABLE [' . PROFILE_FIELDS_DATA_TABLE . "] ADD [$field_ident] ";
diff -x .svn -aruN 3.0.7-PL1.src/includes/acp/acp_prune.php 3.0.8.src/includes/acp/acp_prune.php
--- 3.0.7-PL1.src/includes/acp/acp_prune.php	2010-03-05 14:36:58.000000000 -0600
+++ 3.0.8.src/includes/acp/acp_prune.php	2010-11-19 06:22:12.000000000 -0600
@@ -315,8 +315,8 @@
 					'mode'			=> $mode,
 					'prune'			=> 1,
 
-					'users'			=> request_var('users', '', true),
-					'username'		=> request_var('username', '', true),
+					'users'			=> utf8_normalize_nfc(request_var('users', '', true)),
+					'username'		=> utf8_normalize_nfc(request_var('username', '', true)),
 					'email'			=> request_var('email', ''),
 					'joined_select'	=> request_var('joined_select', ''),
 					'joined'		=> request_var('joined', ''),
@@ -369,7 +369,7 @@
 	{
 		global $user, $db;
 
-		$users = request_var('users', '', true);
+		$users = utf8_normalize_nfc(request_var('users', '', true));
 		
 		if ($users)
 		{
@@ -378,7 +378,7 @@
 		}
 		else
 		{
-			$username = request_var('username', '', true);
+			$username = utf8_normalize_nfc(request_var('username', '', true));
 			$email = request_var('email', '');
 
 			$joined_select = request_var('joined_select', 'lt');
diff -x .svn -aruN 3.0.7-PL1.src/includes/acp/acp_reasons.php 3.0.8.src/includes/acp/acp_reasons.php
--- 3.0.7-PL1.src/includes/acp/acp_reasons.php	2010-03-05 14:36:58.000000000 -0600
+++ 3.0.8.src/includes/acp/acp_reasons.php	2010-11-19 06:22:12.000000000 -0600
@@ -233,6 +233,7 @@
 						// Standard? What's that?
 						case 'mssql':
 						case 'mssql_odbc':
+						case 'mssqlnative':
 							// Change the reports using this reason to 'other'
 							$sql = "DECLARE @ptrval binary(16)
 
diff -x .svn -aruN 3.0.7-PL1.src/includes/acp/acp_styles.php 3.0.8.src/includes/acp/acp_styles.php
--- 3.0.7-PL1.src/includes/acp/acp_styles.php	2010-03-05 14:36:58.000000000 -0600
+++ 3.0.8.src/includes/acp/acp_styles.php	2010-11-19 06:22:12.000000000 -0600
@@ -643,13 +643,13 @@
 		{
 			while (($file = readdir($dp)) !== false)
 			{
-				if (!is_dir($phpbb_root_path . 'styles/' . $file))
+				if ($file[0] == '.' || !is_dir($phpbb_root_path . 'styles/' . $file))
 				{
 					continue;
 				}
 
 				$subpath = ($mode != 'style') ? "$mode/" : '';
-				if ($file[0] != '.' && file_exists("{$phpbb_root_path}styles/$file/$subpath$mode.cfg"))
+				if (file_exists("{$phpbb_root_path}styles/$file/$subpath$mode.cfg"))
 				{
 					if ($cfg = file("{$phpbb_root_path}styles/$file/$subpath$mode.cfg"))
 					{
@@ -748,7 +748,7 @@
 			$additional = '';
 
 			// If the template is stored on the filesystem try to write the file else store it in the database
-			if (!$safe_mode && !$template_info['template_storedb'] && file_exists($file) && @is_writable($file))
+			if (!$safe_mode && !$template_info['template_storedb'] && file_exists($file) && phpbb_is_writable($file))
 			{
 				if (!($fp = @fopen($file, 'wb')))
 				{
@@ -1155,7 +1155,7 @@
 			$message = $user->lang['THEME_UPDATED'];
 
 			// If the theme is stored on the filesystem try to write the file else store it in the database
-			if (!$safe_mode && !$theme_info['theme_storedb'] && file_exists($file) && @is_writable($file))
+			if (!$safe_mode && !$theme_info['theme_storedb'] && file_exists($file) && phpbb_is_writable($file))
 			{
 				if (!($fp = @fopen($file, 'wb')))
 				{
@@ -2040,23 +2040,18 @@
 			{
 				case 'tar':
 					$ext = '.tar';
-					$mimetype = 'x-tar';
-					$compress = 'compress_tar';
 				break;
 
 				case 'zip':
 					$ext = '.zip';
-					$mimetype = 'zip';
 				break;
 
 				case 'tar.gz':
 					$ext = '.tar.gz';
-					$mimetype = 'x-gzip';
 				break;
 
 				case 'tar.bz2':
 					$ext = '.tar.bz2';
-					$mimetype = 'x-bzip2';
 				break;
 
 				default:
@@ -2246,7 +2241,7 @@
 			{
 				// a rather elaborate check we have to do here once to avoid trouble later
 				$check = "{$phpbb_root_path}styles/" . $style_row["{$mode}_path"] . (($mode === 'theme') ? '/theme/stylesheet.css' : '/template');
-				if (($style_row["{$mode}_storedb"] != $store_db) && !$store_db && ($safe_mode || !@is_writable($check)))
+				if (($style_row["{$mode}_storedb"] != $store_db) && !$store_db && ($safe_mode || !phpbb_is_writable($check)))
 				{
 					$error[] = $user->lang['EDIT_' . strtoupper($mode) . '_STORED_DB'];
 					$store_db = 1;
@@ -2326,7 +2321,7 @@
 						{
 							$theme_data = $this->db_theme_data($style_row);
 						}
-						else if (!$store_db && !$safe_mode && @is_writable("{$phpbb_root_path}styles/{$style_row['theme_path']}/theme/stylesheet.css"))
+						else if (!$store_db && !$safe_mode && phpbb_is_writable("{$phpbb_root_path}styles/{$style_row['theme_path']}/theme/stylesheet.css"))
 						{
 							$store_db = 1;
 							$theme_data = $style_row['theme_data'];
@@ -2357,7 +2352,7 @@
 						}
 						else
 						{
-							if (!$store_db && !$safe_mode && @is_writable("{$phpbb_root_path}styles/{$style_row['template_path']}/template"))
+							if (!$store_db && !$safe_mode && phpbb_is_writable("{$phpbb_root_path}styles/{$style_row['template_path']}/template"))
 							{
 								$err = $this->store_in_fs('template', $style_row['template_id']);
 								if ($err)
@@ -2531,13 +2526,21 @@
 
 		// Match CSS imports
 		$matches = array();
-		preg_match_all('/@import url\(["\'](.*)["\']\);/i', $stylesheet, $matches);
+		preg_match_all('/@import url\((["\'])(.*)\1\);/i', $stylesheet, $matches);
+
+		// remove commented stylesheets (very simple parser, allows only whitespace
+		// around an @import statement)
+		preg_match_all('#/\*\s*@import url\((["\'])(.*)\1\);\s\*/#i', $stylesheet, $commented);
+		$matches[2] = array_diff($matches[2], $commented[2]);
 
 		if (sizeof($matches))
 		{
 			foreach ($matches[0] as $idx => $match)
 			{
-				$stylesheet = str_replace($match, acp_styles::load_css_file($theme_row['theme_path'], $matches[1][$idx]), $stylesheet);
+				if (isset($matches[2][$idx]))
+				{
+					$stylesheet = str_replace($match, acp_styles::load_css_file($theme_row['theme_path'], $matches[2][$idx]), $stylesheet);
+				}
 			}
 		}
 
@@ -3728,7 +3731,7 @@
 
 		$store_db = 0;
 		$error = array();
-		if (!$safe_mode && @is_writable("{$phpbb_root_path}styles/{$path}/template"))
+		if (!$safe_mode && phpbb_is_writable("{$phpbb_root_path}styles/{$path}/template"))
 		{
 			$sql = 'SELECT *
 					FROM ' . STYLES_TEMPLATE_DATA_TABLE . "
diff -x .svn -aruN 3.0.7-PL1.src/includes/acp/acp_update.php 3.0.8.src/includes/acp/acp_update.php
--- 3.0.7-PL1.src/includes/acp/acp_update.php	2010-03-05 14:36:58.000000000 -0600
+++ 3.0.8.src/includes/acp/acp_update.php	2010-11-19 06:22:12.000000000 -0600
@@ -51,6 +51,14 @@
 		$announcement_url = (strpos($announcement_url, '&amp;') === false) ? str_replace('&', '&amp;', $announcement_url) : $announcement_url;
 		$update_link = append_sid($phpbb_root_path . 'install/index.' . $phpEx, 'mode=update');
 
+		// next feature release
+		$next_feature_version = $next_feature_announcement_url = false;
+		if (isset($info[2]) && trim($info[2]) !== '')
+		{
+			$next_feature_version = trim($info[2]);
+			$next_feature_announcement_url = trim($info[3]);
+		}
+
 		// Determine automatic update...
 		$sql = 'SELECT config_value
 			FROM ' . CONFIG_TABLE . "
@@ -74,8 +82,10 @@
 			'LATEST_VERSION'	=> $latest_version,
 			'CURRENT_VERSION'	=> $config['version'],
 			'AUTO_VERSION'		=> $version_update_from,
+			'NEXT_FEATURE_VERSION'	=> $next_feature_version,
 
 			'UPDATE_INSTRUCTIONS'	=> sprintf($user->lang['UPDATE_INSTRUCTIONS'], $announcement_url, $update_link),
+			'UPGRADE_INSTRUCTIONS'	=> $next_feature_version ? $user->lang('UPGRADE_INSTRUCTIONS', $next_feature_version, $next_feature_announcement_url) : false,
 		));
 	}
 }
diff -x .svn -aruN 3.0.7-PL1.src/includes/acp/acp_users.php 3.0.8.src/includes/acp/acp_users.php
--- 3.0.7-PL1.src/includes/acp/acp_users.php	2010-03-05 14:36:58.000000000 -0600
+++ 3.0.8.src/includes/acp/acp_users.php	2010-11-19 06:22:12.000000000 -0600
@@ -105,7 +105,7 @@
 				LEFT JOIN ' . SESSIONS_TABLE . ' s ON (s.session_user_id = u.user_id)
 			WHERE u.user_id = ' . $user_id . '
 			ORDER BY s.session_time DESC';
-		$result = $db->sql_query($sql);
+		$result = $db->sql_query_limit($sql, 1);
 		$user_row = $db->sql_fetchrow($result);
 		$db->sql_freeresult($result);
 
@@ -191,24 +191,31 @@
 							trigger_error($user->lang['CANNOT_REMOVE_YOURSELF'] . adm_back_link($this->u_action . '&amp;u=' . $user_id), E_USER_WARNING);
 						}
 
-						if (confirm_box(true))
+						if ($delete_type)
 						{
-							user_delete($delete_type, $user_id, $user_row['username']);
+							if (confirm_box(true))
+							{
+								user_delete($delete_type, $user_id, $user_row['username']);
 
-							add_log('admin', 'LOG_USER_DELETED', $user_row['username']);
-							trigger_error($user->lang['USER_DELETED'] . adm_back_link($this->u_action));
+								add_log('admin', 'LOG_USER_DELETED', $user_row['username']);
+								trigger_error($user->lang['USER_DELETED'] . adm_back_link($this->u_action));
+							}
+							else
+							{
+								confirm_box(false, $user->lang['CONFIRM_OPERATION'], build_hidden_fields(array(
+									'u'				=> $user_id,
+									'i'				=> $id,
+									'mode'			=> $mode,
+									'action'		=> $action,
+									'update'		=> true,
+									'delete'		=> 1,
+									'delete_type'	=> $delete_type))
+								);
+							}
 						}
 						else
 						{
-							confirm_box(false, $user->lang['CONFIRM_OPERATION'], build_hidden_fields(array(
-								'u'				=> $user_id,
-								'i'				=> $id,
-								'mode'			=> $mode,
-								'action'		=> $action,
-								'update'		=> true,
-								'delete'		=> 1,
-								'delete_type'	=> $delete_type))
-							);
+							trigger_error($user->lang['NO_MODE'] . adm_back_link($this->u_action . '&amp;u=' . $user_id), E_USER_WARNING);
 						}
 					}
 
@@ -224,6 +231,11 @@
 								trigger_error($user->lang['CANNOT_BAN_YOURSELF'] . adm_back_link($this->u_action . '&amp;u=' . $user_id), E_USER_WARNING);
 							}
 
+							if ($user_id == ANONYMOUS)
+							{
+								trigger_error($user->lang['CANNOT_BAN_ANONYMOUS'] . adm_back_link($this->u_action . '&amp;u=' . $user_id), E_USER_WARNING);
+							}
+
 							if ($user_row['user_type'] == USER_FOUNDER)
 							{
 								trigger_error($user->lang['CANNOT_BAN_FOUNDER'] . adm_back_link($this->u_action . '&amp;u=' . $user_id), E_USER_WARNING);
@@ -307,10 +319,7 @@
 
 								$server_url = generate_board_url();
 
-								$user_actkey = gen_rand_string(10);
-								$key_len = 54 - (strlen($server_url));
-								$key_len = ($key_len > 6) ? $key_len : 6;
-								$user_actkey = substr($user_actkey, 0, $key_len);
+								$user_actkey = gen_rand_string(mt_rand(6, 10));
 								$email_template = ($user_row['user_type'] == USER_NORMAL) ? 'user_reactivate_account' : 'user_resend_inactive';
 
 								if ($user_row['user_type'] == USER_NORMAL)
@@ -1550,6 +1559,31 @@
 							WHERE user_id = $user_id";
 						$db->sql_query($sql);
 
+						// Check if user has an active session
+						if ($user_row['session_id'])
+						{
+							// We'll update the session if user_allow_viewonline has changed and the user is a bot
+							// Or if it's a regular user and the admin set it to hide the session
+							if ($user_row['user_allow_viewonline'] != $sql_ary['user_allow_viewonline'] && $user_row['user_type'] == USER_IGNORE
+								|| $user_row['user_allow_viewonline'] && !$sql_ary['user_allow_viewonline'])
+							{
+								// We also need to check if the user has the permission to cloak.
+								$user_auth = new auth();
+								$user_auth->acl($user_row);
+
+								$session_sql_ary = array(
+									'session_viewonline'	=> ($user_auth->acl_get('u_hideonline')) ? $sql_ary['user_allow_viewonline'] : true,
+								);
+
+								$sql = 'UPDATE ' . SESSIONS_TABLE . '
+									SET ' . $db->sql_build_array('UPDATE', $session_sql_ary) . "
+									WHERE session_user_id = $user_id";
+								$db->sql_query($sql);
+
+								unset($user_auth);
+							}
+						}
+
 						trigger_error($user->lang['USER_PREFS_UPDATED'] . adm_back_link($this->u_action . '&amp;u=' . $user_id));
 					}
 
@@ -1664,7 +1698,7 @@
 				include($phpbb_root_path . 'includes/functions_display.' . $phpEx);
 				include($phpbb_root_path . 'includes/functions_user.' . $phpEx);
 
-				$can_upload = (file_exists($phpbb_root_path . $config['avatar_path']) && @is_writable($phpbb_root_path . $config['avatar_path']) && $file_uploads) ? true : false;
+				$can_upload = (file_exists($phpbb_root_path . $config['avatar_path']) && phpbb_is_writable($phpbb_root_path . $config['avatar_path']) && $file_uploads) ? true : false;
 
 				if ($submit)
 				{
@@ -1674,7 +1708,7 @@
 							trigger_error($user->lang['FORM_INVALID'] . adm_back_link($this->u_action . '&amp;u=' . $user_id), E_USER_WARNING);
 					}
 
-					if (avatar_process_user($error, $user_row))
+					if (avatar_process_user($error, $user_row, $can_upload))
 					{
 						trigger_error($user->lang['USER_AVATAR_UPDATED'] . adm_back_link($this->u_action . '&amp;u=' . $user_row['user_id']));
 					}
@@ -2084,7 +2118,7 @@
 									LEFT JOIN ' . SESSIONS_TABLE . ' s ON (s.session_user_id = u.user_id)
 								WHERE u.user_id = ' . $user_id . '
 								ORDER BY s.session_time DESC';
-							$result = $db->sql_query($sql);
+							$result = $db->sql_query_limit($sql, 1);
 							$user_row = $db->sql_fetchrow($result);
 							$db->sql_freeresult($result);
 						}
diff -x .svn -aruN 3.0.7-PL1.src/includes/acp/info/acp_board.php 3.0.8.src/includes/acp/info/acp_board.php
--- 3.0.7-PL1.src/includes/acp/info/acp_board.php	2010-03-05 14:36:58.000000000 -0600
+++ 3.0.8.src/includes/acp/info/acp_board.php	2010-11-19 06:22:12.000000000 -0600
@@ -24,7 +24,7 @@
 				'features'		=> array('title' => 'ACP_BOARD_FEATURES', 'auth' => 'acl_a_board', 'cat' => array('ACP_BOARD_CONFIGURATION')),
 				'avatar'		=> array('title' => 'ACP_AVATAR_SETTINGS', 'auth' => 'acl_a_board', 'cat' => array('ACP_BOARD_CONFIGURATION')),
 				'message'		=> array('title' => 'ACP_MESSAGE_SETTINGS', 'auth' => 'acl_a_board', 'cat' => array('ACP_BOARD_CONFIGURATION', 'ACP_MESSAGES')),
-				'post'			=> array('title' => 'ACP_POST_SETTINGS', 'auth' => 'acl_a_board', 'cat' => array('ACP_BOARD_CONFIGURATION')),
+				'post'			=> array('title' => 'ACP_POST_SETTINGS', 'auth' => 'acl_a_board', 'cat' => array('ACP_BOARD_CONFIGURATION', 'ACP_MESSAGES')),
 				'signature'		=> array('title' => 'ACP_SIGNATURE_SETTINGS', 'auth' => 'acl_a_board', 'cat' => array('ACP_BOARD_CONFIGURATION')),
 				'feed'			=> array('title' => 'ACP_FEED_SETTINGS', 'auth' => 'acl_a_board', 'cat' => array('ACP_BOARD_CONFIGURATION')),
 				'registration'	=> array('title' => 'ACP_REGISTER_SETTINGS', 'auth' => 'acl_a_board', 'cat' => array('ACP_BOARD_CONFIGURATION')),
diff -x .svn -aruN 3.0.7-PL1.src/includes/auth/auth_db.php 3.0.8.src/includes/auth/auth_db.php
--- 3.0.7-PL1.src/includes/auth/auth_db.php	2010-03-05 14:36:59.000000000 -0600
+++ 3.0.8.src/includes/auth/auth_db.php	2010-11-19 06:22:12.000000000 -0600
@@ -134,7 +134,8 @@
 				// increase login attempt count to make sure this cannot be exploited
 				$sql = 'UPDATE ' . USERS_TABLE . '
 					SET user_login_attempts = user_login_attempts + 1
-					WHERE user_id = ' . $row['user_id'];
+					WHERE user_id = ' . (int) $row['user_id'] . '
+						AND user_login_attempts < ' . LOGIN_ATTEMPTS_MAX;
 				$db->sql_query($sql);
 
 				return array(
@@ -194,7 +195,8 @@
 	// Password incorrect - increase login attempts
 	$sql = 'UPDATE ' . USERS_TABLE . '
 		SET user_login_attempts = user_login_attempts + 1
-		WHERE user_id = ' . $row['user_id'];
+		WHERE user_id = ' . (int) $row['user_id'] . '
+			AND user_login_attempts < ' . LOGIN_ATTEMPTS_MAX;
 	$db->sql_query($sql);
 
 	// Give status about wrong password...
diff -x .svn -aruN 3.0.7-PL1.src/includes/auth/auth_ldap.php 3.0.8.src/includes/auth/auth_ldap.php
--- 3.0.7-PL1.src/includes/auth/auth_ldap.php	2010-03-05 14:36:59.000000000 -0600
+++ 3.0.8.src/includes/auth/auth_ldap.php	2010-11-19 06:22:12.000000000 -0600
@@ -74,7 +74,7 @@
 
 	if ($search === false)
 	{
-		return $user->lang['LDAP_NO_SERVER_CONNECTION'];
+		return $user->lang['LDAP_SEARCH_FAILED'];
 	}
 
 	$result = @ldap_get_entries($ldap, $search);
diff -x .svn -aruN 3.0.7-PL1.src/includes/cache.php 3.0.8.src/includes/cache.php
--- 3.0.7-PL1.src/includes/cache.php	2010-03-05 14:36:57.000000000 -0600
+++ 3.0.8.src/includes/cache.php	2010-11-19 06:22:12.000000000 -0600
@@ -82,11 +82,20 @@
 			$result = $db->sql_query($sql);
 
 			$censors = array();
+			$unicode = ((version_compare(PHP_VERSION, '5.1.0', '>=') || (version_compare(PHP_VERSION, '5.0.0-dev', '<=') && version_compare(PHP_VERSION, '4.4.0', '>='))) && @preg_match('/\p{L}/u', 'a') !== false) ? true : false;
+
 			while ($row = $db->sql_fetchrow($result))
 			{
-				if ((version_compare(PHP_VERSION, '5.1.0', '>=') || (version_compare(PHP_VERSION, '5.0.0-dev', '<=') && version_compare(PHP_VERSION, '4.4.0', '>='))) && @preg_match('/\p{L}/u', 'a') !== false)
+				if ($unicode)
 				{
-					$censors['match'][] = '#(?<![\p{Nd}\p{L}_])(' . str_replace('\*', '[\p{Nd}\p{L}_]*?', preg_quote($row['word'], '#')) . ')(?![\p{Nd}\p{L}_])#iu';
+					// Unescape the asterisk to simplify further conversions
+					$row['word'] = str_replace('\*', '*', preg_quote($row['word'], '#'));
+					
+					// Replace the asterisk inside the pattern, at the start and at the end of it with regexes
+					$row['word'] = preg_replace(array('#(?<=[\p{Nd}\p{L}_])\*(?=[\p{Nd}\p{L}_])#iu', '#^\*#', '#\*$#'), array('([\x20]*?|[\p{Nd}\p{L}_-]*?)', '[\p{Nd}\p{L}_-]*?', '[\p{Nd}\p{L}_-]*?'), $row['word']);
+
+					// Generate the final substitution
+					$censors['match'][] = '#(?<![\p{Nd}\p{L}_-])(' . $row['word'] . ')(?![\p{Nd}\p{L}_-])#iu';
 				}
 				else
 				{
@@ -297,6 +306,7 @@
 			{
 				case 'mssql':
 				case 'mssql_odbc':
+				case 'mssqlnative':
 					$sql = 'SELECT user_id, bot_agent, bot_ip
 						FROM ' . BOTS_TABLE . '
 						WHERE bot_active = 1
diff -x .svn -aruN 3.0.7-PL1.src/includes/captcha/plugins/captcha_abstract.php 3.0.8.src/includes/captcha/plugins/captcha_abstract.php
--- 3.0.7-PL1.src/includes/captcha/plugins/captcha_abstract.php	2010-03-05 14:36:58.000000000 -0600
+++ 3.0.8.src/includes/captcha/plugins/captcha_abstract.php	2010-11-19 06:22:12.000000000 -0600
@@ -59,7 +59,7 @@
 	{
 		global $user;
 
-		$this->code = gen_rand_string(mt_rand(CAPTCHA_MIN_CHARS, CAPTCHA_MAX_CHARS));
+		$this->code = gen_rand_string_friendly(mt_rand(CAPTCHA_MIN_CHARS, CAPTCHA_MAX_CHARS));
 		$this->seed = hexdec(substr(unique_id(), 4, 10));
 
 		// compute $seed % 0x7fffffff
@@ -235,7 +235,7 @@
 	{
 		global $db, $user;
 
-		$this->code = gen_rand_string(mt_rand(CAPTCHA_MIN_CHARS, CAPTCHA_MAX_CHARS));
+		$this->code = gen_rand_string_friendly(mt_rand(CAPTCHA_MIN_CHARS, CAPTCHA_MAX_CHARS));
 		$this->confirm_id = md5(unique_id($user->ip));
 		$this->seed = hexdec(substr(unique_id(), 4, 10));
 		$this->solved = 0;
@@ -259,7 +259,7 @@
 	{
 		global $db, $user;
 
-		$this->code = gen_rand_string(mt_rand(CAPTCHA_MIN_CHARS, CAPTCHA_MAX_CHARS));
+		$this->code = gen_rand_string_friendly(mt_rand(CAPTCHA_MIN_CHARS, CAPTCHA_MAX_CHARS));
 		$this->seed = hexdec(substr(unique_id(), 4, 10));
 		$this->solved = 0;
 		// compute $seed % 0x7fffffff
@@ -281,7 +281,7 @@
 	{
 		global $db, $user;
 
-		$this->code = gen_rand_string(mt_rand(CAPTCHA_MIN_CHARS, CAPTCHA_MAX_CHARS));
+		$this->code = gen_rand_string_friendly(mt_rand(CAPTCHA_MIN_CHARS, CAPTCHA_MAX_CHARS));
 		$this->seed = hexdec(substr(unique_id(), 4, 10));
 		$this->solved = 0;
 		// compute $seed % 0x7fffffff
diff -x .svn -aruN 3.0.7-PL1.src/includes/captcha/plugins/phpbb_recaptcha_plugin.php 3.0.8.src/includes/captcha/plugins/phpbb_recaptcha_plugin.php
--- 3.0.7-PL1.src/includes/captcha/plugins/phpbb_recaptcha_plugin.php	2010-03-05 14:36:58.000000000 -0600
+++ 3.0.8.src/includes/captcha/plugins/phpbb_recaptcha_plugin.php	2010-11-19 06:22:12.000000000 -0600
@@ -314,10 +314,7 @@
 		}
 		else
 		{
-			if ($answers[1] === 'incorrect-captcha-sol')
-			{
-				return $user->lang['RECAPTCHA_INCORRECT'];
-			}
+			return $user->lang['RECAPTCHA_INCORRECT'];
 		}
 	}
 
diff -x .svn -aruN 3.0.7-PL1.src/includes/constants.php 3.0.8.src/includes/constants.php
--- 3.0.7-PL1.src/includes/constants.php	2010-03-05 14:36:59.000000000 -0600
+++ 3.0.8.src/includes/constants.php	2010-11-19 06:22:12.000000000 -0600
@@ -25,7 +25,7 @@
 */
 
 // phpBB Version
-define('PHPBB_VERSION', '3.0.7-PL1');
+define('PHPBB_VERSION', '3.0.8');
 
 // QA-related
 // define('PHPBB_QA', 1);
@@ -69,6 +69,10 @@
 define('LOGIN_ERROR_EXTERNAL_AUTH', 14);
 define('LOGIN_ERROR_PASSWORD_CONVERT', 15);
 
+// Maximum login attempts
+// The value is arbitrary, but it has to fit into the user_login_attempts field.
+define('LOGIN_ATTEMPTS_MAX', 100);
+
 // Group settings
 define('GROUP_OPEN', 0);
 define('GROUP_CLOSED', 1);
@@ -117,6 +121,10 @@
 define('NOTIFY_IM', 1);
 define('NOTIFY_BOTH', 2);
 
+// Notify status
+define('NOTIFY_YES', 0);
+define('NOTIFY_NO', 1);
+
 // Email Priority Settings
 define('MAIL_LOW_PRIORITY', 4);
 define('MAIL_NORMAL_PRIORITY', 3);
diff -x .svn -aruN 3.0.7-PL1.src/includes/db/db_tools.php 3.0.8.src/includes/db/db_tools.php
--- 3.0.7-PL1.src/includes/db/db_tools.php	2010-03-05 14:36:58.000000000 -0600
+++ 3.0.8.src/includes/db/db_tools.php	2010-11-19 06:22:12.000000000 -0600
@@ -160,6 +160,36 @@
 			'VARBINARY'	=> '[varchar] (255)',
 		),
 
+		'mssqlnative'	=> array(
+			'INT:'		=> '[int]',
+			'BINT'		=> '[float]',
+			'UINT'		=> '[int]',
+			'UINT:'		=> '[int]',
+			'TINT:'		=> '[int]',
+			'USINT'		=> '[int]',
+			'BOOL'		=> '[int]',
+			'VCHAR'		=> '[varchar] (255)',
+			'VCHAR:'	=> '[varchar] (%d)',
+			'CHAR:'		=> '[char] (%d)',
+			'XSTEXT'	=> '[varchar] (1000)',
+			'STEXT'		=> '[varchar] (3000)',
+			'TEXT'		=> '[varchar] (8000)',
+			'MTEXT'		=> '[text]',
+			'XSTEXT_UNI'=> '[varchar] (100)',
+			'STEXT_UNI'	=> '[varchar] (255)',
+			'TEXT_UNI'	=> '[varchar] (4000)',
+			'MTEXT_UNI'	=> '[text]',
+			'TIMESTAMP'	=> '[int]',
+			'DECIMAL'	=> '[float]',
+			'DECIMAL:'	=> '[float]',
+			'PDECIMAL'	=> '[float]',
+			'PDECIMAL:'	=> '[float]',
+			'VCHAR_UNI'	=> '[varchar] (255)',
+			'VCHAR_UNI:'=> '[varchar] (%d)',
+			'VCHAR_CI'	=> '[varchar] (255)',
+			'VARBINARY'	=> '[varchar] (255)',
+		),
+
 		'oracle'	=> array(
 			'INT:'		=> 'number(%d)',
 			'BINT'		=> 'number(20)',
@@ -261,7 +291,7 @@
 	* A list of supported DBMS. We change this class to support more DBMS, the DBMS itself only need to follow some rules.
 	* @var array
 	*/
-	var $supported_dbms = array('firebird', 'mssql', 'mysql_40', 'mysql_41', 'oracle', 'postgres', 'sqlite');
+	var $supported_dbms = array('firebird', 'mssql', 'mssqlnative', 'mysql_40', 'mysql_41', 'oracle', 'postgres', 'sqlite');
 
 	/**
 	* This is set to true if user only wants to return the 'to-be-executed' SQL statement(s) (as an array).
@@ -307,6 +337,10 @@
 				$this->sql_layer = 'mssql';
 			break;
 
+			case 'mssqlnative':
+				$this->sql_layer = 'mssqlnative';
+			break;
+
 			default:
 				$this->sql_layer = $this->db->sql_layer;
 			break;
@@ -368,6 +402,7 @@
 		switch ($this->sql_layer)
 		{
 			case 'mssql':
+			case 'mssqlnative':
 				$table_sql = 'CREATE TABLE [' . $table_name . '] (' . "\n";
 			break;
 
@@ -386,6 +421,7 @@
 			switch ($this->sql_layer)
 			{
 				case 'mssql':
+				case 'mssqlnative':
 					$columns[] = "\t [{$column_name}] " . $prepared_column['column_type_sql_default'];
 				break;
 
@@ -425,6 +461,7 @@
 			break;
 
 			case 'mssql':
+			case 'mssqlnative':
 				$table_sql .= "\n) ON [PRIMARY]" . (($create_textimage) ? ' TEXTIMAGE_ON [PRIMARY]' : '');
 				$statements[] = $table_sql;
 			break;
@@ -453,6 +490,7 @@
 
 					case 'firebird':
 					case 'mssql':
+					case 'mssqlnative':
 						// We need the data here
 						$old_return_statements = $this->return_statements;
 						$this->return_statements = true;
@@ -573,7 +611,7 @@
 	*	drop_columns: Removing/Dropping columns
 	*	add_primary_keys: adding primary keys
 	*	add_unique_index: adding an unique index
-	*	add_index: adding an index
+	*	add_index: adding an index (can be column:index_size if you need to provide size)
 	*
 	* The values are in this format:
 	*		{TABLE NAME}		=> array(
@@ -970,6 +1008,7 @@
 			// same deal with PostgreSQL, we must perform more complex operations than
 			// we technically could
 			case 'mssql':
+			case 'mssqlnative':
 				$sql = "SELECT c.name
 					FROM syscolumns c
 					LEFT JOIN sysobjects o ON c.id = o.id
@@ -1187,6 +1226,7 @@
 			break;
 
 			case 'mssql':
+			case 'mssqlnative':
 				$sql .= " {$column_type} ";
 				$sql_default = " {$column_type} ";
 
@@ -1335,6 +1375,7 @@
 			break;
 
 			case 'mssql':
+			case 'mssqlnative':
 				$statements[] = 'ALTER TABLE [' . $table_name . '] ADD [' . $column_name . '] ' . $column_data['column_type_sql_default'];
 			break;
 
@@ -1455,6 +1496,7 @@
 			break;
 
 			case 'mssql':
+			case 'mssqlnative':
 				$statements[] = 'ALTER TABLE [' . $table_name . '] DROP COLUMN [' . $column_name . ']';
 			break;
 
@@ -1549,6 +1591,7 @@
 		switch ($this->sql_layer)
 		{
 			case 'mssql':
+			case 'mssqlnative':
 				$statements[] = 'DROP INDEX ' . $table_name . '.' . $index_name;
 			break;
 
@@ -1652,6 +1695,7 @@
 			break;
 
 			case 'mssql':
+			case 'mssqlnative':
 				$sql = "ALTER TABLE [{$table_name}] WITH NOCHECK ADD ";
 				$sql .= "CONSTRAINT [PK_{$table_name}] PRIMARY KEY  CLUSTERED (";
 				$sql .= '[' . implode("],\n\t\t[", $column) . ']';
@@ -1745,6 +1789,7 @@
 			break;
 
 			case 'mssql':
+			case 'mssqlnative':
 				$statements[] = 'CREATE UNIQUE INDEX ' . $index_name . ' ON ' . $table_name . '(' . implode(', ', $column) . ') ON [PRIMARY]';
 			break;
 		}
@@ -1759,6 +1804,12 @@
 	{
 		$statements = array();
 
+		// remove index length unless MySQL4
+		if ('mysql_40' != $this->sql_layer)
+		{
+			$column = preg_replace('#:.*$#', '', $column);
+		}
+
 		switch ($this->sql_layer)
 		{
 			case 'firebird':
@@ -1769,11 +1820,22 @@
 			break;
 
 			case 'mysql_40':
+				// add index size to definition as required by MySQL4
+				foreach ($column as $i => $col)
+				{
+					if (false !== strpos($col, ':'))
+					{
+						list($col, $index_size) = explode(':', $col);
+						$column[$i] = "$col($index_size)";
+					}
+				}
+			// no break
 			case 'mysql_41':
 				$statements[] = 'CREATE INDEX ' . $index_name . ' ON ' . $table_name . '(' . implode(', ', $column) . ')';
 			break;
 
 			case 'mssql':
+			case 'mssqlnative':
 				$statements[] = 'CREATE INDEX ' . $index_name . ' ON ' . $table_name . '(' . implode(', ', $column) . ') ON [PRIMARY]';
 			break;
 		}
@@ -1791,7 +1853,7 @@
 	{
 		$index_array = array();
 
-		if ($this->sql_layer == 'mssql')
+		if ($this->sql_layer == 'mssql' || $this->sql_layer == 'mssqlnative')
 		{
 			$sql = "EXEC sp_statistics '$table_name'";
 			$result = $this->db->sql_query($sql);
@@ -1900,6 +1962,7 @@
 			break;
 
 			case 'mssql':
+			case 'mssqlnative':
 				$statements[] = 'ALTER TABLE [' . $table_name . '] ALTER COLUMN [' . $column_name . '] ' . $column_data['column_type_sql'];
 
 				if (!empty($column_data['default']))
diff -x .svn -aruN 3.0.7-PL1.src/includes/db/firebird.php 3.0.8.src/includes/db/firebird.php
--- 3.0.7-PL1.src/includes/db/firebird.php	2010-03-05 14:36:58.000000000 -0600
+++ 3.0.8.src/includes/db/firebird.php	2010-11-19 06:22:12.000000000 -0600
@@ -63,10 +63,19 @@
 	/**
 	* Version information about used database
 	* @param bool $raw if true, only return the fetched sql_server_version
+	* @param bool $use_cache forced to false for Interbase
 	* @return string sql server version
 	*/
-	function sql_server_info($raw = false)
+	function sql_server_info($raw = false, $use_cache = true)
 	{
+		/**
+		* force $use_cache false.  I didn't research why the caching code there is no caching code
+		* but I assume its because the IB extension provides a direct method to access it
+		* without a query.
+		*/
+
+		$use_cache = false;
+
 		if ($this->service_handle !== false && function_exists('ibase_server_info'))
 		{
 			return @ibase_server_info($this->service_handle, IBASE_SVC_SERVER_VERSION);
diff -x .svn -aruN 3.0.7-PL1.src/includes/db/mssqlnative.php 3.0.8.src/includes/db/mssqlnative.php
--- 3.0.7-PL1.src/includes/db/mssqlnative.php	1969-12-31 18:00:00.000000000 -0600
+++ 3.0.8.src/includes/db/mssqlnative.php	2010-11-19 06:22:12.000000000 -0600
@@ -0,0 +1,641 @@
+<?php
+/**
+*
+* @package dbal
+* @version $Id$
+* @copyright (c) 2010 phpBB Group
+* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+*
+* This is the MS SQL Server Native database abstraction layer.
+* PHP mssql native driver required.
+* @author Chris Pucci
+*
+*/
+
+/**
+* @ignore
+*/
+if (!defined('IN_PHPBB'))
+{
+	exit;
+}
+
+include_once($phpbb_root_path . 'includes/db/dbal.' . $phpEx);
+
+/**
+ * Prior to version 1.1 the SQL Server Native PHP driver didn't support sqlsrv_num_rows, or cursor based seeking so we recall all rows into an array
+ * and maintain our own cursor index into that array.
+ */
+class result_mssqlnative
+{
+	public function result_mssqlnative($queryresult = false)
+	{
+		$this->m_cursor = 0;
+		$this->m_rows = array();
+		$this->m_num_fields = sqlsrv_num_fields($queryresult);
+		$this->m_field_meta = sqlsrv_field_metadata($queryresult);
+
+		while ($row = sqlsrv_fetch_array($queryresult, SQLSRV_FETCH_ASSOC))
+		{
+			if ($row !== null)
+			{
+				foreach($row as $k => $v)
+				{
+					if (is_object($v) && method_exists($v, 'format'))
+					{
+						$row[$k] = $v->format("Y-m-d\TH:i:s\Z");
+					}
+				}
+				$this->m_rows[] = $row;//read results into memory, cursors are not supported
+			}
+		}
+
+		$this->m_row_count = count($this->m_rows);
+	}
+
+	private function array_to_obj($array, &$obj)
+	{
+		foreach ($array as $key => $value)
+		{
+			if (is_array($value))
+			{
+				$obj->$key = new stdClass();
+				array_to_obj($value, $obj->$key);
+			}
+			else
+			{
+				$obj->$key = $value;
+			}
+		}
+		return $obj;
+	}
+
+	public function fetch($mode = SQLSRV_FETCH_BOTH, $object_class = 'stdClass')
+	{
+		if ($this->m_cursor >= $this->m_row_count || $this->m_row_count == 0)
+		{
+			return false;
+		}
+
+		$ret = false;
+		$arr_num = array();
+
+		if ($mode == SQLSRV_FETCH_NUMERIC || $mode == SQLSRV_FETCH_BOTH)
+		{
+			foreach($this->m_rows[$this->m_cursor] as $key => $value)
+			{
+				$arr_num[] = $value;
+			}
+		}
+
+		switch ($mode)
+		{
+			case SQLSRV_FETCH_ASSOC:
+				$ret = $this->m_rows[$this->m_cursor];
+			break;
+			case SQLSRV_FETCH_NUMERIC:
+				$ret = $arr_num;
+			break;
+			case 'OBJECT':
+				$ret = $this->array_to_obj($this->m_rows[$this->m_cursor], $o = new $object_class);
+			break;
+			case SQLSRV_FETCH_BOTH:
+			default:
+				$ret = $this->m_rows[$this->m_cursor] + $arr_num;
+			break;
+		}
+		$this->m_cursor++;
+		return $ret;
+	}
+
+	public function get($pos, $fld)
+	{
+		return $this->m_rows[$pos][$fld];
+	}
+
+	public function num_rows()
+	{
+		return $this->m_row_count;
+	}
+
+	public function seek($iRow)
+	{
+		$this->m_cursor = min($iRow, $this->m_row_count);
+	}
+
+	public function num_fields()
+	{
+		return $this->m_num_fields;
+	}
+
+	public function field_name($nr)
+	{
+		$arr_keys = array_keys($this->m_rows[0]);
+		return $arr_keys[$nr];
+	}
+
+	public function field_type($nr)
+	{
+		$i = 0;
+		$int_type = -1;
+		$str_type = '';
+
+		foreach ($this->m_field_meta as $meta)
+		{
+			if ($nr == $i)
+			{
+				$int_type = $meta['Type'];
+				break;
+			}
+			$i++;
+		}
+
+		//http://msdn.microsoft.com/en-us/library/cc296183.aspx contains type table
+		switch ($int_type)
+		{
+			case SQLSRV_SQLTYPE_BIGINT: 		$str_type = 'bigint'; break;
+			case SQLSRV_SQLTYPE_BINARY: 		$str_type = 'binary'; break;
+			case SQLSRV_SQLTYPE_BIT: 			$str_type = 'bit'; break;
+			case SQLSRV_SQLTYPE_CHAR: 			$str_type = 'char'; break;
+			case SQLSRV_SQLTYPE_DATETIME: 		$str_type = 'datetime'; break;
+			case SQLSRV_SQLTYPE_DECIMAL/*($precision, $scale)*/: $str_type = 'decimal'; break;
+			case SQLSRV_SQLTYPE_FLOAT: 			$str_type = 'float'; break;
+			case SQLSRV_SQLTYPE_IMAGE: 			$str_type = 'image'; break;
+			case SQLSRV_SQLTYPE_INT: 			$str_type = 'int'; break;
+			case SQLSRV_SQLTYPE_MONEY: 			$str_type = 'money'; break;
+			case SQLSRV_SQLTYPE_NCHAR/*($charCount)*/: $str_type = 'nchar'; break;
+			case SQLSRV_SQLTYPE_NUMERIC/*($precision, $scale)*/: $str_type = 'numeric'; break;
+			case SQLSRV_SQLTYPE_NVARCHAR/*($charCount)*/: $str_type = 'nvarchar'; break;
+			case SQLSRV_SQLTYPE_NTEXT: 			$str_type = 'ntext'; break;
+			case SQLSRV_SQLTYPE_REAL: 			$str_type = 'real'; break;
+			case SQLSRV_SQLTYPE_SMALLDATETIME: 	$str_type = 'smalldatetime'; break;
+			case SQLSRV_SQLTYPE_SMALLINT: 		$str_type = 'smallint'; break;
+			case SQLSRV_SQLTYPE_SMALLMONEY: 	$str_type = 'smallmoney'; break;
+			case SQLSRV_SQLTYPE_TEXT: 			$str_type = 'text'; break;
+			case SQLSRV_SQLTYPE_TIMESTAMP: 		$str_type = 'timestamp'; break;
+			case SQLSRV_SQLTYPE_TINYINT: 		$str_type = 'tinyint'; break;
+			case SQLSRV_SQLTYPE_UNIQUEIDENTIFIER: $str_type = 'uniqueidentifier'; break;
+			case SQLSRV_SQLTYPE_UDT: 			$str_type = 'UDT'; break;
+			case SQLSRV_SQLTYPE_VARBINARY/*($byteCount)*/: $str_type = 'varbinary'; break;
+			case SQLSRV_SQLTYPE_VARCHAR/*($charCount)*/: $str_type = 'varchar'; break;
+			case SQLSRV_SQLTYPE_XML: 			$str_type = 'xml'; break;
+			default: $str_type = $int_type;
+		}
+		return $str_type;
+	}
+
+	public function free()
+	{
+		unset($this->m_rows);
+		return;
+	}
+}
+
+/**
+* @package dbal
+*/
+class dbal_mssqlnative extends dbal
+{
+	var $m_insert_id = NULL;
+	var $last_query_text = '';
+	var $query_options = array();
+
+	/**
+	* Connect to server
+	*/
+	function sql_connect($sqlserver, $sqluser, $sqlpassword, $database, $port = false, $persistency = false, $new_link = false)
+	{
+		# Test for driver support, to avoid suppressed fatal error
+		if (!function_exists('sqlsrv_connect'))
+		{
+			trigger_error('Native MS SQL Server driver for PHP is missing or needs to be updated. Version 1.1 or later is required to install phpBB3. You can download the driver from: http://www.microsoft.com/sqlserver/2005/en/us/PHP-Driver.aspx\n', E_USER_ERROR);
+		}
+
+		//set up connection variables
+		$this->persistency = $persistency;
+		$this->user = $sqluser;
+		$this->dbname = $database;
+		$port_delimiter = (defined('PHP_OS') && substr(PHP_OS, 0, 3) === 'WIN') ? ',' : ':';
+		$this->server = $sqlserver . (($port) ? $port_delimiter . $port : '');
+
+		//connect to database
+		error_reporting(E_ALL);
+		$this->db_connect_id = sqlsrv_connect($this->server, array(
+			'Database' => $this->dbname,
+			'UID' => $this->user,
+			'PWD' => $sqlpassword
+		));
+
+		return ($this->db_connect_id) ? $this->db_connect_id : $this->sql_error('');
+	}
+
+	/**
+	* Version information about used database
+	* @param bool $raw if true, only return the fetched sql_server_version
+	* @param bool $use_cache If true, it is safe to retrieve the value from the cache
+	* @return string sql server version
+	*/
+	function sql_server_info($raw = false, $use_cache = true)
+	{
+		global $cache;
+
+		if (!$use_cache || empty($cache) || ($this->sql_server_version = $cache->get('mssql_version')) === false)
+		{
+			$arr_server_info = sqlsrv_server_info($this->db_connect_id);
+			$this->sql_server_version = $arr_server_info['SQLServerVersion'];
+
+			if (!empty($cache) && $use_cache)
+			{
+				$cache->put('mssql_version', $this->sql_server_version);
+			}
+		}
+
+		if ($raw)
+		{
+			return $this->sql_server_version;
+		}
+
+		return ($this->sql_server_version) ? 'MSSQL<br />' . $this->sql_server_version : 'MSSQL';
+	}
+
+	/**
+	* SQL Transaction
+	* @access private
+	*/
+	function _sql_transaction($status = 'begin')
+	{
+		switch ($status)
+		{
+			case 'begin':
+				return sqlsrv_begin_transaction($this->db_connect_id);
+			break;
+
+			case 'commit':
+				return sqlsrv_commit($this->db_connect_id);
+			break;
+
+			case 'rollback':
+				return sqlsrv_rollback($this->db_connect_id);
+			break;
+		}
+		return true;
+	}
+
+	/**
+	* Base query method
+	*
+	* @param	string	$query		Contains the SQL query which shall be executed
+	* @param	int		$cache_ttl	Either 0 to avoid caching or the time in seconds which the result shall be kept in cache
+	* @return	mixed				When casted to bool the returned value returns true on success and false on failure
+	*
+	* @access	public
+	*/
+	function sql_query($query = '', $cache_ttl = 0)
+	{
+		if ($query != '')
+		{
+			global $cache;
+
+			// EXPLAIN only in extra debug mode
+			if (defined('DEBUG_EXTRA'))
+			{
+				$this->sql_report('start', $query);
+			}
+
+			$this->last_query_text = $query;
+			$this->query_result = ($cache_ttl && method_exists($cache, 'sql_load')) ? $cache->sql_load($query) : false;
+			$this->sql_add_num_queries($this->query_result);
+
+			if ($this->query_result === false)
+			{
+				if (($this->query_result = @sqlsrv_query($this->db_connect_id, $query, array(), $this->query_options)) === false)
+				{
+					$this->sql_error($query);
+				}
+				// reset options for next query
+				$this->query_options = array();
+
+				if (defined('DEBUG_EXTRA'))
+				{
+					$this->sql_report('stop', $query);
+				}
+
+				if ($cache_ttl && method_exists($cache, 'sql_save'))
+				{
+					$this->open_queries[(int) $this->query_result] = $this->query_result;
+					$cache->sql_save($query, $this->query_result, $cache_ttl);
+				}
+				else if (strpos($query, 'SELECT') === 0 && $this->query_result)
+				{
+					$this->open_queries[(int) $this->query_result] = $this->query_result;
+				}
+			}
+			else if (defined('DEBUG_EXTRA'))
+			{
+				$this->sql_report('fromcache', $query);
+			}
+		}
+		else
+		{
+			return false;
+		}
+		return $this->query_result;
+	}
+
+	/**
+	* Build LIMIT query
+	*/
+	function _sql_query_limit($query, $total, $offset = 0, $cache_ttl = 0)
+	{
+		$this->query_result = false;
+
+		// total == 0 means all results - not zero results
+		if ($offset == 0 && $total !== 0)
+		{
+			if (strpos($query, "SELECT") === false)
+			{
+				$query = "TOP {$total} " . $query;
+			}
+			else
+			{
+				$query = preg_replace('/SELECT(\s*DISTINCT)?/Dsi', 'SELECT$1 TOP '.$total, $query);
+			}
+		}
+		else if ($offset > 0)
+		{
+			$query = preg_replace('/SELECT(\s*DISTINCT)?/Dsi', 'SELECT$1 TOP(10000000) ', $query);
+			$query = 'SELECT *
+					FROM (SELECT sub2.*, ROW_NUMBER() OVER(ORDER BY sub2.line2) AS line3
+					FROM (SELECT 1 AS line2, sub1.* FROM (' . $query . ') AS sub1) as sub2) AS sub3';
+
+			if ($total > 0)
+			{
+				$query .= ' WHERE line3 BETWEEN ' . ($offset+1) . ' AND ' . ($offset + $total);
+			}
+			else
+			{
+				$query .= ' WHERE line3 > ' . $offset;
+			}
+		}
+
+		$result = $this->sql_query($query, $cache_ttl);
+
+		return $result;
+	}
+
+	/**
+	* Return number of affected rows
+	*/
+	function sql_affectedrows()
+	{
+		return ($this->db_connect_id) ? @sqlsrv_rows_affected($this->db_connect_id) : false;
+	}
+
+	/**
+	* Fetch current row
+	*/
+	function sql_fetchrow($query_id = false)
+	{
+		global $cache;
+
+		if ($query_id === false)
+		{
+			$query_id = $this->query_result;
+		}
+
+		if (isset($cache->sql_rowset[$query_id]))
+		{
+			return $cache->sql_fetchrow($query_id);
+		}
+
+		if ($query_id === false)
+		{
+			return false;
+		}
+
+		$row = @sqlsrv_fetch_array($query_id, SQLSRV_FETCH_ASSOC);
+
+		if ($row)
+		{
+			foreach ($row as $key => $value)
+			{
+				$row[$key] = ($value === ' ' || $value === NULL) ? '' : $value;
+			}
+
+			// remove helper values from LIMIT queries
+			if (isset($row['line2']))
+			{
+				unset($row['line2'], $row['line3']);
+			}
+		}
+		return $row;
+	}
+
+	/**
+	* Seek to given row number
+	* rownum is zero-based
+	*/
+	function sql_rowseek($rownum, &$query_id)
+	{
+		global $cache;
+
+		if (isset($cache->sql_rowset[$query_id]))
+		{
+			return $cache->sql_rowseek($rownum, $query_id);
+		}
+
+		$seek = new result_mssqlnative($query_id);
+		$row = $seek->seek($rownum);
+		return ($row = $seek->fetch()) ? $row : false;
+	}
+
+	/**
+	* Get last inserted id after insert statement
+	*/
+	function sql_nextid()
+	{
+		$result_id = @sqlsrv_query($this->db_connect_id, 'SELECT @@IDENTITY');
+
+		if ($result_id !== false)
+		{
+			$row = @sqlsrv_fetch_array($result_id);
+			$id = $row[0];
+			@sqlsrv_free_stmt($result_id);
+			return $id;
+		}
+		else
+		{
+			return false;
+		}
+	}
+
+	/**
+	* Free sql result
+	*/
+	function sql_freeresult($query_id = false)
+	{
+		global $cache;
+
+		if ($query_id === false)
+		{
+			$query_id = $this->query_result;
+		}
+
+		if (isset($cache->sql_rowset[$query_id]))
+		{
+			return $cache->sql_freeresult($query_id);
+		}
+
+		if (isset($this->open_queries[$query_id]))
+		{
+			unset($this->open_queries[$query_id]);
+			return @sqlsrv_free_stmt($query_id);
+		}
+		return false;
+	}
+
+	/**
+	* Escape string used in sql query
+	*/
+	function sql_escape($msg)
+	{
+		return str_replace(array("'", "\0"), array("''", ''), $msg);
+	}
+
+	/**
+	* Build LIKE expression
+	* @access private
+	*/
+	function _sql_like_expression($expression)
+	{
+		return $expression . " ESCAPE '\\'";
+	}
+
+	/**
+	* return sql error array
+	* @access private
+	*/
+	function _sql_error()
+	{
+		$errors = @sqlsrv_errors(SQLSRV_ERR_ERRORS);
+		$error_message = '';
+		$code = 0;
+
+		if ($errors != null)
+		{
+			foreach ($errors as $error)
+			{
+				$error_message .= "SQLSTATE: ".$error[ 'SQLSTATE']."\n";
+				$error_message .= "code: ".$error[ 'code']."\n";
+				$code = $error['code'];
+				$error_message .= "message: ".$error[ 'message']."\n";
+			}
+			$this->last_error_result = $error_message;
+			$error = $this->last_error_result;
+		}
+		else
+		{
+			$error = (isset($this->last_error_result) && $this->last_error_result) ? $this->last_error_result : array();
+		}
+
+		return array(
+			'message'	=> $error,
+			'code'		=> $code,
+		);
+	}
+
+	/**
+	* Build db-specific query data
+	* @access private
+	*/
+	function _sql_custom_build($stage, $data)
+	{
+		return $data;
+	}
+
+	/**
+	* Close sql connection
+	* @access private
+	*/
+	function _sql_close()
+	{
+		return @sqlsrv_close($this->db_connect_id);
+	}
+
+	/**
+	* Build db-specific report
+	* @access private
+	*/
+	function _sql_report($mode, $query = '')
+	{
+		switch ($mode)
+		{
+			case 'start':
+				$html_table = false;
+				@sqlsrv_query($this->db_connect_id, 'SET SHOWPLAN_TEXT ON;');
+				if ($result = @sqlsrv_query($this->db_connect_id, $query))
+				{
+					@sqlsrv_next_result($result);
+					while ($row = @sqlsrv_fetch_array($result))
+					{
+						$html_table = $this->sql_report('add_select_row', $query, $html_table, $row);
+					}
+				}
+				@sqlsrv_query($this->db_connect_id, 'SET SHOWPLAN_TEXT OFF;');
+				@sqlsrv_free_stmt($result);
+
+				if ($html_table)
+				{
+					$this->html_hold .= '</table>';
+				}
+			break;
+
+			case 'fromcache':
+				$endtime = explode(' ', microtime());
+				$endtime = $endtime[0] + $endtime[1];
+
+				$result = @sqlsrv_query($this->db_connect_id, $query);
+				while ($void = @sqlsrv_fetch_array($result))
+				{
+					// Take the time spent on parsing rows into account
+				}
+				@sqlsrv_free_stmt($result);
+
+				$splittime = explode(' ', microtime());
+				$splittime = $splittime[0] + $splittime[1];
+
+				$this->sql_report('record_fromcache', $query, $endtime, $splittime);
+
+			break;
+		}
+	}
+
+	/**
+	* Utility method used to retrieve number of rows
+	* Emulates mysql_num_rows
+	* Used in acp_database.php -> write_data_mssqlnative()
+	* Requires a static or keyset cursor to be definde via
+	* mssqlnative_set_query_options()
+	*/
+	function mssqlnative_num_rows($res)
+	{
+		if ($res !== false)
+		{
+			return sqlsrv_num_rows($res);
+		}
+		else
+		{
+			return false;
+		}
+	}
+	
+	/**
+	* Allows setting mssqlnative specific query options passed to sqlsrv_query as 4th parameter.
+	*/
+	function mssqlnative_set_query_options($options)
+	{
+		$this->query_options = $options;
+	}
+}
+
+?>
diff -x .svn -aruN 3.0.7-PL1.src/includes/db/mssql_odbc.php 3.0.8.src/includes/db/mssql_odbc.php
--- 3.0.7-PL1.src/includes/db/mssql_odbc.php	2010-03-05 14:36:58.000000000 -0600
+++ 3.0.8.src/includes/db/mssql_odbc.php	2010-11-19 06:22:12.000000000 -0600
@@ -76,13 +76,14 @@
 	/**
 	* Version information about used database
 	* @param bool $raw if true, only return the fetched sql_server_version
+	* @param bool $use_cache If true, it is safe to retrieve the value from the cache
 	* @return string sql server version
 	*/
-	function sql_server_info($raw = false)
+	function sql_server_info($raw = false, $use_cache = true)
 	{
 		global $cache;
 
-		if (empty($cache) || ($this->sql_server_version = $cache->get('mssqlodbc_version')) === false)
+		if (!$use_cache || empty($cache) || ($this->sql_server_version = $cache->get('mssqlodbc_version')) === false)
 		{
 			$result_id = @odbc_exec($this->db_connect_id, "SELECT SERVERPROPERTY('productversion'), SERVERPROPERTY('productlevel'), SERVERPROPERTY('edition')");
 
@@ -95,7 +96,7 @@
 
 			$this->sql_server_version = ($row) ? trim(implode(' ', $row)) : 0;
 
-			if (!empty($cache))
+			if (!empty($cache) && $use_cache)
 			{
 				$cache->put('mssqlodbc_version', $this->sql_server_version);
 			}
diff -x .svn -aruN 3.0.7-PL1.src/includes/db/mssql.php 3.0.8.src/includes/db/mssql.php
--- 3.0.7-PL1.src/includes/db/mssql.php	2010-03-05 14:36:58.000000000 -0600
+++ 3.0.8.src/includes/db/mssql.php	2010-11-19 06:22:12.000000000 -0600
@@ -65,13 +65,14 @@
 	/**
 	* Version information about used database
 	* @param bool $raw if true, only return the fetched sql_server_version
+	* @param bool $use_cache If true, it is safe to retrieve the value from the cache
 	* @return string sql server version
 	*/
-	function sql_server_info($raw = false)
+	function sql_server_info($raw = false, $use_cache = true)
 	{
 		global $cache;
 
-		if (empty($cache) || ($this->sql_server_version = $cache->get('mssql_version')) === false)
+		if (!$use_cache || empty($cache) || ($this->sql_server_version = $cache->get('mssql_version')) === false)
 		{
 			$result_id = @mssql_query("SELECT SERVERPROPERTY('productversion'), SERVERPROPERTY('productlevel'), SERVERPROPERTY('edition')", $this->db_connect_id);
 
@@ -84,7 +85,7 @@
 
 			$this->sql_server_version = ($row) ? trim(implode(' ', $row)) : 0;
 
-			if (!empty($cache))
+			if (!empty($cache) && $use_cache)
 			{
 				$cache->put('mssql_version', $this->sql_server_version);
 			}
diff -x .svn -aruN 3.0.7-PL1.src/includes/db/mysqli.php 3.0.8.src/includes/db/mysqli.php
--- 3.0.7-PL1.src/includes/db/mysqli.php	2010-03-05 14:36:58.000000000 -0600
+++ 3.0.8.src/includes/db/mysqli.php	2010-11-19 06:22:12.000000000 -0600
@@ -80,14 +80,14 @@
 
 	/**
 	* Version information about used database
-	* @param bool $raw if true, only return the fetched sql_server_version
+	* @param bool $use_cache If true, it is safe to retrieve the value from the cache
 	* @return string sql server version
 	*/
-	function sql_server_info($raw = false)
+	function sql_server_info($raw = false, $use_cache = true)
 	{
 		global $cache;
 
-		if (empty($cache) || ($this->sql_server_version = $cache->get('mysqli_version')) === false)
+		if (!$use_cache || empty($cache) || ($this->sql_server_version = $cache->get('mysqli_version')) === false)
 		{
 			$result = @mysqli_query($this->db_connect_id, 'SELECT VERSION() AS version');
 			$row = @mysqli_fetch_assoc($result);
@@ -95,7 +95,7 @@
 
 			$this->sql_server_version = $row['version'];
 
-			if (!empty($cache))
+			if (!empty($cache) && $use_cache)
 			{
 				$cache->put('mysqli_version', $this->sql_server_version);
 			}
diff -x .svn -aruN 3.0.7-PL1.src/includes/db/mysql.php 3.0.8.src/includes/db/mysql.php
--- 3.0.7-PL1.src/includes/db/mysql.php	2010-03-05 14:36:58.000000000 -0600
+++ 3.0.8.src/includes/db/mysql.php	2010-11-19 06:22:12.000000000 -0600
@@ -96,13 +96,14 @@
 	/**
 	* Version information about used database
 	* @param bool $raw if true, only return the fetched sql_server_version
+	* @param bool $use_cache If true, it is safe to retrieve the value from the cache
 	* @return string sql server version
 	*/
-	function sql_server_info($raw = false)
+	function sql_server_info($raw = false, $use_cache = true)
 	{
 		global $cache;
 
-		if (empty($cache) || ($this->sql_server_version = $cache->get('mysql_version')) === false)
+		if (!$use_cache || empty($cache) || ($this->sql_server_version = $cache->get('mysql_version')) === false)
 		{
 			$result = @mysql_query('SELECT VERSION() AS version', $this->db_connect_id);
 			$row = @mysql_fetch_assoc($result);
@@ -110,7 +111,7 @@
 
 			$this->sql_server_version = $row['version'];
 
-			if (!empty($cache))
+			if (!empty($cache) && $use_cache)
 			{
 				$cache->put('mysql_version', $this->sql_server_version);
 			}
diff -x .svn -aruN 3.0.7-PL1.src/includes/db/oracle.php 3.0.8.src/includes/db/oracle.php
--- 3.0.7-PL1.src/includes/db/oracle.php	2010-03-05 14:36:58.000000000 -0600
+++ 3.0.8.src/includes/db/oracle.php	2010-11-19 06:22:12.000000000 -0600
@@ -56,10 +56,18 @@
 	/**
 	* Version information about used database
 	* @param bool $raw if true, only return the fetched sql_server_version
+	* @param bool $use_cache forced to false for Oracle
 	* @return string sql server version
 	*/
-	function sql_server_info($raw = false)
+	function sql_server_info($raw = false, $use_cache = true)
 	{
+		/**
+		* force $use_cache false.  I didn't research why the caching code below is commented out
+		* but I assume its because the Oracle extension provides a direct method to access it
+		* without a query.
+		*/
+
+		$use_cache = false;
 /*
 		global $cache;
 
@@ -261,6 +269,10 @@
 						{
 							$cols = explode(', ', $regs[2]);
 
+/*						The code inside this comment block breaks clob handling, but does allow the
+						database restore script to work.  If you want to allow no posts longer than 4KB
+						and/or need the db restore script, uncomment this.
+
 							preg_match_all('/\'(?:[^\']++|\'\')*+\'|[\d-.]+/', $regs[3], $vals, PREG_PATTERN_ORDER);
 
 							if (sizeof($cols) !== sizeof($vals))
@@ -310,6 +322,7 @@
 
 								$vals = array(0 => $vals);
 							}
+*/
 
 							$inserts = $vals[0];
 							unset($vals);
diff -x .svn -aruN 3.0.7-PL1.src/includes/db/postgres.php 3.0.8.src/includes/db/postgres.php
--- 3.0.7-PL1.src/includes/db/postgres.php	2010-03-05 14:36:58.000000000 -0600
+++ 3.0.8.src/includes/db/postgres.php	2010-11-19 06:22:12.000000000 -0600
@@ -46,7 +46,10 @@
 
 		if ($sqlserver)
 		{
-			if (strpos($sqlserver, ':') !== false)
+			// $sqlserver can carry a port separated by : for compatibility reasons
+			// If $sqlserver has more than one : it's probably an IPv6 address.
+			// In this case we only allow passing a port via the $port variable.
+			if (substr_count($sqlserver, ':') === 1)
 			{
 				list($sqlserver, $port) = explode(':', $sqlserver);
 			}
@@ -76,7 +79,14 @@
 
 		$this->persistency = $persistency;
 
-		$this->db_connect_id = ($this->persistency) ? @pg_pconnect($connect_string, $new_link) : @pg_connect($connect_string, $new_link);
+		if ($this->persistency)
+		{
+			$this->db_connect_id = (!$new_link) ? @pg_pconnect($connect_string) : @pg_pconnect($connect_string, PGSQL_CONNECT_FORCE_NEW);
+		}
+		else
+		{
+			$this->db_connect_id = (!$new_link) ? @pg_connect($connect_string) : @pg_connect($connect_string, PGSQL_CONNECT_FORCE_NEW);
+		}
 
 		if ($this->db_connect_id)
 		{
@@ -98,13 +108,14 @@
 	/**
 	* Version information about used database
 	* @param bool $raw if true, only return the fetched sql_server_version
+	* @param bool $use_cache If true, it is safe to retrieve the value from the cache
 	* @return string sql server version
 	*/
-	function sql_server_info($raw = false)
+	function sql_server_info($raw = false, $use_cache = true)
 	{
 		global $cache;
 
-		if (empty($cache) || ($this->sql_server_version = $cache->get('pgsql_version')) === false)
+		if (!$use_cache || empty($cache) || ($this->sql_server_version = $cache->get('pgsql_version')) === false)
 		{
 			$query_id = @pg_query($this->db_connect_id, 'SELECT VERSION() AS version');
 			$row = @pg_fetch_assoc($query_id, null);
@@ -112,7 +123,7 @@
 
 			$this->sql_server_version = (!empty($row['version'])) ? trim(substr($row['version'], 10)) : 0;
 
-			if (!empty($cache))
+			if (!empty($cache) && $use_cache)
 			{
 				$cache->put('pgsql_version', $this->sql_server_version);
 			}
diff -x .svn -aruN 3.0.7-PL1.src/includes/db/sqlite.php 3.0.8.src/includes/db/sqlite.php
--- 3.0.7-PL1.src/includes/db/sqlite.php	2010-03-05 14:36:58.000000000 -0600
+++ 3.0.8.src/includes/db/sqlite.php	2010-11-19 06:22:12.000000000 -0600
@@ -50,19 +50,24 @@
 	/**
 	* Version information about used database
 	* @param bool $raw if true, only return the fetched sql_server_version
+	* @param bool $use_cache if true, it is safe to retrieve the stored value from the cache
 	* @return string sql server version
 	*/
-	function sql_server_info($raw = false)
+	function sql_server_info($raw = false, $use_cache = true)
 	{
 		global $cache;
 
-		if (empty($cache) || ($this->sql_server_version = $cache->get('sqlite_version')) === false)
+		if (!$use_cache || empty($cache) || ($this->sql_server_version = $cache->get('sqlite_version')) === false)
 		{
 			$result = @sqlite_query('SELECT sqlite_version() AS version', $this->db_connect_id);
 			$row = @sqlite_fetch_array($result, SQLITE_ASSOC);
 
 			$this->sql_server_version = (!empty($row['version'])) ? $row['version'] : 0;
-			$cache->put('sqlite_version', $this->sql_server_version);
+
+			if (!empty($cache) && $use_cache)
+			{
+				$cache->put('sqlite_version', $this->sql_server_version);
+			}
 		}
 
 		return ($raw) ? $this->sql_server_version : 'SQLite ' . $this->sql_server_version;
diff -x .svn -aruN 3.0.7-PL1.src/includes/functions_admin.php 3.0.8.src/includes/functions_admin.php
--- 3.0.7-PL1.src/includes/functions_admin.php	2010-03-05 14:36:58.000000000 -0600
+++ 3.0.8.src/includes/functions_admin.php	2010-11-19 06:22:12.000000000 -0600
@@ -96,16 +96,12 @@
 		$right = $row['right_id'];
 		$disabled = false;
 
-		if (!$ignore_acl && $auth->acl_get('f_list', $row['forum_id']))
+		if (!$ignore_acl && $auth->acl_gets(array('f_list', 'a_forum', 'a_forumadd', 'a_forumdel'), $row['forum_id']))
 		{
 			if ($only_acl_post && !$auth->acl_get('f_post', $row['forum_id']) || (!$auth->acl_get('m_approve', $row['forum_id']) && !$auth->acl_get('f_noapprove', $row['forum_id'])))
 			{
 				$disabled = true;
 			}
-			else if (!$only_acl_post && !$auth->acl_gets(array('f_list', 'a_forum', 'a_forumadd', 'a_forumdel'), $row['forum_id']))
-			{
-				$disabled = true;
-			}
 		}
 		else if (!$ignore_acl)
 		{
@@ -577,8 +573,8 @@
 
 	while ($row = $db->sql_fetchrow($result))
 	{
-		$forum_ids[] = $row['forum_id'];
-		$topic_ids[] = $row['topic_id'];
+		$forum_ids[] = (int) $row['forum_id'];
+		$topic_ids[] = (int) $row['topic_id'];
 	}
 	$db->sql_freeresult($result);
 
@@ -595,7 +591,7 @@
 	}
 
 	$sql = 'UPDATE ' . POSTS_TABLE . '
-		SET forum_id = ' . $forum_row['forum_id'] . ", topic_id = $topic_id
+		SET forum_id = ' . (int) $forum_row['forum_id'] . ", topic_id = $topic_id
 		WHERE " . $db->sql_in_set('post_id', $post_ids);
 	$db->sql_query($sql);
 
@@ -606,7 +602,7 @@
 
 	if ($auto_sync)
 	{
-		$forum_ids[] = $forum_row['forum_id'];
+		$forum_ids[] = (int) $forum_row['forum_id'];
 
 		sync('topic_reported', 'topic_id', $topic_ids);
 		sync('topic_attachment', 'topic_id', $topic_ids);
@@ -675,7 +671,7 @@
 
 	$db->sql_transaction('begin');
 
-	$table_ary = array(TOPICS_TRACK_TABLE, TOPICS_POSTED_TABLE, POLL_VOTES_TABLE, POLL_OPTIONS_TABLE, TOPICS_WATCH_TABLE, TOPICS_TABLE);
+	$table_ary = array(BOOKMARKS_TABLE, TOPICS_TRACK_TABLE, TOPICS_POSTED_TABLE, POLL_VOTES_TABLE, POLL_OPTIONS_TABLE, TOPICS_WATCH_TABLE, TOPICS_TABLE);
 
 	foreach ($table_ary as $table)
 	{
@@ -1129,53 +1125,65 @@
 }
 
 /**
-* Remove topic shadows
+* Deletes shadow topics pointing to a specified forum.
+*
+* @param int		$forum_id		The forum id
+* @param string		$sql_more		Additional WHERE statement, e.g. t.topic_time < (time() - 1234)
+* @param bool		$auto_sync		Will call sync() if this is true
+*
+* @return array		Array with affected forums
+*
+* @author bantu
 */
-function delete_topic_shadows($max_age, $forum_id = '', $auto_sync = true)
+function delete_topic_shadows($forum_id, $sql_more = '', $auto_sync = true)
 {
-	$where = (is_array($forum_id)) ? 'AND ' . $db->sql_in_set('t.forum_id', array_map('intval', $forum_id)) : (($forum_id) ? 'AND t.forum_id = ' . (int) $forum_id : '');
+	global $db;
 
-	switch ($db->sql_layer)
+	if (!$forum_id)
 	{
-		case 'mysql4':
-		case 'mysqli':
-			$sql = 'DELETE t.*
-				FROM ' . TOPICS_TABLE . ' t, ' . TOPICS_TABLE . ' t2
-				WHERE t.topic_moved_id = t2.topic_id
-					AND t.topic_time < ' . (time() - $max_age)
-				. $where;
-			$db->sql_query($sql);
-		break;
+		// Nothing to do.
+		return;
+	}
 
-		default:
-			$sql = 'SELECT t.topic_id
-				FROM ' . TOPICS_TABLE . ' t, ' . TOPICS_TABLE . ' t2
-				WHERE t.topic_moved_id = t2.topic_id
-					AND t.topic_time < ' . (time() - $max_age)
-				. $where;
-			$result = $db->sql_query($sql);
+	// Set of affected forums we have to resync
+	$sync_forum_ids = array();
 
-			$topic_ids = array();
-			while ($row = $db->sql_fetchrow($result))
-			{
-				$topic_ids[] = $row['topic_id'];
-			}
-			$db->sql_freeresult($result);
+	// Amount of topics we select and delete at once.
+	$batch_size = 500;
 
-			if (sizeof($topic_ids))
-			{
-				$sql = 'DELETE FROM ' . TOPICS_TABLE . '
-					WHERE ' . $db->sql_in_set('topic_id', $topic_ids);
-				$db->sql_query($sql);
-			}
-		break;
+	do
+	{
+		$sql = 'SELECT t2.forum_id, t2.topic_id
+			FROM ' . TOPICS_TABLE . ' t2, ' . TOPICS_TABLE . ' t
+			WHERE t2.topic_moved_id = t.topic_id
+				AND t.forum_id = ' . (int) $forum_id . '
+				' . (($sql_more) ? 'AND ' . $sql_more : '');
+		$result = $db->sql_query_limit($sql, $batch_size);
+
+		$topic_ids = array();
+		while ($row = $db->sql_fetchrow($result))
+		{
+			$topic_ids[] = (int) $row['topic_id'];
+
+			$sync_forum_ids[(int) $row['forum_id']] = (int) $row['forum_id'];
+		}
+		$db->sql_freeresult($result);
+
+		if (!empty($topic_ids))
+		{
+			$sql = 'DELETE FROM ' . TOPICS_TABLE . '
+				WHERE ' . $db->sql_in_set('topic_id', $topic_ids);
+			$db->sql_query($sql);
+		}
 	}
+	while (sizeof($topic_ids) == $batch_size);
 
 	if ($auto_sync)
 	{
-		$where_type = ($forum_id) ? 'forum_id' : '';
-		sync('forum', $where_type, $forum_id, true, true);
+		sync('forum', 'forum_id', $sync_forum_ids, true, true);
 	}
+
+	return $sync_forum_ids;
 }
 
 /**
@@ -3042,6 +3050,7 @@
 
 		case 'mssql':
 		case 'mssql_odbc':
+		case 'mssqlnative':
 			$sql = 'SELECT ((SUM(size) * 8.0) * 1024.0) as dbsize
 				FROM sysfiles';
 			$result = $db->sql_query($sql, 7200);
@@ -3290,7 +3299,7 @@
 		$errstr = '';
 		$errno = 0;
 
-		$info = get_remote_file('www.phpbb.com', '/updatecheck',
+		$info = get_remote_file('version.phpbb.com', '/phpbb',
 				((defined('PHPBB_QA')) ? '30x_qa.txt' : '30x.txt'), $errstr, $errno);
 
 		if ($info === false)
diff -x .svn -aruN 3.0.7-PL1.src/includes/functions_compress.php 3.0.8.src/includes/functions_compress.php
--- 3.0.7-PL1.src/includes/functions_compress.php	2010-03-05 14:36:58.000000000 -0600
+++ 3.0.8.src/includes/functions_compress.php	2010-11-19 06:22:12.000000000 -0600
@@ -53,13 +53,18 @@
 			$filelist = filelist("$phpbb_root_path$src", '', '*');
 			krsort($filelist);
 
+			/**
+			* Commented out, as adding the folders produces corrupted archives
 			if ($src_path)
 			{
 				$this->data($src_path, '', true, stat("$phpbb_root_path$src"));
 			}
+			*/
 
 			foreach ($filelist as $path => $file_ary)
 			{
+				/**
+				* Commented out, as adding the folders produces corrupted archives
 				if ($path)
 				{
 					// Same as for src_path
@@ -68,6 +73,7 @@
 
 					$this->data("$src_path$path", '', true, stat("$phpbb_root_path$src$path"));
 				}
+				*/
 
 				foreach ($file_ary as $file)
 				{
@@ -502,8 +508,8 @@
 	function compress_tar($mode, $file, $type = '')
 	{
 		$type = (!$type) ? $file : $type;
-		$this->isgz = (strpos($type, '.tar.gz') !== false || strpos($type, '.tgz') !== false) ? true : false;
-		$this->isbz = (strpos($type, '.tar.bz2') !== false) ? true : false;
+		$this->isgz = preg_match('#(\.tar\.gz|\.tgz)$#', $type);
+		$this->isbz = preg_match('#\.tar\.bz2$#', $type);
 
 		$this->mode = &$mode;
 		$this->file = &$file;
diff -x .svn -aruN 3.0.7-PL1.src/includes/functions_convert.php 3.0.8.src/includes/functions_convert.php
--- 3.0.7-PL1.src/includes/functions_convert.php	2010-03-05 14:36:58.000000000 -0600
+++ 3.0.8.src/includes/functions_convert.php	2010-11-19 06:22:12.000000000 -0600
@@ -1025,6 +1025,9 @@
 		'bbcode'		=> array('bit' => 8, 'default' => 1),
 		'smilies'		=> array('bit' => 9, 'default' => 1),
 		'popuppm'		=> array('bit' => 10, 'default' => 0),
+		'sig_bbcode'	=> array('bit' => 15, 'default' => 1),
+		'sig_smilies'	=> array('bit' => 16, 'default' => 1),
+		'sig_links'		=> array('bit' => 17, 'default' => 1),
 	);
 
 	$option_field = 0;
@@ -1645,6 +1648,7 @@
 
 					case 'mssql':
 					case 'sqlite':
+					case 'mssqlnative':
 						$sql = implode(' UNION ALL ', preg_replace('#^(.*?)$#', 'SELECT \1', $sql_subary));
 					break;
 
@@ -2302,7 +2306,7 @@
 		}
 	}
 
-	if (!is_writable($path))
+	if (!phpbb_is_writable($path))
 	{
 		@chmod($path, 0777);
 	}
@@ -2337,7 +2341,7 @@
 		@chmod($trg_path, 0777);
 	}
 
-	if (!@is_writable($trg_path))
+	if (!phpbb_is_writable($trg_path))
 	{
 		$bad_dirs[] = path($config['script_path']) . $trg;
 	}
@@ -2404,7 +2408,7 @@
 				@chmod($trg_path . $dir, 0777);
 			}
 
-			if (!@is_writable($trg_path . $dir))
+			if (!phpbb_is_writable($trg_path . $dir))
 			{
 				$bad_dirs[] = $trg . $dir;
 				$bad_dirs[] = $trg_path . $dir;
diff -x .svn -aruN 3.0.7-PL1.src/includes/functions_display.php 3.0.8.src/includes/functions_display.php
--- 3.0.7-PL1.src/includes/functions_display.php	2010-03-05 14:36:58.000000000 -0600
+++ 3.0.8.src/includes/functions_display.php	2010-11-19 06:22:12.000000000 -0600
@@ -396,7 +396,7 @@
 		}
 		else
 		{
-			$folder_alt = ($forum_unread) ? 'NEW_POSTS' : 'NO_NEW_POSTS';
+			$folder_alt = ($forum_unread) ? 'UNREAD_POSTS' : 'NO_UNREAD_POSTS';
 		}
 
 		// Create last post link information, if appropriate
@@ -425,7 +425,7 @@
 		$s_subforums_list = array();
 		foreach ($subforums_list as $subforum)
 		{
-			$s_subforums_list[] = '<a href="' . $subforum['link'] . '" class="subforum ' . (($subforum['unread']) ? 'unread' : 'read') . '" title="' . (($subforum['unread']) ? $user->lang['NEW_POSTS'] : $user->lang['NO_NEW_POSTS']) . '">' . $subforum['name'] . '</a>';
+			$s_subforums_list[] = '<a href="' . $subforum['link'] . '" class="subforum ' . (($subforum['unread']) ? 'unread' : 'read') . '" title="' . (($subforum['unread']) ? $user->lang['UNREAD_POSTS'] : $user->lang['NO_UNREAD_POSTS']) . '">' . $subforum['name'] . '</a>';
 		}
 		$s_subforums_list = (string) implode(', ', $s_subforums_list);
 		$catless = ($row['parent_id'] == $root_data['forum_id']) ? true : false;
@@ -660,7 +660,7 @@
 		$times = 1;
 		for ($j = 0; $j < $replies + 1; $j += $per_page)
 		{
-			$pagination .= '<a href="' . $url . '&amp;start=' . $j . '">' . $times . '</a>';
+			$pagination .= '<a href="' . $url . ($j == 0 ? '' : '&amp;start=' . $j) . '">' . $times . '</a>';
 			if ($times == 1 && $total_pages > 5)
 			{
 				$pagination .= ' ... ';
@@ -854,7 +854,7 @@
 
 
 		$folder_img = ($unread_topic) ? $folder_new : $folder;
-		$folder_alt = ($unread_topic) ? 'NEW_POSTS' : (($topic_row['topic_status'] == ITEM_LOCKED) ? 'TOPIC_LOCKED' : 'NO_NEW_POSTS');
+		$folder_alt = ($unread_topic) ? 'UNREAD_POSTS' : (($topic_row['topic_status'] == ITEM_LOCKED) ? 'TOPIC_LOCKED' : 'NO_UNREAD_POSTS');
 
 		// Posted image?
 		if (!empty($topic_row['topic_posted']) && $topic_row['topic_posted'])
@@ -969,11 +969,16 @@
 	$forum_ary = array_unique($forum_ary);
 	$forum_sql = (sizeof($forum_ary)) ? 'AND ' . $db->sql_in_set('forum_id', $forum_ary, true) : '';
 
+	$fid_m_approve = $auth->acl_getf('m_approve', true);
+	$sql_m_approve = (!empty($fid_m_approve)) ? 'OR ' . $db->sql_in_set('forum_id', array_keys($fid_m_approve)) : '';
+
 	// Obtain active forum
 	$sql = 'SELECT forum_id, COUNT(post_id) AS num_posts
 		FROM ' . POSTS_TABLE . '
 		WHERE poster_id = ' . $userdata['user_id'] . "
 			AND post_postcount = 1
+			AND (post_approved = 1
+				$sql_m_approve)
 			$forum_sql
 		GROUP BY forum_id
 		ORDER BY num_posts DESC";
@@ -996,6 +1001,8 @@
 		FROM ' . POSTS_TABLE . '
 		WHERE poster_id = ' . $userdata['user_id'] . "
 			AND post_postcount = 1
+			AND (post_approved = 1
+				$sql_m_approve)
 			$forum_sql
 		GROUP BY topic_id
 		ORDER BY num_posts DESC";
@@ -1112,10 +1119,10 @@
 			{
 				$is_watching = true;
 
-				if ($notify_status)
+				if ($notify_status != NOTIFY_YES)
 				{
 					$sql = 'UPDATE ' . $table_sql . "
-						SET notify_status = 0
+						SET notify_status = " . NOTIFY_YES . "
 						WHERE $where_sql = $match_id
 							AND user_id = $user_id";
 					$db->sql_query($sql);
@@ -1134,7 +1141,7 @@
 					$is_watching = true;
 
 					$sql = 'INSERT INTO ' . $table_sql . " (user_id, $where_sql, notify_status)
-						VALUES ($user_id, $match_id, 0)";
+						VALUES ($user_id, $match_id, " . NOTIFY_YES . ')';
 					$db->sql_query($sql);
 					$message = $user->lang['ARE_WATCHING_' . strtoupper($mode)] . '<br /><br />' . sprintf($user->lang['RETURN_' . strtoupper($mode)], '<a href="' . $redirect_url . '">', '</a>');
 				}
diff -x .svn -aruN 3.0.7-PL1.src/includes/functions_install.php 3.0.8.src/includes/functions_install.php
--- 3.0.7-PL1.src/includes/functions_install.php	2010-03-05 14:36:58.000000000 -0600
+++ 3.0.8.src/includes/functions_install.php	2010-11-19 06:22:12.000000000 -0600
@@ -95,6 +95,16 @@
 			'AVAILABLE'		=> true,
 			'2.0.x'			=> true,
 		),
+		'mssqlnative'		=> array(
+			'LABEL'			=> 'MS SQL Server 2005+ [ Native ]',
+			'SCHEMA'		=> 'mssql',
+			'MODULE'		=> 'sqlsrv',
+			'DELIM'			=> 'GO',
+			'COMMENTS'		=> 'remove_comments',
+			'DRIVER'		=> 'mssqlnative',
+			'AVAILABLE'		=> true,
+			'2.0.x'			=> false,
+		),			
 		'oracle'	=>	array(
 			'LABEL'			=> 'Oracle',
 			'SCHEMA'		=> 'oracle',
@@ -220,6 +230,7 @@
 
 		case 'mssql':
 		case 'mssql_odbc':
+		case 'mssqlnative':
 			$sql = "SELECT name
 				FROM sysobjects
 				WHERE type='U'";
@@ -313,6 +324,7 @@
 
 		case 'mssql':
 		case 'mssql_odbc':
+		case 'mssqlnative':
 			$prefix_length = 90;
 		break;
 
diff -x .svn -aruN 3.0.7-PL1.src/includes/functions_messenger.php 3.0.8.src/includes/functions_messenger.php
--- 3.0.7-PL1.src/includes/functions_messenger.php	2010-03-05 14:36:58.000000000 -0600
+++ 3.0.8.src/includes/functions_messenger.php	2010-11-19 06:22:12.000000000 -0600
@@ -632,6 +632,64 @@
 	}
 
 	/**
+	* Obtains exclusive lock on queue cache file.
+	* Returns resource representing the lock
+	*/
+	function lock()
+	{
+		// For systems that can't have two processes opening
+		// one file for writing simultaneously
+		if (file_exists($this->cache_file . '.lock'))
+		{
+			$mode = 'rb';
+		}
+		else
+		{
+			$mode = 'wb';
+		}
+
+		$lock_fp = @fopen($this->cache_file . '.lock', $mode);
+
+		if ($mode == 'wb')
+		{
+			if (!$lock_fp)
+			{
+				// Two processes may attempt to create lock file at the same time.
+				// Have the losing process try opening the lock file again for reading
+				// on the assumption that the winning process created it
+				$mode = 'rb';
+				$lock_fp = @fopen($this->cache_file . '.lock', $mode);
+			}
+			else
+			{
+				// Only need to set mode when the lock file is written
+				@chmod($this->cache_file . '.lock', 0666);
+			}
+		}
+
+		if ($lock_fp)
+		{
+			@flock($lock_fp, LOCK_EX);
+		}
+
+		return $lock_fp;
+	}
+
+	/**
+	* Releases lock on queue cache file, using resource obtained from lock()
+	*/
+	function unlock($lock_fp)
+	{
+		// lock() will return null if opening lock file, and thus locking, failed.
+		// Accept null values here so that client code does not need to check them
+		if ($lock_fp)
+		{
+			@flock($lock_fp, LOCK_UN);
+			fclose($lock_fp);
+		}
+	}
+
+	/**
 	* Process queue
 	* Using lock file
 	*/
@@ -639,24 +697,16 @@
 	{
 		global $db, $config, $phpEx, $phpbb_root_path, $user;
 
-		set_config('last_queue_run', time(), true);
+		$lock_fp = $this->lock();
 
-		// Delete stale lock file
-		if (file_exists($this->cache_file . '.lock') && !file_exists($this->cache_file))
-		{
-			@unlink($this->cache_file . '.lock');
-			return;
-		}
+		set_config('last_queue_run', time(), true);
 
-		if (!file_exists($this->cache_file) || (file_exists($this->cache_file . '.lock') && filemtime($this->cache_file) > time() - $config['queue_interval']))
+		if (!file_exists($this->cache_file) || filemtime($this->cache_file) > time() - $config['queue_interval'])
 		{
+			$this->unlock($lock_fp);
 			return;
 		}
 
-		$fp = @fopen($this->cache_file . '.lock', 'wb');
-		fclose($fp);
-		@chmod($this->cache_file . '.lock', 0777);
-
 		include($this->cache_file);
 
 		foreach ($this->queue_data as $object => $data_ary)
@@ -671,11 +721,18 @@
 			$package_size = $data_ary['package_size'];
 			$num_items = (!$package_size || sizeof($data_ary['data']) < $package_size) ? sizeof($data_ary['data']) : $package_size;
 
+			/*
+			* This code is commented out because it causes problems on some web hosts.
+			* The core problem is rather restrictive email sending limits.
+			* This code is nly useful if you have no such restrictions from the
+			* web host and the package size setting is wrong.
+
 			// If the amount of emails to be sent is way more than package_size than we need to increase it to prevent backlogs...
 			if (sizeof($data_ary['data']) > $package_size * 2.5)
 			{
 				$num_items = sizeof($data_ary['data']);
 			}
+			*/
 
 			switch ($object)
 			{
@@ -713,6 +770,7 @@
 				break;
 
 				default:
+					$this->unlock($lock_fp);
 					return;
 			}
 
@@ -738,8 +796,6 @@
 
 						if (!$result)
 						{
-							@unlink($this->cache_file . '.lock');
-
 							messenger::error('EMAIL', $err_msg);
 							continue 2;
 						}
@@ -783,16 +839,14 @@
 		{
 			if ($fp = @fopen($this->cache_file, 'wb'))
 			{
-				@flock($fp, LOCK_EX);
 				fwrite($fp, "<?php\nif (!defined('IN_PHPBB')) exit;\n\$this->queue_data = unserialize(" . var_export(serialize($this->queue_data), true) . ");\n\n?>");
-				@flock($fp, LOCK_UN);
 				fclose($fp);
 
 				phpbb_chmod($this->cache_file, CHMOD_READ | CHMOD_WRITE);
 			}
 		}
 
-		@unlink($this->cache_file . '.lock');
+		$this->unlock($lock_fp);
 	}
 
 	/**
@@ -805,6 +859,8 @@
 			return;
 		}
 
+		$lock_fp = $this->lock();
+
 		if (file_exists($this->cache_file))
 		{
 			include($this->cache_file);
@@ -824,13 +880,13 @@
 
 		if ($fp = @fopen($this->cache_file, 'w'))
 		{
-			@flock($fp, LOCK_EX);
 			fwrite($fp, "<?php\nif (!defined('IN_PHPBB')) exit;\n\$this->queue_data = unserialize(" . var_export(serialize($this->data), true) . ");\n\n?>");
-			@flock($fp, LOCK_UN);
 			fclose($fp);
 
 			phpbb_chmod($this->cache_file, CHMOD_READ | CHMOD_WRITE);
 		}
+
+		$this->unlock($lock_fp);
 	}
 }
 
diff -x .svn -aruN 3.0.7-PL1.src/includes/functions.php 3.0.8.src/includes/functions.php
--- 3.0.7-PL1.src/includes/functions.php	2010-03-05 14:36:58.000000000 -0600
+++ 3.0.8.src/includes/functions.php	2010-11-19 06:22:12.000000000 -0600
@@ -114,7 +114,7 @@
 					{
 						$_v = null;
 					}
-					set_var($_k, $_k, $sub_key_type);
+					set_var($_k, $_k, $sub_key_type, $multibyte);
 					set_var($var[$k][$_k], $_v, $sub_type, $multibyte);
 				}
 			}
@@ -175,11 +175,8 @@
 	switch ($db->sql_layer)
 	{
 		case 'firebird':
-			$sql_update = 'CAST(CAST(config_value as integer) + ' . (int) $increment . ' as VARCHAR(255))';
-		break;
-
 		case 'postgres':
-			$sql_update = 'int4(config_value) + ' . (int) $increment;
+			$sql_update = 'CAST(CAST(config_value as DECIMAL(255, 0)) + ' . (int) $increment . ' as VARCHAR(255))';
 		break;
 
 		// MySQL, SQlite, mssql, mssql_odbc, oracle
@@ -198,11 +195,28 @@
 
 /**
 * Generates an alphanumeric random string of given length
+*
+* @return string
 */
 function gen_rand_string($num_chars = 8)
 {
+	// [a, z] + [0, 9] = 36
+	return substr(strtoupper(base_convert(unique_id(), 16, 36)), 0, $num_chars);
+}
+
+/**
+* Generates a user-friendly alphanumeric random string of given length
+* We remove 0 and O so users cannot confuse those in passwords etc.
+*
+* @return string
+*/
+function gen_rand_string_friendly($num_chars = 8)
+{
 	$rand_str = unique_id();
-	$rand_str = str_replace('0', 'Z', strtoupper(base_convert($rand_str, 16, 35)));
+
+	// Remove Z and Y from the base_convert(), replace 0 with Z and O with Y
+	// [a, z] + [0, 9] - {z, y} = [a, z] + [0, 9] - {0, o} = 34
+	$rand_str = str_replace(array('0', 'O'), array('Z', 'Y'), strtoupper(base_convert($rand_str, 16, 34)));
 
 	return substr($rand_str, 0, $num_chars);
 }
@@ -704,7 +718,7 @@
 
 			clearstatcache();
 
-			if (is_readable($filename) && is_writable($filename))
+			if (is_readable($filename) && phpbb_is_writable($filename))
 			{
 				break;
 			}
@@ -714,7 +728,7 @@
 
 			clearstatcache();
 
-			if ((!($perms & CHMOD_READ) || is_readable($filename)) && (!($perms & CHMOD_WRITE) || is_writable($filename)))
+			if ((!($perms & CHMOD_READ) || is_readable($filename)) && (!($perms & CHMOD_WRITE) || phpbb_is_writable($filename)))
 			{
 				break;
 			}
@@ -724,7 +738,7 @@
 
 			clearstatcache();
 
-			if ((!($perms & CHMOD_READ) || is_readable($filename)) && (!($perms & CHMOD_WRITE) || is_writable($filename)))
+			if ((!($perms & CHMOD_READ) || is_readable($filename)) && (!($perms & CHMOD_WRITE) || phpbb_is_writable($filename)))
 			{
 				break;
 			}
@@ -1038,7 +1052,7 @@
 	// @todo If the file exists fine and open_basedir only has one path we should be able to prepend it
 	// because we must be inside that basedir, the question is where...
 	// @internal The slash in is_dir() gets around an open_basedir restriction
-	if (!@file_exists($resolved) || (!is_dir($resolved . '/') && !is_file($resolved)))
+	if (!@file_exists($resolved) || (!@is_dir($resolved . '/') && !is_file($resolved)))
 	{
 		return false;
 	}
@@ -1663,10 +1677,11 @@
 * @param string $sql_extra		Extra WHERE SQL statement
 * @param string $sql_sort		ORDER BY SQL sorting statement
 * @param string $sql_limit		Limits the size of unread topics list, 0 for unlimited query
+* @param string $sql_limit_offset  Sets the offset of the first row to search, 0 to search from the start
 *
 * @return array[int][int]		Topic ids as keys, mark_time of topic as value
 */
-function get_unread_topics($user_id = false, $sql_extra = '', $sql_sort = '', $sql_limit = 1001)
+function get_unread_topics($user_id = false, $sql_extra = '', $sql_sort = '', $sql_limit = 1001, $sql_limit_offset = 0)
 {
 	global $config, $db, $user;
 
@@ -1712,7 +1727,7 @@
 		);
 
 		$sql = $db->sql_build_query('SELECT', $sql_array);
-		$result = $db->sql_query_limit($sql, $sql_limit);
+		$result = $db->sql_query_limit($sql, $sql_limit, $sql_limit_offset);
 
 		while ($row = $db->sql_fetchrow($result))
 		{
@@ -1745,7 +1760,7 @@
 			WHERE t.topic_last_post_time > ' . $user_lastmark . "
 			$sql_extra
 			$sql_sort";
-		$result = $db->sql_query_limit($sql, $sql_limit);
+		$result = $db->sql_query_limit($sql, $sql_limit, $sql_limit_offset);
 
 		while ($row = $db->sql_fetchrow($result))
 		{
@@ -2139,8 +2154,8 @@
 {
 	global $_SID, $_EXTRA_URL, $phpbb_hook;
 
-	// Developers using the hook function need to globalise the $_SID and $_EXTRA_URL on their own and also handle it appropiatly.
-	// They could mimick most of what is within this function
+	// Developers using the hook function need to globalise the $_SID and $_EXTRA_URL on their own and also handle it appropriately.
+	// They could mimic most of what is within this function
 	if (!empty($phpbb_hook) && $phpbb_hook->call_hook(__FUNCTION__, $url, $params, $is_amp, $session_id))
 	{
 		if ($phpbb_hook->hook_return(__FUNCTION__))
@@ -2297,6 +2312,8 @@
 {
 	global $db, $cache, $config, $user, $phpbb_root_path;
 
+	$failover_flag = false;
+
 	if (empty($user->lang))
 	{
 		$user->add_lang('common');
@@ -2336,60 +2353,77 @@
 		// Relative uri
 		$pathinfo = pathinfo($url);
 
-		// Is the uri pointing to the current directory?
-		if ($pathinfo['dirname'] == '.')
+		if (!$disable_cd_check && !file_exists($pathinfo['dirname']))
 		{
-			$url = str_replace('./', '', $url);
+			$url = str_replace('../', '', $url);
+			$pathinfo = pathinfo($url);
 
-			// Strip / from the beginning
-			if ($url && substr($url, 0, 1) == '/')
+			if (!file_exists($pathinfo['dirname']))
 			{
-				$url = substr($url, 1);
+				// fallback to "last known user page"
+				// at least this way we know the user does not leave the phpBB root
+				$url = generate_board_url() . '/' . $user->page['page'];
+				$failover_flag = true;
 			}
+		}
 
-			if ($user->page['page_dir'])
+		if (!$failover_flag)
+		{
+			// Is the uri pointing to the current directory?
+			if ($pathinfo['dirname'] == '.')
 			{
-				$url = generate_board_url() . '/' . $user->page['page_dir'] . '/' . $url;
+				$url = str_replace('./', '', $url);
+
+				// Strip / from the beginning
+				if ($url && substr($url, 0, 1) == '/')
+				{
+					$url = substr($url, 1);
+				}
+
+				if ($user->page['page_dir'])
+				{
+					$url = generate_board_url() . '/' . $user->page['page_dir'] . '/' . $url;
+				}
+				else
+				{
+					$url = generate_board_url() . '/' . $url;
+				}
 			}
 			else
 			{
-				$url = generate_board_url() . '/' . $url;
-			}
-		}
-		else
-		{
-			// Used ./ before, but $phpbb_root_path is working better with urls within another root path
-			$root_dirs = explode('/', str_replace('\\', '/', phpbb_realpath($phpbb_root_path)));
-			$page_dirs = explode('/', str_replace('\\', '/', phpbb_realpath($pathinfo['dirname'])));
-			$intersection = array_intersect_assoc($root_dirs, $page_dirs);
+				// Used ./ before, but $phpbb_root_path is working better with urls within another root path
+				$root_dirs = explode('/', str_replace('\\', '/', phpbb_realpath($phpbb_root_path)));
+				$page_dirs = explode('/', str_replace('\\', '/', phpbb_realpath($pathinfo['dirname'])));
+				$intersection = array_intersect_assoc($root_dirs, $page_dirs);
 
-			$root_dirs = array_diff_assoc($root_dirs, $intersection);
-			$page_dirs = array_diff_assoc($page_dirs, $intersection);
+				$root_dirs = array_diff_assoc($root_dirs, $intersection);
+				$page_dirs = array_diff_assoc($page_dirs, $intersection);
 
-			$dir = str_repeat('../', sizeof($root_dirs)) . implode('/', $page_dirs);
+				$dir = str_repeat('../', sizeof($root_dirs)) . implode('/', $page_dirs);
 
-			// Strip / from the end
-			if ($dir && substr($dir, -1, 1) == '/')
-			{
-				$dir = substr($dir, 0, -1);
-			}
+				// Strip / from the end
+				if ($dir && substr($dir, -1, 1) == '/')
+				{
+					$dir = substr($dir, 0, -1);
+				}
 
-			// Strip / from the beginning
-			if ($dir && substr($dir, 0, 1) == '/')
-			{
-				$dir = substr($dir, 1);
-			}
+				// Strip / from the beginning
+				if ($dir && substr($dir, 0, 1) == '/')
+				{
+					$dir = substr($dir, 1);
+				}
 
-			$url = str_replace($pathinfo['dirname'] . '/', '', $url);
+				$url = str_replace($pathinfo['dirname'] . '/', '', $url);
 
-			// Strip / from the beginning
-			if (substr($url, 0, 1) == '/')
-			{
-				$url = substr($url, 1);
-			}
+				// Strip / from the beginning
+				if (substr($url, 0, 1) == '/')
+				{
+					$url = substr($url, 1);
+				}
 
-			$url = (!empty($dir) ? $dir . '/' : '') . $url;
-			$url = generate_board_url() . '/' . $url;
+				$url = (!empty($dir) ? $dir . '/' : '') . $url;
+				$url = generate_board_url() . '/' . $url;
+			}
 		}
 	}
 
@@ -2502,6 +2536,11 @@
 			$key = $arguments[0];
 			unset($arguments[0]);
 
+			if ($key === '')
+			{
+				continue;
+			}
+
 			$query[$key] = implode('=', $arguments);
 		}
 
@@ -2562,6 +2601,47 @@
 	return $url;
 }
 
+/**
+* Outputs correct status line header.
+*
+* Depending on php sapi one of the two following forms is used:
+*
+* Status: 404 Not Found
+*
+* HTTP/1.x 404 Not Found
+*
+* HTTP version is taken from HTTP_VERSION environment variable,
+* and defaults to 1.0.
+*
+* Sample usage:
+*
+* send_status_line(404, 'Not Found');
+*
+* @param int $code HTTP status code
+* @param string $message Message for the status code
+* @return void
+*/
+function send_status_line($code, $message)
+{
+	if (substr(strtolower(@php_sapi_name()), 0, 3) === 'cgi')
+	{
+		// in theory, we shouldn't need that due to php doing it. Reality offers a differing opinion, though
+		header("Status: $code $message", true, $code);
+	}
+	else
+	{
+		if (isset($_SERVER['HTTP_VERSION']))
+		{
+			$version = $_SERVER['HTTP_VERSION'];
+		}
+		else
+		{
+			$version = 'HTTP/1.0';
+		}
+		header("$version $code $message", true, $code);
+	}
+}
+
 //Form validation
 
 
@@ -3297,7 +3377,9 @@
 	switch ($mode)
 	{
 		case 'email':
-			return '(?:[a-z0-9\'\.\-_\+\|]++|&amp;)+@[a-z0-9\-]+\.(?:[a-z0-9\-]+\.)*[a-z]+';
+			// Regex written by James Watts and Francisco Jose Martin Moreno
+			// http://fightingforalostcause.net/misc/2006/compare-email-regex.php
+			return '([\w\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~]+\.)*(?:[\w\!\#$\%\'\*\+\-\/\=\?\^\`{\|\}\~]|&amp;)+@((((([a-z0-9]{1}[a-z0-9\-]{0,62}[a-z0-9]{1})|[a-z])\.)+[a-z]{2,6})|(\d{1,3}\.){3}\d{1,3}(\:\d{1,5})?)';
 		break;
 
 		case 'bbcode_htm':
@@ -3319,7 +3401,7 @@
 		break;
 
 		case 'ipv6':
-			return '#^(?:(?:(?:[\dA-F]{1,4}:){6}(?:[\dA-F]{1,4}:[\dA-F]{1,4}|(?:(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.){3}(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])))|(?:::(?:[\dA-F]{1,4}:){5}(?:[\dA-F]{1,4}:[\dA-F]{1,4}|(?:(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.){3}(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])))|(?:(?:[\dA-F]{1,4}:):(?:[\dA-F]{1,4}:){4}(?:[\dA-F]{1,4}:[\dA-F]{1,4}|(?:(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.){3}(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])))|(?:(?:[\dA-F]{1,4}:){1,2}:(?:[\dA-F]{1,4}:){3}(?:[\dA-F]{1,4}:[\dA-F]{1,4}|(?:(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.){3}(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])))|(?:(?:[\dA-F]{1,4}:){1,3}:(?:[\dA-F]{1,4}:){2}(?:[\dA-F]{1,4}:[\dA-F]{1,4}|(?:(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.){3}(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])))|(?:(?:[\dA-F]{1,4}:){1,4}:(?:[\dA-F]{1,4}:)(?:[\dA-F]{1,4}:[\dA-F]{1,4}|(?:(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.){3}(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])))|(?:(?:[\dA-F]{1,4}:){1,5}:(?:[\dA-F]{1,4}:[\dA-F]{1,4}|(?:(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.){3}(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])))|(?:(?:[\dA-F]{1,4}:){1,6}:[\dA-F]{1,4})|(?:(?:[\dA-F]{1,4}:){1,7}:))$#i';
+			return '#^(?:(?:(?:[\dA-F]{1,4}:){6}(?:[\dA-F]{1,4}:[\dA-F]{1,4}|(?:(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.){3}(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])))|(?:::(?:[\dA-F]{1,4}:){0,5}(?:[\dA-F]{1,4}(?::[\dA-F]{1,4})?|(?:(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.){3}(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])))|(?:(?:[\dA-F]{1,4}:):(?:[\dA-F]{1,4}:){4}(?:[\dA-F]{1,4}:[\dA-F]{1,4}|(?:(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.){3}(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])))|(?:(?:[\dA-F]{1,4}:){1,2}:(?:[\dA-F]{1,4}:){3}(?:[\dA-F]{1,4}:[\dA-F]{1,4}|(?:(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.){3}(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])))|(?:(?:[\dA-F]{1,4}:){1,3}:(?:[\dA-F]{1,4}:){2}(?:[\dA-F]{1,4}:[\dA-F]{1,4}|(?:(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.){3}(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])))|(?:(?:[\dA-F]{1,4}:){1,4}:(?:[\dA-F]{1,4}:)(?:[\dA-F]{1,4}:[\dA-F]{1,4}|(?:(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.){3}(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])))|(?:(?:[\dA-F]{1,4}:){1,5}:(?:[\dA-F]{1,4}:[\dA-F]{1,4}|(?:(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.){3}(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])))|(?:(?:[\dA-F]{1,4}:){1,6}:[\dA-F]{1,4})|(?:(?:[\dA-F]{1,4}:){1,7}:)|(?:::))$#i';
 		break;
 
 		case 'url':
@@ -3380,25 +3462,110 @@
 /**
 * Wrapper for php's checkdnsrr function.
 *
-* The windows failover is from the php manual
-* Please make sure to check the return value for === true and === false, since NULL could
-* be returned too.
+* @param string $host	Fully-Qualified Domain Name
+* @param string $type	Resource record type to lookup
+*						Supported types are: MX (default), A, AAAA, NS, TXT, CNAME
+*						Other types may work or may not work
+*
+* @return mixed		true if entry found,
+*					false if entry not found,
+*					null if this function is not supported by this environment
 *
-* @return true if entry found, false if not, NULL if this function is not supported by this environment
+* Since null can also be returned, you probably want to compare the result
+* with === true or === false,
+*
+* @author bantu
 */
-function phpbb_checkdnsrr($host, $type = '')
+function phpbb_checkdnsrr($host, $type = 'MX')
 {
-	$type = (!$type) ? 'MX' : $type;
+	// The dot indicates to search the DNS root (helps those having DNS prefixes on the same domain)
+	if (substr($host, -1) == '.')
+	{
+		$host_fqdn = $host;
+		$host = substr($host, 0, -1);
+	}
+	else
+	{
+		$host_fqdn = $host . '.';
+	}
+	// $host		has format	some.host.example.com
+	// $host_fqdn	has format	some.host.example.com.
 
-	if (DIRECTORY_SEPARATOR == '\\')
+	// If we're looking for an A record we can use gethostbyname()
+	if ($type == 'A' && function_exists('gethostbyname'))
 	{
-		if (!function_exists('exec'))
+		return (@gethostbyname($host_fqdn) == $host_fqdn) ? false : true;
+	}
+
+	// checkdnsrr() is available on Windows since PHP 5.3,
+	// but until 5.3.3 it only works for MX records
+	// See: http://bugs.php.net/bug.php?id=51844
+
+	// Call checkdnsrr() if 
+	// we're looking for an MX record or
+	// we're not on Windows or
+	// we're running a PHP version where #51844 has been fixed
+
+	// checkdnsrr() supports AAAA since 5.0.0
+	// checkdnsrr() supports TXT since 5.2.4
+	if (
+		($type == 'MX' || DIRECTORY_SEPARATOR != '\\' || version_compare(PHP_VERSION, '5.3.3', '>=')) &&
+		($type != 'AAAA' || version_compare(PHP_VERSION, '5.0.0', '>=')) &&
+		($type != 'TXT' || version_compare(PHP_VERSION, '5.2.4', '>=')) &&
+		function_exists('checkdnsrr')
+	)
+	{
+		return checkdnsrr($host_fqdn, $type);
+	}
+
+	// dns_get_record() is available since PHP 5; since PHP 5.3 also on Windows,
+	// but on Windows it does not work reliable for AAAA records before PHP 5.3.1
+
+	// Call dns_get_record() if 
+	// we're not looking for an AAAA record or
+	// we're not on Windows or
+	// we're running a PHP version where AAAA lookups work reliable
+	if (
+		($type != 'AAAA' || DIRECTORY_SEPARATOR != '\\' || version_compare(PHP_VERSION, '5.3.1', '>=')) &&
+		function_exists('dns_get_record')
+	)
+	{
+		// dns_get_record() expects an integer as second parameter
+		// We have to convert the string $type to the corresponding integer constant.
+		$type_constant = 'DNS_' . $type;
+		$type_param = (defined($type_constant)) ? constant($type_constant) : DNS_ANY;
+
+		// dns_get_record() might throw E_WARNING and return false for records that do not exist
+		$resultset = @dns_get_record($host_fqdn, $type_param);
+
+		if (empty($resultset) || !is_array($resultset))
 		{
-			return NULL;
+			return false;
+		}
+		else if ($type_param == DNS_ANY)
+		{
+			// $resultset is a non-empty array
+			return true;
 		}
 
-		// @exec('nslookup -retry=1 -timout=1 -type=' . escapeshellarg($type) . ' ' . escapeshellarg($host), $output);
-		@exec('nslookup -type=' . escapeshellarg($type) . ' ' . escapeshellarg($host) . '.', $output);
+		foreach ($resultset as $result)
+		{
+			if (
+				isset($result['host']) && $result['host'] == $host && 
+				isset($result['type']) && $result['type'] == $type
+			)
+			{
+				return true;
+			}
+		}
+
+		return false;
+	}
+
+	// If we're on Windows we can still try to call nslookup via exec() as a last resort
+	if (DIRECTORY_SEPARATOR == '\\' && function_exists('exec'))
+	{
+		@exec('nslookup -type=' . escapeshellarg($type) . ' ' . escapeshellarg($host_fqdn), $output);
 
 		// If output is empty, the nslookup failed
 		if (empty($output))
@@ -3408,25 +3575,71 @@
 
 		foreach ($output as $line)
 		{
-			if (!trim($line))
+			$line = trim($line);
+
+			if (empty($line))
 			{
 				continue;
 			}
 
-			// Valid records begin with host name:
-			if (strpos($line, $host) === 0)
+			// Squash tabs and multiple whitespaces to a single whitespace.
+			$line = preg_replace('/\s+/', ' ', $line);
+
+			switch ($type)
 			{
-				return true;
+				case 'MX':
+					if (stripos($line, "$host MX") === 0)
+					{
+						return true;
+					}
+				break;
+
+				case 'NS':
+					if (stripos($line, "$host nameserver") === 0)
+					{
+						return true;
+					}
+				break;
+
+				case 'TXT':
+					if (stripos($line, "$host text") === 0)
+					{
+						return true;
+					}
+				break;
+
+				case 'CNAME':
+					if (stripos($line, "$host canonical name") === 0)
+					{
+						return true;
+					}
+
+				default:
+				case 'A':
+				case 'AAAA':
+					if (!empty($host_matches))
+					{
+						// Second line
+						if (stripos($line, "Address: ") === 0)
+						{
+							return true;
+						}
+						else
+						{
+							$host_matches = false;
+						}
+					}
+					else if (stripos($line, "Name: $host") === 0)
+					{
+						// First line
+						$host_matches = true;
+					}
+				break;
 			}
 		}
 
 		return false;
 	}
-	else if (function_exists('checkdnsrr'))
-	{
-		// The dot indicates to search the DNS root (helps those having DNS prefixes on the same domain)
-		return (checkdnsrr($host . '.', $type)) ? true : false;
-	}
 
 	return NULL;
 }
@@ -3540,7 +3753,7 @@
 			}
 
 			// Do not send 200 OK, but service unavailable on errors
-			header('HTTP/1.1 503 Service Unavailable');
+			send_status_line(503, 'Service Unavailable');
 
 			garbage_collection();
 
@@ -3609,6 +3822,11 @@
 				$user->setup();
 			}
 
+			if ($msg_text == 'ERROR_NO_ATTACHMENT' || $msg_text == 'NO_FORUM' || $msg_text == 'NO_TOPIC' || $msg_text == 'NO_USER')
+			{
+				send_status_line(404, 'Not Found');
+			}
+
 			$msg_text = (!empty($user->lang[$msg_text])) ? $user->lang[$msg_text] : $msg_text;
 			$msg_title = (!isset($msg_title)) ? $user->lang['INFORMATION'] : ((!empty($user->lang[$msg_title])) ? $user->lang[$msg_title] : $msg_title);
 
@@ -4005,7 +4223,8 @@
 		}
 		else if ($auth_result['status'] == LOGIN_ERROR_ATTEMPTS)
 		{
-			header('HTTP/1.0 401 Unauthorized');
+			send_status_line(401, 'Unauthorized');
+
 			trigger_error('NOT_AUTHORISED');
 		}
 	}
@@ -4017,7 +4236,7 @@
 	$param['auth_message'] = preg_replace('/[\x80-\xFF]/', '?', $param['auth_message']);
 
 	header('WWW-Authenticate: Basic realm="' . $param['auth_message'] . '"');
-	header('HTTP/1.0 401 Unauthorized');
+	send_status_line(401, 'Unauthorized');
 
 	trigger_error('NOT_AUTHORISED');
 }
@@ -4238,7 +4457,7 @@
 		'S_TOPIC_ID'			=> $topic_id,
 
 		'S_LOGIN_ACTION'		=> ((!defined('ADMIN_START')) ? append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=login') : append_sid("index.$phpEx", false, true, $user->session_id)),
-		'S_LOGIN_REDIRECT'		=> build_hidden_fields(array('redirect' => str_replace('&amp;', '&', build_url()))),
+		'S_LOGIN_REDIRECT'		=> build_hidden_fields(array('redirect' => build_url())),
 
 		'S_ENABLE_FEEDS'			=> ($config['feed_enable']) ? true : false,
 		'S_ENABLE_FEEDS_OVERALL'	=> ($config['feed_overall']) ? true : false,
@@ -4247,6 +4466,8 @@
 		'S_ENABLE_FEEDS_TOPICS_ACTIVE'	=> ($config['feed_topics_active']) ? true : false,
 		'S_ENABLE_FEEDS_NEWS'		=> ($s_feed_news) ? true : false,
 
+		'S_LOAD_UNREADS'			=> ($config['load_unreads_search'] && ($config['load_anon_lastread'] || $user->data['is_registered'])) ? true : false,
+
 		'T_THEME_PATH'			=> "{$web_path}styles/" . $user->theme['theme_path'] . '/theme',
 		'T_TEMPLATE_PATH'		=> "{$web_path}styles/" . $user->theme['template_path'] . '/template',
 		'T_SUPER_TEMPLATE_PATH'	=> (isset($user->theme['template_inherit_path']) && $user->theme['template_inherit_path']) ? "{$web_path}styles/" . $user->theme['template_inherit_path'] . '/template' : "{$web_path}styles/" . $user->theme['template_path'] . '/template',
@@ -4259,7 +4480,7 @@
 		'T_ICONS_PATH'			=> "{$web_path}{$config['icons_path']}/",
 		'T_RANKS_PATH'			=> "{$web_path}{$config['ranks_path']}/",
 		'T_UPLOAD_PATH'			=> "{$web_path}{$config['upload_path']}/",
-		'T_STYLESHEET_LINK'		=> (!$user->theme['theme_storedb']) ? "{$web_path}styles/" . $user->theme['theme_path'] . '/theme/stylesheet.css' : append_sid("{$phpbb_root_path}style.$phpEx", 'id=' . $user->theme['style_id'] . '&amp;lang=' . $user->data['user_lang'], true, $user->session_id),
+		'T_STYLESHEET_LINK'		=> (!$user->theme['theme_storedb']) ? "{$web_path}styles/" . $user->theme['theme_path'] . '/theme/stylesheet.css' : append_sid("{$phpbb_root_path}style.$phpEx", 'id=' . $user->theme['style_id'] . '&amp;lang=' . $user->data['user_lang']),
 		'T_STYLESHEET_NAME'		=> $user->theme['theme_name'],
 
 		'T_THEME_NAME'			=> $user->theme['theme_path'],
diff -x .svn -aruN 3.0.7-PL1.src/includes/functions_posting.php 3.0.8.src/includes/functions_posting.php
--- 3.0.7-PL1.src/includes/functions_posting.php	2010-03-05 14:36:58.000000000 -0600
+++ 3.0.8.src/includes/functions_posting.php	2010-11-19 06:22:12.000000000 -0600
@@ -85,10 +85,10 @@
 
 	if ($mode == 'window')
 	{
-		$sql = 'SELECT smiley_url, MIN(emotion) as emotion, MIN(code) AS code, smiley_width, smiley_height
+		$sql = 'SELECT smiley_url, MIN(emotion) as emotion, MIN(code) AS code, smiley_width, smiley_height, MIN(smiley_order) AS min_smiley_order
 			FROM ' . SMILIES_TABLE . '
 			GROUP BY smiley_url, smiley_width, smiley_height
-			ORDER BY MIN(smiley_order)';
+			ORDER BY min_smiley_order';
 		$result = $db->sql_query_limit($sql, $config['smilies_per_page'], $start, 3600);
 	}
 	else
@@ -348,7 +348,7 @@
 	{
 		$topic_type_array = array_merge(array(0 => array(
 			'VALUE'			=> POST_NORMAL,
-			'S_CHECKED'		=> ($topic_type == POST_NORMAL) ? ' checked="checked"' : '',
+			'S_CHECKED'		=> ($cur_topic_type == POST_NORMAL) ? ' checked="checked"' : '',
 			'L_TOPIC_TYPE'	=> $user->lang['POST_NORMAL'])),
 
 			$topic_type_array
@@ -1146,7 +1146,7 @@
 			}
 		}
 
-		unset($rowset[$i]);
+		unset($rowset[$post_list[$i]]);
 	}
 
 	if ($mode == 'topic_review')
@@ -1201,8 +1201,8 @@
 		FROM ' . (($topic_notification) ? TOPICS_WATCH_TABLE : FORUMS_WATCH_TABLE) . ' w, ' . USERS_TABLE . ' u
 		WHERE w.' . (($topic_notification) ? 'topic_id' : 'forum_id') . ' = ' . (($topic_notification) ? $topic_id : $forum_id) . "
 			AND w.user_id NOT IN ($sql_ignore_users)
-			AND w.notify_status = 0
-			AND u.user_type IN (" . USER_NORMAL . ', ' . USER_FOUNDER . ')
+			AND w.notify_status = " . NOTIFY_YES . '
+			AND u.user_type IN (' . USER_NORMAL . ', ' . USER_FOUNDER . ')
 			AND u.user_id = w.user_id';
 	$result = $db->sql_query($sql);
 
@@ -1234,8 +1234,8 @@
 			FROM ' . FORUMS_WATCH_TABLE . ' fw, ' . USERS_TABLE . " u
 			WHERE fw.forum_id = $forum_id
 				AND fw.user_id NOT IN ($sql_ignore_users)
-				AND fw.notify_status = 0
-				AND u.user_type IN (" . USER_NORMAL . ', ' . USER_FOUNDER . ')
+				AND fw.notify_status = " . NOTIFY_YES . '
+				AND u.user_type IN (' . USER_NORMAL . ', ' . USER_FOUNDER . ')
 				AND u.user_id = fw.user_id';
 		$result = $db->sql_query($sql);
 
@@ -1344,8 +1344,8 @@
 
 	if (!empty($update_notification['topic']))
 	{
-		$sql = 'UPDATE ' . TOPICS_WATCH_TABLE . "
-			SET notify_status = 1
+		$sql = 'UPDATE ' . TOPICS_WATCH_TABLE . '
+			SET notify_status = ' . NOTIFY_NO . "
 			WHERE topic_id = $topic_id
 				AND " . $db->sql_in_set('user_id', $update_notification['topic']);
 		$db->sql_query($sql);
@@ -1353,8 +1353,8 @@
 
 	if (!empty($update_notification['forum']))
 	{
-		$sql = 'UPDATE ' . FORUMS_WATCH_TABLE . "
-			SET notify_status = 1
+		$sql = 'UPDATE ' . FORUMS_WATCH_TABLE . '
+			SET notify_status = ' . NOTIFY_NO . "
 			WHERE forum_id = $forum_id
 				AND " . $db->sql_in_set('user_id', $update_notification['forum']);
 		$db->sql_query($sql);
@@ -2537,7 +2537,7 @@
 	if ($mode == 'post' || $mode == 'reply' || $mode == 'quote')
 	{
 		// Mark this topic as posted to
-		markread('post', $data['forum_id'], $data['topic_id'], $data['post_time']);
+		markread('post', $data['forum_id'], $data['topic_id']);
 	}
 
 	// Mark this topic as read
@@ -2583,7 +2583,7 @@
 	}
 
 	// Send Notifications
-	if ($mode != 'edit' && $mode != 'delete' && $post_approval)
+	if (($mode == 'reply' || $mode == 'quote' || $mode == 'post') && $post_approval)
 	{
 		user_notification($mode, $subject, $data['topic_title'], $data['forum_name'], $data['forum_id'], $data['topic_id'], $data['post_id']);
 	}
diff -x .svn -aruN 3.0.7-PL1.src/includes/functions_privmsgs.php 3.0.8.src/includes/functions_privmsgs.php
--- 3.0.7-PL1.src/includes/functions_privmsgs.php	2010-03-05 14:36:59.000000000 -0600
+++ 3.0.8.src/includes/functions_privmsgs.php	2010-11-19 06:22:12.000000000 -0600
@@ -1380,6 +1380,9 @@
 		}
 	}
 
+	// First of all make sure the subject are having the correct length.
+	$subject = truncate_string($subject);
+
 	$db->sql_transaction('begin');
 
 	$sql = '';
@@ -1751,6 +1754,8 @@
 		return false;
 	}
 
+	$title = $row['message_subject'];
+
 	$rowset = array();
 	$bbcode_bitfield = '';
 	$folder_url = append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=pm') . '&amp;folder=';
@@ -1774,8 +1779,6 @@
 	while ($row = $db->sql_fetchrow($result));
 	$db->sql_freeresult($result);
 
-	$title = $row['message_subject'];
-
 	if (sizeof($rowset) == 1 && !$in_post_mode)
 	{
 		return false;
diff -x .svn -aruN 3.0.7-PL1.src/includes/functions_profile_fields.php 3.0.8.src/includes/functions_profile_fields.php
--- 3.0.7-PL1.src/includes/functions_profile_fields.php	2010-03-05 14:36:58.000000000 -0600
+++ 3.0.8.src/includes/functions_profile_fields.php	2010-11-19 06:22:12.000000000 -0600
@@ -366,6 +366,7 @@
 			case 'sqlite':
 			case 'mssql':
 			case 'mssql_odbc':
+			case 'mssqlnative':
 				$right_delim = ']';
 				$left_delim = '[';
 			break;
@@ -542,8 +543,9 @@
 				else if ($day && $month && $year)
 				{
 					global $user;
-					// d/m/y 00:00 GMT isn't necessarily on the same d/m/y in the user's timezone, so add the timezone seconds
-					return $user->format_date(gmmktime(0, 0, 0, $month, $day, $year) + $user->timezone + $user->dst, $user->lang['DATE_FORMAT'], true);
+					// Date should display as the same date for every user regardless of timezone, so remove offset
+					// to compensate for the offset added by user::format_date()
+					return $user->format_date(gmmktime(0, 0, 0, $month, $day, $year) - ($user->timezone + $user->dst), $user->lang['DATE_FORMAT'], true);
 				}
 
 				return $value;
@@ -876,6 +878,11 @@
 				$now = getdate();
 				$row['field_default_value'] = sprintf('%2d-%2d-%4d', $now['mday'], $now['mon'], $now['year']);
 			}
+			else if ($row['field_default_value'] === '' && $row['field_type'] == FIELD_INT)
+			{
+				// We cannot insert an empty string into an integer column.
+				$row['field_default_value'] = NULL;
+			}
 
 			$cp_data['pf_' . $row['field_ident']] = (in_array($row['field_type'], array(FIELD_TEXT, FIELD_STRING))) ? $row['lang_default_value'] : $row['field_default_value'];
 		}
diff -x .svn -aruN 3.0.7-PL1.src/includes/functions_upload.php 3.0.8.src/includes/functions_upload.php
--- 3.0.7-PL1.src/includes/functions_upload.php	2010-03-05 14:36:59.000000000 -0600
+++ 3.0.8.src/includes/functions_upload.php	2010-11-19 06:22:12.000000000 -0600
@@ -58,8 +58,9 @@
 
 		$this->filename = $upload_ary['tmp_name'];
 		$this->filesize = $upload_ary['size'];
-		$name = trim(utf8_htmlspecialchars(utf8_basename($upload_ary['name'])));
-		$this->realname = $this->uploadname = (STRIP) ? stripslashes($name) : $name;
+		$name = (STRIP) ? stripslashes($upload_ary['name']) : $upload_ary['name'];
+		$name = trim(utf8_htmlspecialchars(utf8_basename($name)));
+		$this->realname = $this->uploadname = $name;
 		$this->mimetype = $upload_ary['type'];
 
 		// Opera adds the name to the mime type
@@ -775,7 +776,18 @@
 		{
 			if ($get_info)
 			{
-				$data .= @fread($fsock, 1024);
+				$block = @fread($fsock, 1024);
+				$filesize += strlen($block);
+
+				if ($this->max_filesize && $filesize > $this->max_filesize)
+				{
+					$max_filesize = get_formatted_filesize($this->max_filesize, false);
+
+					$file = new fileerror(sprintf($user->lang[$this->error_prefix . 'WRONG_FILESIZE'], $max_filesize['value'], $max_filesize['unit']));
+					return $file;
+				}
+
+				$data .= $block;
 			}
 			else
 			{
@@ -791,6 +803,18 @@
 					{
 						$upload_ary['type'] = rtrim(str_replace('content-type: ', '', strtolower($line)));
 					}
+					else if ($this->max_filesize && stripos($line, 'content-length: ') !== false)
+					{
+						$length = (int) str_replace('content-length: ', '', strtolower($line));
+
+						if ($length && $length > $this->max_filesize)
+						{
+							$max_filesize = get_formatted_filesize($this->max_filesize, false);
+
+							$file = new fileerror(sprintf($user->lang[$this->error_prefix . 'WRONG_FILESIZE'], $max_filesize['value'], $max_filesize['unit']));
+							return $file;
+						}
+					}
 					else if (stripos($line, '404 not found') !== false)
 					{
 						$file = new fileerror($user->lang[$this->error_prefix . 'URL_NOT_FOUND']);
diff -x .svn -aruN 3.0.7-PL1.src/includes/functions_user.php 3.0.8.src/includes/functions_user.php
--- 3.0.7-PL1.src/includes/functions_user.php	2010-03-05 14:36:58.000000000 -0600
+++ 3.0.8.src/includes/functions_user.php	2010-11-19 06:22:12.000000000 -0600
@@ -297,6 +297,7 @@
 			if ($config['new_member_group_default'])
 			{
 				group_user_add($add_group_id, $user_id, false, false, true);
+				$user_row['group_id'] = $add_group_id;
 			}
 			else
 			{
@@ -527,7 +528,7 @@
 
 	$db->sql_transaction('begin');
 
-	$table_ary = array(USERS_TABLE, USER_GROUP_TABLE, TOPICS_WATCH_TABLE, FORUMS_WATCH_TABLE, ACL_USERS_TABLE, TOPICS_TRACK_TABLE, TOPICS_POSTED_TABLE, FORUMS_TRACK_TABLE, PROFILE_FIELDS_DATA_TABLE, MODERATOR_CACHE_TABLE, DRAFTS_TABLE, BOOKMARKS_TABLE, SESSIONS_KEYS_TABLE);
+	$table_ary = array(USERS_TABLE, USER_GROUP_TABLE, TOPICS_WATCH_TABLE, FORUMS_WATCH_TABLE, ACL_USERS_TABLE, TOPICS_TRACK_TABLE, TOPICS_POSTED_TABLE, FORUMS_TRACK_TABLE, PROFILE_FIELDS_DATA_TABLE, MODERATOR_CACHE_TABLE, DRAFTS_TABLE, BOOKMARKS_TABLE, SESSIONS_KEYS_TABLE, PRIVMSGS_FOLDER_TABLE, PRIVMSGS_RULES_TABLE);
 
 	foreach ($table_ary as $table)
 	{
@@ -765,7 +766,8 @@
 			if (sizeof($ban_other) == 3 && ((int)$ban_other[0] < 9999) &&
 				(strlen($ban_other[0]) == 4) && (strlen($ban_other[1]) == 2) && (strlen($ban_other[2]) == 2))
 			{
-				$ban_end = max($current_time, gmmktime(0, 0, 0, (int)$ban_other[1], (int)$ban_other[2], (int)$ban_other[0]));
+				$time_offset = (isset($user->timezone) && isset($user->dst)) ? (int) $user->timezone + (int) $user->dst : 0;
+				$ban_end = max($current_time, gmmktime(0, 0, 0, (int)$ban_other[1], (int)$ban_other[2], (int)$ban_other[0]) - $time_offset);
 			}
 			else
 			{
@@ -836,14 +838,15 @@
 				FROM ' . USERS_TABLE . '
 				WHERE ' . $db->sql_in_set('username_clean', $sql_usernames);
 
-			// Do not allow banning yourself
+			// Do not allow banning yourself, the guest account, or founders.
+			$non_bannable = array($user->data['user_id'], ANONYMOUS);
 			if (sizeof($founder))
 			{
-				$sql .= ' AND ' . $db->sql_in_set('user_id', array_merge(array_keys($founder), array($user->data['user_id'])), true);
+				$sql .= ' AND ' . $db->sql_in_set('user_id', array_merge(array_keys($founder), $non_bannable), true);
 			}
 			else
 			{
-				$sql .= ' AND user_id <> ' . $user->data['user_id'];
+				$sql .= ' AND ' . $db->sql_in_set('user_id', $non_bannable, true);
 			}
 
 			$result = $db->sql_query($sql);
@@ -1227,22 +1230,39 @@
 }
 
 /**
-* Whois facility
+* Internet Protocol Address Whois
+* RFC3912: WHOIS Protocol Specification
 *
-* @link http://tools.ietf.org/html/rfc3912 RFC3912: WHOIS Protocol Specification
+* @param string $ip		Ip address, either IPv4 or IPv6.
+*
+* @return string		Empty string if not a valid ip address.
+*						Otherwise make_clickable()'ed whois result.
 */
 function user_ipwhois($ip)
 {
-	$ipwhois = '';
+	if (empty($ip))
+	{
+		return '';
+	}
 
-	// Check IP
-	// Only supporting IPv4 at the moment...
-	if (empty($ip) || !preg_match(get_preg_expression('ipv4'), $ip))
+	if (preg_match(get_preg_expression('ipv4'), $ip))
+	{
+		// IPv4 address
+		$whois_host = 'whois.arin.net.';
+	}
+	else if (preg_match(get_preg_expression('ipv6'), $ip))
+	{
+		// IPv6 address
+		$whois_host = 'whois.sixxs.net.';
+	}
+	else
 	{
 		return '';
 	}
 
-	if (($fsk = @fsockopen('whois.arin.net', 43)))
+	$ipwhois = '';
+
+	if (($fsk = @fsockopen($whois_host, 43)))
 	{
 		// CRLF as per RFC3912
 		fputs($fsk, "$ip\r\n");
@@ -1255,7 +1275,7 @@
 
 	$match = array();
 
-	// Test for referrals from ARIN to other whois databases, roll on rwhois
+	// Test for referrals from $whois_host to other whois databases, roll on rwhois
 	if (preg_match('#ReferralServer: whois://(.+)#im', $ipwhois, $match))
 	{
 		if (strpos($match[1], ':') !== false)
@@ -1283,7 +1303,7 @@
 			@fclose($fsk);
 		}
 
-		// Use the result from ARIN if we don't get any result here
+		// Use the result from $whois_host if we don't get any result here
 		$ipwhois = (empty($buffer)) ? $ipwhois : $buffer;
 	}
 
@@ -2283,7 +2303,7 @@
 /**
 * Uploading/Changing user avatar
 */
-function avatar_process_user(&$error, $custom_userdata = false)
+function avatar_process_user(&$error, $custom_userdata = false, $can_upload = null)
 {
 	global $config, $phpbb_root_path, $auth, $user, $db;
 
@@ -2322,7 +2342,10 @@
 	$avatar_select = basename(request_var('avatar_select', ''));
 
 	// Can we upload?
-	$can_upload = ($config['allow_avatar_upload'] && file_exists($phpbb_root_path . $config['avatar_path']) && @is_writable($phpbb_root_path . $config['avatar_path']) && $change_avatar && (@ini_get('file_uploads') || strtolower(@ini_get('file_uploads')) == 'on')) ? true : false;
+	if (is_null($can_upload))
+	{
+		$can_upload = ($config['allow_avatar_upload'] && file_exists($phpbb_root_path . $config['avatar_path']) && phpbb_is_writable($phpbb_root_path . $config['avatar_path']) && $change_avatar && (@ini_get('file_uploads') || strtolower(@ini_get('file_uploads')) == 'on')) ? true : false;
+	}
 
 	if ((!empty($_FILES['uploadfile']['name']) || $data['uploadurl']) && $can_upload)
 	{
@@ -2347,7 +2370,7 @@
 		}
 		else
 		{
-			list($sql_ary['user_avatar_width'], $sql_ary['user_avatar_height']) = getimagesize($phpbb_root_path . $config['avatar_gallery_path'] . '/' . $category . '/' . $sql_ary['user_avatar']);
+			list($sql_ary['user_avatar_width'], $sql_ary['user_avatar_height']) = getimagesize($phpbb_root_path . $config['avatar_gallery_path'] . '/' . $category . '/' . urldecode($sql_ary['user_avatar']));
 			$sql_ary['user_avatar'] = $category . '/' . $sql_ary['user_avatar'];
 		}
 	}
diff -x .svn -aruN 3.0.7-PL1.src/includes/.htaccess 3.0.8.src/includes/.htaccess
--- 3.0.7-PL1.src/includes/.htaccess	1969-12-31 18:00:00.000000000 -0600
+++ 3.0.8.src/includes/.htaccess	2010-11-19 06:22:12.000000000 -0600
@@ -0,0 +1,4 @@
+<Files *>
+	Order Allow,Deny
+	Deny from All
+</Files>
diff -x .svn -aruN 3.0.7-PL1.src/includes/mcp/mcp_main.php 3.0.8.src/includes/mcp/mcp_main.php
--- 3.0.7-PL1.src/includes/mcp/mcp_main.php	2010-03-05 14:36:58.000000000 -0600
+++ 3.0.8.src/includes/mcp/mcp_main.php	2010-11-19 06:22:12.000000000 -0600
@@ -1048,6 +1048,35 @@
 		$total_posts = 0;
 		$new_topic_id_list = array();
 
+		if ($topic_data['enable_indexing'])
+		{
+			// Select the search method and do some additional checks to ensure it can actually be utilised
+			$search_type = basename($config['search_type']);
+
+			if (!file_exists($phpbb_root_path . 'includes/search/' . $search_type . '.' . $phpEx))
+			{
+				trigger_error('NO_SUCH_SEARCH_MODULE');
+			}
+
+			if (!class_exists($search_type))
+			{
+				include("{$phpbb_root_path}includes/search/$search_type.$phpEx");
+			}
+
+			$error = false;
+			$search = new $search_type($error);
+			$search_mode = 'post';
+
+			if ($error)
+			{
+				trigger_error($error);
+			}
+		}
+		else
+		{
+			$search_type = false;
+		}
+
 		foreach ($topic_data as $topic_id => $topic_row)
 		{
 			$sql_ary = array(
@@ -1158,6 +1187,12 @@
 				// Copy whether the topic is dotted
 				markread('post', $to_forum_id, $new_topic_id, 0, $row['poster_id']);
 
+				if ($search_type)
+				{
+					$search->index($search_mode, $sql_ary['post_id'], $sql_ary['post_text'], $sql_ary['post_subject'], $sql_ary['poster_id'], ($topic_row['topic_type'] == POST_GLOBAL) ? 0 : $to_forum_id);
+					$search_mode = 'reply'; // After one we index replies
+				}
+
 				// Copy Attachments
 				if ($row['post_attachment'])
 				{
diff -x .svn -aruN 3.0.7-PL1.src/includes/mcp/mcp_post.php 3.0.8.src/includes/mcp/mcp_post.php
--- 3.0.7-PL1.src/includes/mcp/mcp_post.php	2010-03-05 14:36:58.000000000 -0600
+++ 3.0.8.src/includes/mcp/mcp_post.php	2010-11-19 06:22:12.000000000 -0600
@@ -176,7 +176,7 @@
 	}
 
 	$template->assign_vars(array(
-		'U_MCP_ACTION'			=> "$url&amp;i=main&amp;quickmod=1", // Use this for mode paramaters
+		'U_MCP_ACTION'			=> "$url&amp;i=main&amp;quickmod=1&amp;mode=post_details", // Use this for mode paramaters
 		'U_POST_ACTION'			=> "$url&amp;i=$id&amp;mode=post_details", // Use this for action parameters
 		'U_APPROVE_ACTION'		=> append_sid("{$phpbb_root_path}mcp.$phpEx", "i=queue&amp;p=$post_id&amp;f={$post_info['forum_id']}"),
 
@@ -200,7 +200,7 @@
 		'U_VIEW_POST'			=> append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'f=' . $post_info['forum_id'] . '&amp;p=' . $post_info['post_id'] . '#p' . $post_info['post_id']),
 		'U_VIEW_TOPIC'			=> append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'f=' . $post_info['forum_id'] . '&amp;t=' . $post_info['topic_id']),
 
-		'MINI_POST_IMG'			=> ($post_unread) ? $user->img('icon_post_target_unread', 'NEW_POST') : $user->img('icon_post_target', 'POST'),
+		'MINI_POST_IMG'			=> ($post_unread) ? $user->img('icon_post_target_unread', 'UNREAD_POST') : $user->img('icon_post_target', 'POST'),
 
 		'RETURN_TOPIC'			=> sprintf($user->lang['RETURN_TOPIC'], '<a href="' . append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f={$post_info['forum_id']}&amp;p=$post_id") . "#p$post_id\">", '</a>'),
 		'RETURN_FORUM'			=> sprintf($user->lang['RETURN_FORUM'], '<a href="' . append_sid("{$phpbb_root_path}viewforum.$phpEx", "f={$post_info['forum_id']}&amp;start={$start}") . '">', '</a>'),
diff -x .svn -aruN 3.0.7-PL1.src/includes/mcp/mcp_queue.php 3.0.8.src/includes/mcp/mcp_queue.php
--- 3.0.7-PL1.src/includes/mcp/mcp_queue.php	2010-03-05 14:36:58.000000000 -0600
+++ 3.0.8.src/includes/mcp/mcp_queue.php	2010-11-19 06:22:12.000000000 -0600
@@ -196,7 +196,7 @@
 					'U_VIEW_POST'			=> $post_url,
 					'U_VIEW_TOPIC'			=> $topic_url,
 
-					'MINI_POST_IMG'			=> ($post_unread) ? $user->img('icon_post_target_unread', 'NEW_POST') : $user->img('icon_post_target', 'POST'),
+					'MINI_POST_IMG'			=> ($post_unread) ? $user->img('icon_post_target_unread', 'UNREAD_POST') : $user->img('icon_post_target', 'POST'),
 
 					'RETURN_QUEUE'			=> sprintf($user->lang['RETURN_QUEUE'], '<a href="' . append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=queue' . (($topic_id) ? '&amp;mode=unapproved_topics' : '&amp;mode=unapproved_posts')) . "&amp;start=$start\">", '</a>'),
 					'RETURN_POST'			=> sprintf($user->lang['RETURN_POST'], '<a href="' . $post_url . '">', '</a>'),
@@ -428,7 +428,7 @@
 
 						'POST_ID'		=> $row['post_id'],
 						'FORUM_NAME'	=> (!$global_topic) ? $forum_names[$row['forum_id']] : $user->lang['GLOBAL_ANNOUNCEMENT'],
-						'POST_SUBJECT'	=> $row['post_subject'],
+						'POST_SUBJECT'	=> ($row['post_subject'] != '') ? $row['post_subject'] : $user->lang['NO_SUBJECT'],
 						'TOPIC_TITLE'	=> $row['topic_title'],
 						'POST_TIME'		=> $user->format_date($row['post_time']))
 					);
@@ -691,16 +691,19 @@
 	{
 		$show_notify = false;
 
-		foreach ($post_info as $post_data)
+		if ($config['email_enable'] || $config['jab_enable'])
 		{
-			if ($post_data['poster_id'] == ANONYMOUS)
-			{
-				continue;
-			}
-			else
+			foreach ($post_info as $post_data)
 			{
-				$show_notify = true;
-				break;
+				if ($post_data['poster_id'] == ANONYMOUS)
+				{
+					continue;
+				}
+				else
+				{
+					$show_notify = true;
+					break;
+				}
 			}
 		}
 
diff -x .svn -aruN 3.0.7-PL1.src/includes/mcp/mcp_reports.php 3.0.8.src/includes/mcp/mcp_reports.php
--- 3.0.7-PL1.src/includes/mcp/mcp_reports.php	2010-03-05 14:36:58.000000000 -0600
+++ 3.0.8.src/includes/mcp/mcp_reports.php	2010-11-19 06:22:12.000000000 -0600
@@ -205,7 +205,7 @@
 					'U_VIEW_TOPIC'				=> append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'f=' . $post_info['forum_id'] . '&amp;t=' . $post_info['topic_id']),
 
 					'EDIT_IMG'				=> $user->img('icon_post_edit', $user->lang['EDIT_POST']),
-					'MINI_POST_IMG'			=> ($post_unread) ? $user->img('icon_post_target_unread', 'NEW_POST') : $user->img('icon_post_target', 'POST'),
+					'MINI_POST_IMG'			=> ($post_unread) ? $user->img('icon_post_target_unread', 'UNREAD_POST') : $user->img('icon_post_target', 'POST'),
 					'UNAPPROVED_IMG'		=> $user->img('icon_topic_unapproved', $user->lang['POST_UNAPPROVED']),
 
 					'RETURN_REPORTS'			=> sprintf($user->lang['RETURN_REPORTS'], '<a href="' . append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=reports' . (($post_info['post_reported']) ? '&amp;mode=reports' : '&amp;mode=reports_closed') . '&amp;start=' . $start . '&amp;f=' . $post_info['forum_id']) . '">', '</a>'),
diff -x .svn -aruN 3.0.7-PL1.src/includes/mcp/mcp_topic.php 3.0.8.src/includes/mcp/mcp_topic.php
--- 3.0.7-PL1.src/includes/mcp/mcp_topic.php	2010-03-05 14:36:58.000000000 -0600
+++ 3.0.8.src/includes/mcp/mcp_topic.php	2010-11-19 06:22:12.000000000 -0600
@@ -237,7 +237,7 @@
 			'POST_ID'		=> $row['post_id'],
 			'RETURN_TOPIC'	=> sprintf($user->lang['RETURN_TOPIC'], '<a href="' . append_sid("{$phpbb_root_path}viewtopic.$phpEx", 't=' . $topic_id) . '">', '</a>'),
 
-			'MINI_POST_IMG'			=> ($post_unread) ? $user->img('icon_post_target_unread', 'NEW_POST') : $user->img('icon_post_target', 'POST'),
+			'MINI_POST_IMG'			=> ($post_unread) ? $user->img('icon_post_target_unread', 'UNREAD_POST') : $user->img('icon_post_target', 'POST'),
 
 			'S_POST_REPORTED'	=> ($row['post_reported']) ? true : false,
 			'S_POST_UNAPPROVED'	=> ($row['post_approved']) ? false : true,
diff -x .svn -aruN 3.0.7-PL1.src/includes/message_parser.php 3.0.8.src/includes/message_parser.php
--- 3.0.7-PL1.src/includes/message_parser.php	2010-03-05 14:36:58.000000000 -0600
+++ 3.0.8.src/includes/message_parser.php	2010-11-19 06:22:12.000000000 -0600
@@ -300,7 +300,7 @@
 
 		if ($config['max_' . $this->mode . '_img_height'] || $config['max_' . $this->mode . '_img_width'])
 		{
-			$stats = @getimagesize($in);
+			$stats = @getimagesize(htmlspecialchars_decode($in));
 
 			if ($stats === false)
 			{
@@ -352,6 +352,15 @@
 			return '[flash=' . $width . ',' . $height . ']' . $in . '[/flash]';
 		}
 
+		$in = str_replace(' ', '%20', $in);
+
+		// Make sure $in is a URL.
+		if (!preg_match('#^' . get_preg_expression('url') . '$#i', $in) &&
+			!preg_match('#^' . get_preg_expression('www_url') . '$#i', $in))
+		{
+			return '[flash=' . $width . ',' . $height . ']' . $in . '[/flash]';
+		}
+
 		// Apply the same size checks on flash files as on images
 		if ($config['max_' . $this->mode . '_img_height'] || $config['max_' . $this->mode . '_img_width'])
 		{
@@ -1284,6 +1293,7 @@
 			{
 				case 'mssql':
 				case 'mssql_odbc':
+				case 'mssqlnative':
 					$sql = 'SELECT *
 						FROM ' . SMILIES_TABLE . '
 						ORDER BY LEN(code) DESC';
diff -x .svn -aruN 3.0.7-PL1.src/includes/search/fulltext_mysql.php 3.0.8.src/includes/search/fulltext_mysql.php
--- 3.0.7-PL1.src/includes/search/fulltext_mysql.php	2010-03-05 14:36:58.000000000 -0600
+++ 3.0.8.src/includes/search/fulltext_mysql.php	2010-11-19 06:22:12.000000000 -0600
@@ -122,7 +122,7 @@
 
 		if ($terms == 'all')
 		{
-			$match		= array('#\sand\s#iu', '#\sor\s#iu', '#\snot\s#iu', '#\+#', '#-#', '#\|#');
+			$match		= array('#\sand\s#iu', '#\sor\s#iu', '#\snot\s#iu', '#(^|\s)\+#', '#(^|\s)-#', '#(^|\s)\|#');
 			$replace	= array(' +', ' |', ' -', ' +', ' -', ' |');
 
 			$keywords = preg_replace($match, $replace, $keywords);
@@ -919,6 +919,14 @@
 			<dt><label>' . $user->lang['FULLTEXT_MYSQL_MBSTRING'] . '</label><br /><span>' . $user->lang['FULLTEXT_MYSQL_MBSTRING_EXPLAIN'] . '</span></dt>
 			<dd>' . (($this->mbstring_regex) ? $user->lang['YES'] : $user->lang['NO']). '</dd>
 		</dl>
+		<dl>
+			<dt><label>' . $user->lang['MIN_SEARCH_CHARS'] . ':</label><br /><span>' . $user->lang['FULLTEXT_MYSQL_MIN_SEARCH_CHARS_EXPLAIN'] . '</span></dt>
+			<dd>' . $config['fulltext_mysql_min_word_len'] . '</dd>
+		</dl>
+		<dl>
+			<dt><label>' . $user->lang['MAX_SEARCH_CHARS'] . ':</label><br /><span>' . $user->lang['FULLTEXT_MYSQL_MAX_SEARCH_CHARS_EXPLAIN'] . '</span></dt>
+			<dd>' . $config['fulltext_mysql_max_word_len'] . '</dd>
+		</dl>
 		';
 
 		// These are fields required in the config table
diff -x .svn -aruN 3.0.7-PL1.src/includes/search/fulltext_native.php 3.0.8.src/includes/search/fulltext_native.php
--- 3.0.7-PL1.src/includes/search/fulltext_native.php	2010-03-05 14:36:58.000000000 -0600
+++ 3.0.8.src/includes/search/fulltext_native.php	2010-11-19 06:22:12.000000000 -0600
@@ -83,7 +83,9 @@
 	{
 		global $db, $user, $config;
 
-		$keywords = trim($this->cleanup($keywords, '+-|()*'));
+		$tokens = '+-|()*';
+
+		$keywords = trim($this->cleanup($keywords, $tokens));
 
 		// allow word|word|word without brackets
 		if ((strpos($keywords, ' ') === false) && (strpos($keywords, '|') !== false) && (strpos($keywords, '(') === false))
@@ -114,6 +116,15 @@
 					case ' ':
 						$keywords[$i] = '|';
 					break;
+					case '*':
+						if ($i === 0 || ($keywords[$i - 1] !== '*' && strcspn($keywords[$i - 1], $tokens) === 0))
+						{
+							if ($i === $n - 1 || ($keywords[$i + 1] !== '*' && strcspn($keywords[$i + 1], $tokens) === 0))
+							{
+								$keywords = substr($keywords, 0, $i) . substr($keywords, $i + 1);
+							}
+						}
+					break;
 				}
 			}
 			else
diff -x .svn -aruN 3.0.7-PL1.src/includes/session.php 3.0.8.src/includes/session.php
--- 3.0.7-PL1.src/includes/session.php	2010-03-05 14:36:59.000000000 -0600
+++ 3.0.8.src/includes/session.php	2010-11-19 06:22:12.000000000 -0600
@@ -83,7 +83,7 @@
 		$query_string = trim(implode('&', $use_args));
 
 		// basenamed page name (for example: index.php)
-		$page_name = basename($script_name);
+		$page_name = (substr($script_name, -1, 1) == '/') ? '' : basename($script_name);
 		$page_name = urlencode(htmlspecialchars($page_name));
 
 		// current directory within the phpBB root (for example: adm)
@@ -285,6 +285,17 @@
 				break;
 			}
 
+			// Quick check for IPv4-mapped address in IPv6
+			if (stripos($ip, '::ffff:') === 0)
+			{
+				$ipv4 = substr($ip, 7);
+
+				if (preg_match(get_preg_expression('ipv4'), $ipv4))
+				{
+					$ip = $ipv4;
+				}
+			}
+
 			// Use the last in chain
 			$this->ip = $ip;
 		}
@@ -608,6 +619,12 @@
 		}
 		else
 		{
+			// Bot user, if they have a SID in the Request URI we need to get rid of it
+			// otherwise they'll index this page with the SID, duplicate content oh my!
+			if (isset($_GET['sid']))
+			{
+				redirect(build_url(array('sid')));
+			}
 			$this->data['session_last_visit'] = $this->time_now;
 		}
 
@@ -742,7 +759,7 @@
 
 				if ((int) $row['sessions'] > (int) $config['active_sessions'])
 				{
-					header('HTTP/1.1 503 Service Unavailable');
+					send_status_line(503, 'Service Unavailable');
 					trigger_error('BOARD_UNAVAILABLE');
 				}
 			}
@@ -977,7 +994,7 @@
 			}
 
 			// only called from CRON; should be a safe workaround until the infrastructure gets going
-			if (!class_exists('captcha_factory'))
+			if (!class_exists('phpbb_captcha_factory'))
 			{
 				include($phpbb_root_path . "includes/captcha/captcha_factory." . $phpEx);
 			}
@@ -1815,7 +1832,7 @@
 		{
 			if ($this->data['is_bot'])
 			{
-				header('HTTP/1.1 503 Service Unavailable');
+				send_status_line(503, 'Service Unavailable');
 			}
 
 			$message = (!empty($config['board_disable_msg'])) ? $config['board_disable_msg'] : 'BOARD_DISABLE';
@@ -1825,7 +1842,7 @@
 		// Is load exceeded?
 		if ($config['limit_load'] && $this->load !== false)
 		{
-			if ($this->load > floatval($config['limit_load']) && !defined('IN_LOGIN'))
+			if ($this->load > floatval($config['limit_load']) && !defined('IN_LOGIN') && !defined('IN_ADMIN'))
 			{
 				// Set board disabled to true to let the admins/mods get the proper notification
 				$config['board_disable'] = '1';
@@ -1834,7 +1851,7 @@
 				{
 					if ($this->data['is_bot'])
 					{
-						header('HTTP/1.1 503 Service Unavailable');
+						send_status_line(503, 'Service Unavailable');
 					}
 					trigger_error('BOARD_UNAVAILABLE');
 				}
@@ -2128,9 +2145,9 @@
 		// Zone offset
 		$zone_offset = $this->timezone + $this->dst;
 
-		// Show date <= 1 hour ago as 'xx min ago'
+		// Show date <= 1 hour ago as 'xx min ago' but not greater than 60 seconds in the future
 		// A small tolerence is given for 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']))
+		if ($delta <= 3600 && $delta > -60 && ($delta >= -5 || (($now / 60) % 60) == (($gmepoch / 60) % 60)) && $date_cache[$format]['is_short'] !== false && !$forcedate && isset($this->lang['datetime']['AGO']))
 		{
 			return $this->lang(array('datetime', 'AGO'), max(0, (int) floor($delta / 60)));
 		}
diff -x .svn -aruN 3.0.7-PL1.src/includes/ucp/info/ucp_profile.php 3.0.8.src/includes/ucp/info/ucp_profile.php
--- 3.0.7-PL1.src/includes/ucp/info/ucp_profile.php	2010-03-05 14:36:57.000000000 -0600
+++ 3.0.8.src/includes/ucp/info/ucp_profile.php	2010-11-19 06:22:12.000000000 -0600
@@ -22,7 +22,7 @@
 			'modes'		=> array(
 				'profile_info'	=> array('title' => 'UCP_PROFILE_PROFILE_INFO', 'auth' => '', 'cat' => array('UCP_PROFILE')),
 				'signature'		=> array('title' => 'UCP_PROFILE_SIGNATURE', 'auth' => '', 'cat' => array('UCP_PROFILE')),
-				'avatar'		=> array('title' => 'UCP_PROFILE_AVATAR', 'auth' => '', 'cat' => array('UCP_PROFILE')),
+				'avatar'		=> array('title' => 'UCP_PROFILE_AVATAR', 'auth' => 'cfg_allow_avatar && (cfg_allow_avatar_local || cfg_allow_avatar_remote || cfg_allow_avatar_upload || cfg_allow_avatar_remote_upload)', 'cat' => array('UCP_PROFILE')),
 				'reg_details'	=> array('title' => 'UCP_PROFILE_REG_DETAILS', 'auth' => '', 'cat' => array('UCP_PROFILE')),
 			),
 		);
diff -x .svn -aruN 3.0.7-PL1.src/includes/ucp/ucp_groups.php 3.0.8.src/includes/ucp/ucp_groups.php
--- 3.0.7-PL1.src/includes/ucp/ucp_groups.php	2010-03-05 14:36:57.000000000 -0600
+++ 3.0.8.src/includes/ucp/ucp_groups.php	2010-11-19 06:22:12.000000000 -0600
@@ -490,7 +490,7 @@
 						$avatar_select = basename(request_var('avatar_select', ''));
 						$category = basename(request_var('category', ''));
 
-						$can_upload = (file_exists($phpbb_root_path . $config['avatar_path']) && @is_writable($phpbb_root_path . $config['avatar_path']) && $file_uploads) ? true : false;
+						$can_upload = (file_exists($phpbb_root_path . $config['avatar_path']) && phpbb_is_writable($phpbb_root_path . $config['avatar_path']) && $file_uploads) ? true : false;
 
 						// Did we submit?
 						if ($update)
diff -x .svn -aruN 3.0.7-PL1.src/includes/ucp/ucp_main.php 3.0.8.src/includes/ucp/ucp_main.php
--- 3.0.7-PL1.src/includes/ucp/ucp_main.php	2010-03-05 14:36:58.000000000 -0600
+++ 3.0.8.src/includes/ucp/ucp_main.php	2010-11-19 06:22:12.000000000 -0600
@@ -119,7 +119,7 @@
 					$unread_topic = (isset($topic_tracking_info[$topic_id]) && $row['topic_last_post_time'] > $topic_tracking_info[$topic_id]) ? true : false;
 
 					$folder_img = ($unread_topic) ? $folder_new : $folder;
-					$folder_alt = ($unread_topic) ? 'NEW_POSTS' : (($row['topic_status'] == ITEM_LOCKED) ? 'TOPIC_LOCKED' : 'NO_NEW_POSTS');
+					$folder_alt = ($unread_topic) ? 'UNREAD_POSTS' : (($row['topic_status'] == ITEM_LOCKED) ? 'TOPIC_LOCKED' : 'NO_UNREAD_POSTS');
 
 					if ($row['topic_status'] == ITEM_LOCKED)
 					{
@@ -318,7 +318,7 @@
 						else
 						{
 							$folder_image = ($unread_forum) ? 'forum_unread' : 'forum_read';
-							$folder_alt = ($unread_forum) ? 'NEW_POSTS' : 'NO_NEW_POSTS';
+							$folder_alt = ($unread_forum) ? 'UNREAD_POSTS' : 'NO_UNREAD_POSTS';
 						}
 
 						// Create last post link information, if appropriate
diff -x .svn -aruN 3.0.7-PL1.src/includes/ucp/ucp_pm_compose.php 3.0.8.src/includes/ucp/ucp_pm_compose.php
--- 3.0.7-PL1.src/includes/ucp/ucp_pm_compose.php	2010-03-05 14:36:57.000000000 -0600
+++ 3.0.8.src/includes/ucp/ucp_pm_compose.php	2010-11-19 06:22:12.000000000 -0600
@@ -1054,7 +1054,7 @@
 		'S_COMPOSE_PM'			=> true,
 		'S_EDIT_POST'			=> ($action == 'edit'),
 		'S_SHOW_PM_ICONS'		=> $s_pm_icons,
-		'S_BBCODE_ALLOWED'		=> $bbcode_status,
+		'S_BBCODE_ALLOWED'		=> ($bbcode_status) ? 1 : 0,
 		'S_BBCODE_CHECKED'		=> ($bbcode_checked) ? ' checked="checked"' : '',
 		'S_SMILIES_ALLOWED'		=> $smilies_status,
 		'S_SMILIES_CHECKED'		=> ($smilies_checked) ? ' checked="checked"' : '',
diff -x .svn -aruN 3.0.7-PL1.src/includes/ucp/ucp_pm_viewfolder.php 3.0.8.src/includes/ucp/ucp_pm_viewfolder.php
--- 3.0.7-PL1.src/includes/ucp/ucp_pm_viewfolder.php	2010-03-05 14:36:58.000000000 -0600
+++ 3.0.8.src/includes/ucp/ucp_pm_viewfolder.php	2010-11-19 06:22:12.000000000 -0600
@@ -170,10 +170,12 @@
 					'ATTACH_ICON_IMG'	=> ($auth->acl_get('u_pm_download') && $row['message_attachment'] && $config['allow_pm_attach']) ? $user->img('icon_topic_attach', $user->lang['TOTAL_ATTACHMENTS']) : '',
 
 					'S_PM_DELETED'		=> ($row['pm_deleted']) ? true : false,
+					'S_PM_REPORTED'		=> (isset($row['report_id'])) ? true : false,
 					'S_AUTHOR_DELETED'	=> ($row['author_id'] == ANONYMOUS) ? true : false,
 
 					'U_VIEW_PM'			=> ($row['pm_deleted']) ? '' : $view_message_url,
 					'U_REMOVE_PM'		=> ($row['pm_deleted']) ? $remove_message_url : '',
+					'U_MCP_REPORT'		=> (isset($row['report_id'])) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=pm_reports&amp;mode=pm_report_details&amp;r=' . $row['report_id']) : '',
 					'RECIPIENTS'		=> ($folder_id == PRIVMSGS_OUTBOX || $folder_id == PRIVMSGS_SENTBOX) ? implode(', ', $address_list[$message_id]) : '')
 				);
 			}
@@ -183,6 +185,7 @@
 				'S_SHOW_RECIPIENTS'		=> ($folder_id == PRIVMSGS_OUTBOX || $folder_id == PRIVMSGS_SENTBOX) ? true : false,
 				'S_SHOW_COLOUR_LEGEND'	=> true,
 
+				'REPORTED_IMG'			=> $user->img('icon_topic_reported', 'PM_REPORTED'),
 				'S_PM_ICONS'			=> ($config['enable_pm_icons']) ? true : false)
 			);
 		}
@@ -502,7 +505,7 @@
 		$sql_sort_order = $sort_by_sql[$sort_key] . ' ' . $direction;
 	}
 
-	$sql = 'SELECT t.*, p.root_level, p.message_time, p.message_subject, p.icon_id, p.to_address, p.message_attachment, p.bcc_address, u.username, u.username_clean, u.user_colour
+	$sql = 'SELECT t.*, p.root_level, p.message_time, p.message_subject, p.icon_id, p.to_address, p.message_attachment, p.bcc_address, u.username, u.username_clean, u.user_colour, p.message_reported
 		FROM ' . PRIVMSGS_TO_TABLE . ' t, ' . PRIVMSGS_TABLE . ' p, ' . USERS_TABLE . " u
 		WHERE t.user_id = $user_id
 			AND p.author_id = u.user_id
@@ -512,13 +515,34 @@
 		ORDER BY $sql_sort_order";
 	$result = $db->sql_query_limit($sql, $sql_limit, $sql_start);
 
+	$pm_reported = array();
 	while ($row = $db->sql_fetchrow($result))
 	{
 		$rowset[$row['msg_id']] = $row;
 		$pm_list[] = $row['msg_id'];
+		if ($row['message_reported'])
+		{
+			$pm_reported[] = $row['msg_id'];
+		}
 	}
 	$db->sql_freeresult($result);
 
+	// Fetch the report_ids, if there are any reported pms.
+	if (!empty($pm_reported) && $auth->acl_getf_global('m_report'))
+	{
+		$sql = 'SELECT pm_id, report_id
+			FROM ' . REPORTS_TABLE . '
+			WHERE report_closed = 0
+				AND ' . $db->sql_in_set('pm_id', $pm_reported);
+		$result = $db->sql_query($sql);
+
+		while ($row = $db->sql_fetchrow($result))
+		{
+			$rowset[$row['pm_id']]['report_id'] = $row['report_id'];
+		}
+		$db->sql_freeresult($result);
+	}
+
 	$pm_list = ($store_reverse) ? array_reverse($pm_list) : $pm_list;
 
 	return array(
diff -x .svn -aruN 3.0.7-PL1.src/includes/ucp/ucp_pm_viewmessage.php 3.0.8.src/includes/ucp/ucp_pm_viewmessage.php
--- 3.0.7-PL1.src/includes/ucp/ucp_pm_viewmessage.php	2010-03-05 14:36:57.000000000 -0600
+++ 3.0.8.src/includes/ucp/ucp_pm_viewmessage.php	2010-11-19 06:22:12.000000000 -0600
@@ -309,7 +309,7 @@
 
 	get_user_rank($user_row['user_rank'], $user_row['user_posts'], $user_row['rank_title'], $user_row['rank_image'], $user_row['rank_image_src']);
 
-	if (!empty($user_row['user_allow_viewemail']) || $auth->acl_get('a_email'))
+	if ((!empty($user_row['user_allow_viewemail']) && $auth->acl_get('u_sendemail')) || $auth->acl_get('a_email'))
 	{
 		$user_row['email'] = ($config['board_email_form'] && $config['email_enable']) ? append_sid("{$phpbb_root_path}memberlist.$phpEx", "mode=email&amp;u=$user_id") : ((($config['board_hide_emails'] && !$auth->acl_get('a_email')) || empty($user_row['user_email'])) ? '' : 'mailto:' . $user_row['user_email']);
 	}
diff -x .svn -aruN 3.0.7-PL1.src/includes/ucp/ucp_profile.php 3.0.8.src/includes/ucp/ucp_profile.php
--- 3.0.7-PL1.src/includes/ucp/ucp_profile.php	2010-03-05 14:36:58.000000000 -0600
+++ 3.0.8.src/includes/ucp/ucp_profile.php	2010-11-19 06:22:12.000000000 -0600
@@ -141,10 +141,7 @@
 
 							$server_url = generate_board_url();
 
-							$user_actkey = gen_rand_string(10);
-							$key_len = 54 - (strlen($server_url));
-							$key_len = ($key_len > 6) ? $key_len : 6;
-							$user_actkey = substr($user_actkey, 0, $key_len);
+							$user_actkey = gen_rand_string(mt_rand(6, 10));
 
 							$messenger = new messenger(false);
 
@@ -564,7 +561,7 @@
 				$avatar_select = basename(request_var('avatar_select', ''));
 				$category = basename(request_var('category', ''));
 
-				$can_upload = (file_exists($phpbb_root_path . $config['avatar_path']) && @is_writable($phpbb_root_path . $config['avatar_path']) && $auth->acl_get('u_chgavatar') && (@ini_get('file_uploads') || strtolower(@ini_get('file_uploads')) == 'on')) ? true : false;
+				$can_upload = (file_exists($phpbb_root_path . $config['avatar_path']) && phpbb_is_writable($phpbb_root_path . $config['avatar_path']) && $auth->acl_get('u_chgavatar') && (@ini_get('file_uploads') || strtolower(@ini_get('file_uploads')) == 'on')) ? true : false;
 
 				add_form_key('ucp_avatar');
 
@@ -572,7 +569,7 @@
 				{
 					if (check_form_key('ucp_avatar'))
 					{
-						if (avatar_process_user($error))
+						if (avatar_process_user($error, false, $can_upload))
 						{
 							meta_refresh(3, $this->u_action);
 							$message = $user->lang['PROFILE_UPDATED'] . '<br /><br />' . sprintf($user->lang['RETURN_UCP'], '<a href="' . $this->u_action . '">', '</a>');
diff -x .svn -aruN 3.0.7-PL1.src/includes/ucp/ucp_register.php 3.0.8.src/includes/ucp/ucp_register.php
--- 3.0.7-PL1.src/includes/ucp/ucp_register.php	2010-03-05 14:36:57.000000000 -0600
+++ 3.0.8.src/includes/ucp/ucp_register.php	2010-11-19 06:22:12.000000000 -0600
@@ -286,11 +286,7 @@
 					$config['require_activation'] == USER_ACTIVATION_SELF ||
 					$config['require_activation'] == USER_ACTIVATION_ADMIN) && $config['email_enable'])
 				{
-					$user_actkey = gen_rand_string(10);
-					$key_len = 54 - (strlen($server_url));
-					$key_len = ($key_len < 6) ? 6 : $key_len;
-					$user_actkey = substr($user_actkey, 0, $key_len);
-
+					$user_actkey = gen_rand_string(mt_rand(6, 10));
 					$user_type = USER_INACTIVE;
 					$user_inactive_reason = INACTIVE_REGISTER;
 					$user_inactive_time = time();
diff -x .svn -aruN 3.0.7-PL1.src/includes/ucp/ucp_remind.php 3.0.8.src/includes/ucp/ucp_remind.php
--- 3.0.7-PL1.src/includes/ucp/ucp_remind.php	2010-03-05 14:36:57.000000000 -0600
+++ 3.0.8.src/includes/ucp/ucp_remind.php	2010-11-19 06:22:12.000000000 -0600
@@ -77,11 +77,12 @@
 
 			$server_url = generate_board_url();
 
-			$key_len = 54 - strlen($server_url);
-			$key_len = max(6, $key_len); // we want at least 6
-			$key_len = ($config['max_pass_chars']) ? min($key_len, $config['max_pass_chars']) : $key_len; // we want at most $config['max_pass_chars']
-			$user_actkey = substr(gen_rand_string(10), 0, $key_len);
-			$user_password = gen_rand_string(8);
+			// Make password at least 8 characters long, make it longer if admin wants to.
+			// gen_rand_string() however has a limit of 12 or 13.
+			$user_password = gen_rand_string_friendly(max(8, mt_rand((int) $config['min_pass_chars'], (int) $config['max_pass_chars'])));
+
+			// For the activation key a random length between 6 and 10 will do.
+			$user_actkey = gen_rand_string(mt_rand(6, 10));
 
 			$sql = 'UPDATE ' . USERS_TABLE . "
 				SET user_newpasswd = '" . $db->sql_escape(phpbb_hash($user_password)) . "', user_actkey = '" . $db->sql_escape($user_actkey) . "'
diff -x .svn -aruN 3.0.7-PL1.src/index.php 3.0.8.src/index.php
--- 3.0.7-PL1.src/index.php	2010-03-05 14:36:59.000000000 -0600
+++ 3.0.8.src/index.php	2010-11-19 06:22:12.000000000 -0600
@@ -115,10 +115,10 @@
 	'LEGEND'		=> $legend,
 	'BIRTHDAY_LIST'	=> $birthday_list,
 
-	'FORUM_IMG'				=> $user->img('forum_read', 'NO_NEW_POSTS'),
-	'FORUM_NEW_IMG'			=> $user->img('forum_unread', 'NEW_POSTS'),
-	'FORUM_LOCKED_IMG'		=> $user->img('forum_read_locked', 'NO_NEW_POSTS_LOCKED'),
-	'FORUM_NEW_LOCKED_IMG'	=> $user->img('forum_unread_locked', 'NO_NEW_POSTS_LOCKED'),
+	'FORUM_IMG'				=> $user->img('forum_read', 'NO_UNREAD_POSTS'),
+	'FORUM_UNREAD_IMG'			=> $user->img('forum_unread', 'UNREAD_POSTS'),
+	'FORUM_LOCKED_IMG'		=> $user->img('forum_read_locked', 'NO_UNREAD_POSTS_LOCKED'),
+	'FORUM_UNREAD_LOCKED_IMG'	=> $user->img('forum_unread_locked', 'UNREAD_POSTS_LOCKED'),
 
 	'S_LOGIN_ACTION'			=> append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=login'),
 	'S_DISPLAY_BIRTHDAY_LIST'	=> ($config['load_birthdays']) ? true : false,
diff -x .svn -aruN 3.0.7-PL1.src/language/en/acp/attachments.php 3.0.8.src/language/en/acp/attachments.php
--- 3.0.7-PL1.src/language/en/acp/attachments.php	2010-03-05 14:37:00.000000000 -0600
+++ 3.0.8.src/language/en/acp/attachments.php	2010-11-19 06:22:12.000000000 -0600
@@ -85,7 +85,7 @@
 	'DISPLAY_INLINED_EXPLAIN'		=> 'If set to No image attachments will show as a link.',
 	'DISPLAY_ORDER'					=> 'Attachment display order',
 	'DISPLAY_ORDER_EXPLAIN'			=> 'Display attachments ordered by time.',
-	
+
 	'EDIT_EXTENSION_GROUP'			=> 'Edit extension group',
 	'EXCLUDE_ENTERED_IP'			=> 'Enable this to exclude the entered IP/hostname.',
 	'EXCLUDE_FROM_ALLOWED_IP'		=> 'Exclude IP from allowed IPs/hostnames',
@@ -97,6 +97,16 @@
 	'EXTENSION_GROUP_DELETED'		=> 'Extension group successfully deleted.',
 	'EXTENSION_GROUP_EXIST'			=> 'The extension group %s already exists.',
 
+	'EXT_GROUP_ARCHIVES'			=> 'Archives',
+	'EXT_GROUP_DOCUMENTS'			=> 'Documents',
+	'EXT_GROUP_DOWNLOADABLE_FILES'	=> 'Downloadable Files',
+	'EXT_GROUP_FLASH_FILES'			=> 'Flash Files',
+	'EXT_GROUP_IMAGES'				=> 'Images',
+	'EXT_GROUP_PLAIN_TEXT'			=> 'Plain Text',
+	'EXT_GROUP_QUICKTIME_MEDIA'		=> 'Quicktime Media',
+	'EXT_GROUP_REAL_MEDIA'			=> 'Real Media',
+	'EXT_GROUP_WINDOWS_MEDIA'		=> 'Windows Media',
+
 	'GO_TO_EXTENSIONS'		=> 'Go to extension management screen',
 	'GROUP_NAME'			=> 'Group name',
 
diff -x .svn -aruN 3.0.7-PL1.src/language/en/acp/board.php 3.0.8.src/language/en/acp/board.php
--- 3.0.7-PL1.src/language/en/acp/board.php	2010-03-05 14:37:00.000000000 -0600
+++ 3.0.8.src/language/en/acp/board.php	2010-11-19 06:22:12.000000000 -0600
@@ -50,7 +50,8 @@
 	'SITE_DESC'						=> 'Site description',
 	'SITE_NAME'						=> 'Site name',
 	'SYSTEM_DST'					=> 'Enable Summer Time/<abbr title="Daylight Saving Time">DST</abbr>',
-	'SYSTEM_TIMEZONE'				=> 'System timezone',
+	'SYSTEM_TIMEZONE'				=> 'Guest timezone',
+	'SYSTEM_TIMEZONE_EXPLAIN'			=> 'Timezone to use for displaying times to users who are not logged in (guests, bots). Logged in users set their timezone during registration and can change it in user control panel.',
 	'WARNINGS_EXPIRE'				=> 'Warning duration',
 	'WARNINGS_EXPIRE_EXPLAIN'		=> 'Number of days that will elapse before the warning will automatically expire from a user’s record.',
 ));
@@ -85,7 +86,7 @@
 	'ALLOW_SMILIES'				=> 'Allow smilies',
 	'ALLOW_TOPIC_NOTIFY'		=> 'Allow subscribing to topics',
 	'BOARD_PM'					=> 'Private messaging',
-	'BOARD_PM_EXPLAIN'			=> 'Enable or disable private messaging for all users.',
+	'BOARD_PM_EXPLAIN'			=> 'Enable private messaging for all users.',
 ));
 
 // Avatar Settings
@@ -176,8 +177,8 @@
 	'MIN_CHAR_LIMIT_EXPLAIN'		=> 'The minimum number of characters the user need to enter within a post/private message.',
 	'POSTING'						=> 'Posting',
 	'POSTS_PER_PAGE'				=> 'Posts per page',
-	'QUOTE_DEPTH_LIMIT'				=> 'Maximum nested quotes per post',
-	'QUOTE_DEPTH_LIMIT_EXPLAIN'		=> 'Maximum number of nested quotes in a post. Set to 0 for unlimited depth.',
+	'QUOTE_DEPTH_LIMIT'				=> 'Maximum nesting depth for quotes',
+	'QUOTE_DEPTH_LIMIT_EXPLAIN'		=> 'Maximum quote nesting depth in a post. Set to 0 for unlimited depth.',
 	'SMILIES_LIMIT'					=> 'Maximum smilies per post',
 	'SMILIES_LIMIT_EXPLAIN'			=> 'Maximum number of smilies in a post. Set to 0 for unlimited smilies.',
 	'SMILIES_PER_PAGE'				=> 'Smilies per page',
@@ -211,7 +212,7 @@
 	'NEW_MEMBER_POST_LIMIT'			=> 'New member post limit',
 	'NEW_MEMBER_POST_LIMIT_EXPLAIN'	=> 'New members are within the <em>Newly Registered Users</em> group until they reach this number of posts. You can use this group to keep them from using the PM system or to review their posts. <strong>A value of 0 disables this feature.</strong>',
 	'NEW_MEMBER_GROUP_DEFAULT'		=> 'Set Newly Registered Users group to default',
-	'NEW_MEMBER_GROUP_DEFAULT_EXPLAIN'	=> 'If set to yes and a new member post limit is specified newly registered users will be not only put into the <em>Newly Registered Users</em> group, but this group also being their default one. This may come in handy if you want to assign a group default rank and/or avatar the user then inherits.',
+	'NEW_MEMBER_GROUP_DEFAULT_EXPLAIN'	=> 'If set to yes, and a new member post limit is specified, newly registered users will not only be put into the <em>Newly Registered Users</em> group, but this group will also be their default one. This may come in handy if you want to assign a group default rank and/or avatar the user then inherits.',
 
 	'ACC_ADMIN'					=> 'By Admin',
 	'ACC_DISABLE'				=> 'Disable',
@@ -232,7 +233,7 @@
 	'PASSWORD_LENGTH'			=> 'Password length',
 	'PASSWORD_LENGTH_EXPLAIN'	=> 'Minimum and maximum number of characters in passwords.',
 	'REG_LIMIT'					=> 'Registration attempts',
-	'REG_LIMIT_EXPLAIN'			=> 'Number of attempts users can make at the confirmation code before being locked out that session.',
+	'REG_LIMIT_EXPLAIN'			=> 'Number of attempts users can make at solving the anti-spambot task before being locked out of that session.',
 	'USERNAME_ALPHA_ONLY'		=> 'Alphanumeric only',
 	'USERNAME_ALPHA_SPACERS'	=> 'Alphanumeric and spacers',
 	'USERNAME_ASCII'			=> 'ASCII (no international unicode)',
@@ -287,44 +288,44 @@
 
 // Visual Confirmation Settings
 $lang = array_merge($lang, array(
-	'ACP_VC_SETTINGS_EXPLAIN'				=> 'Here you can select and configure CAPTCHA plugins, which implement various ways to reject registration attempts from so-called spambots.',
+	'ACP_VC_SETTINGS_EXPLAIN'				=> 'Here you can select and configure plugins, which are designed to block automated form submissions by spambots. These plugins typically work by challenging the user with a <em>CAPTCHA</em>, a test which is designed to be difficult for computers to solve.',
 	'AVAILABLE_CAPTCHAS'					=> 'Available plugins',
-	'CAPTCHA_UNAVAILABLE'					=> 'The CAPTCHA cannot be selected as its requirements are not met.',
-	'CAPTCHA_GD'							=> 'GD CAPTCHA',
-	'CAPTCHA_GD_3D'							=> 'GD 3D Captcha',
-	'CAPTCHA_GD_FOREGROUND_NOISE'			=> 'GD CAPTCHA foreground noise',
-	'CAPTCHA_GD_EXPLAIN'					=> 'Use GD to make a more advanced CAPTCHA.',
-	'CAPTCHA_GD_FOREGROUND_NOISE_EXPLAIN'	=> 'Use foreground noise to make the GD based CAPTCHA harder.',
-	'CAPTCHA_GD_X_GRID'						=> 'GD CAPTCHA background noise x-axis',
-	'CAPTCHA_GD_X_GRID_EXPLAIN'				=> 'Use lower settings of this to make the GD based CAPTCHA harder. 0 will disable x-axis background noise.',
-	'CAPTCHA_GD_Y_GRID'						=> 'GD CAPTCHA background noise y-axis',
-	'CAPTCHA_GD_Y_GRID_EXPLAIN'				=> 'Use lower settings of this to make the GD based CAPTCHA harder. 0 will disable y-axis background noise.',
-	'CAPTCHA_GD_WAVE'						=> 'GD CAPTCHA wave distortion',
-	'CAPTCHA_GD_WAVE_EXPLAIN'				=> 'This applies a wave distortion to the CAPTCHA.',
+	'CAPTCHA_UNAVAILABLE'					=> 'The plugin cannot be selected as its requirements are not met.',
+	'CAPTCHA_GD'							=> 'GD image',
+	'CAPTCHA_GD_3D'							=> 'GD 3D image',
+	'CAPTCHA_GD_FOREGROUND_NOISE'			=> 'Foreground noise',
+	'CAPTCHA_GD_EXPLAIN'					=> 'Uses GD to make a more advanced anti-spambot image.',
+	'CAPTCHA_GD_FOREGROUND_NOISE_EXPLAIN'	=> 'Use foreground noise to make the image harder to read.',
+	'CAPTCHA_GD_X_GRID'						=> 'Background noise x-axis',
+	'CAPTCHA_GD_X_GRID_EXPLAIN'				=> 'Use lower settings of this to make the image harder to read. 0 will disable x-axis background noise.',
+	'CAPTCHA_GD_Y_GRID'						=> 'Background noise y-axis',
+	'CAPTCHA_GD_Y_GRID_EXPLAIN'				=> 'Use lower settings of this to make the image harder to read. 0 will disable y-axis background noise.',
+	'CAPTCHA_GD_WAVE'						=> 'Wave distortion',
+	'CAPTCHA_GD_WAVE_EXPLAIN'				=> 'This applies a wave distortion to the image.',
 	'CAPTCHA_GD_3D_NOISE'					=> 'Add 3D-noise objects',
-	'CAPTCHA_GD_3D_NOISE_EXPLAIN'			=> 'This adds additional objects to the CAPTCHA, over the letters.',
+	'CAPTCHA_GD_3D_NOISE_EXPLAIN'			=> 'This adds additional objects to the image, over the letters.',
 	'CAPTCHA_GD_FONTS'						=> 'Use different fonts',
 	'CAPTCHA_GD_FONTS_EXPLAIN'				=> 'This setting controls how many different letter shapes are used. You can just use the default shapes or introduce altered letters. Adding lowercase letters is also possible.',
 	'CAPTCHA_FONT_DEFAULT'					=> 'Default',
 	'CAPTCHA_FONT_NEW'						=> 'New Shapes',
 	'CAPTCHA_FONT_LOWER'					=> 'Also use lowercase',
-	'CAPTCHA_NO_GD'							=> 'CAPTCHA without GD',
-	'CAPTCHA_PREVIEW_MSG'					=> 'Your changes to the visual confirmation setting were not saved. This is just a preview.',
-	'CAPTCHA_PREVIEW_EXPLAIN'				=> 'The CAPTCHA as it would look like using the current selection.',
-
-	'CAPTCHA_SELECT'						=> 'Installed CAPTCHA plugins',
-	'CAPTCHA_SELECT_EXPLAIN'				=> 'The dropdown holds the CAPTCHA plugins recognized by the board. Gray entries are not available right now and might need configuration prior to use.',
-	'CAPTCHA_CONFIGURE'						=> 'Configure CAPTCHAs',
-	'CAPTCHA_CONFIGURE_EXPLAIN'				=> 'Change the settings for the selected CAPTCHA.',
+	'CAPTCHA_NO_GD'							=> 'Simple image',
+	'CAPTCHA_PREVIEW_MSG'					=> 'Your changes have not been saved, this is just a preview.',
+	'CAPTCHA_PREVIEW_EXPLAIN'				=> 'The plugin as it would look like using the current selection.',
+
+	'CAPTCHA_SELECT'						=> 'Installed plugins',
+	'CAPTCHA_SELECT_EXPLAIN'				=> 'The dropdown holds the plugins recognised by the board. Grey entries are not available right now and might need configuration prior to use.',
+	'CAPTCHA_CONFIGURE'						=> 'Configure plugins',
+	'CAPTCHA_CONFIGURE_EXPLAIN'				=> 'Change the settings for the selected plugin.',
 	'CONFIGURE'								=> 'Configure',
-	'CAPTCHA_NO_OPTIONS'					=> 'This CAPTCHA has no configuration options.',
+	'CAPTCHA_NO_OPTIONS'					=> 'This plugin has no configuration options.',
 
-	'VISUAL_CONFIRM_POST'					=> 'Enable visual confirmation for guest postings',
-	'VISUAL_CONFIRM_POST_EXPLAIN'			=> 'Requires anonymous users to enter a random code matching an image to help prevent mass postings.',
-	'VISUAL_CONFIRM_REG'					=> 'Enable visual confirmation for registrations',
-	'VISUAL_CONFIRM_REG_EXPLAIN'			=> 'Requires new users to enter a random code matching an image to help prevent mass registrations.',
-	'VISUAL_CONFIRM_REFRESH'				=> 'Enable users to refresh the confirmation image',
-	'VISUAL_CONFIRM_REFRESH_EXPLAIN'		=> 'Allows users to request new confirmation codes, if they are unable to solve the VC during registration. Some plugins might not support this option.',
+	'VISUAL_CONFIRM_POST'					=> 'Enable spambot countermeasures for guest postings',
+	'VISUAL_CONFIRM_POST_EXPLAIN'			=> 'Requires guest users to pass the anti-spambot task to help prevent automated postings.',
+	'VISUAL_CONFIRM_REG'					=> 'Enable spambot countermeasures for registrations',
+	'VISUAL_CONFIRM_REG_EXPLAIN'			=> 'Requires new users to pass the anti-spambot task to help prevent automated registrations.',
+	'VISUAL_CONFIRM_REFRESH'				=> 'Allow users to refresh the anti-spambot task',
+	'VISUAL_CONFIRM_REFRESH_EXPLAIN'		=> 'Allows users to request a new anti-spambot task if they are unable to solve the currunt task during registration. Some plugins might not support this option.',
 ));
 
 // Cookie Settings
@@ -359,7 +360,7 @@
 	'RECOMPILE_STYLES'				=> 'Recompile stale style components',
 	'RECOMPILE_STYLES_EXPLAIN'		=> 'Check for updated style components on filesystem and recompile.',
 	'YES_ANON_READ_MARKING'			=> 'Enable topic marking for guests',
-	'YES_ANON_READ_MARKING_EXPLAIN'	=> 'Stores read/unread status information for guests. If disabled posts are always read for guests.',
+	'YES_ANON_READ_MARKING_EXPLAIN'	=> 'Stores read/unread status information for guests. If disabled, posts are always marked read for guests.',
 	'YES_BIRTHDAYS'					=> 'Enable birthday listing',
 	'YES_BIRTHDAYS_EXPLAIN'			=> 'If disabled the birthday listing is no longer displayed. To let this setting take effect the birthday feature needs to be enabled too.',
 	'YES_JUMPBOX'					=> 'Enable display of jumpbox',
@@ -374,6 +375,7 @@
 	'YES_POST_MARKING_EXPLAIN'		=> 'Indicates whether user has posted to a topic.',
 	'YES_READ_MARKING'				=> 'Enable server-side topic marking',
 	'YES_READ_MARKING_EXPLAIN'		=> 'Stores read/unread status information in the database rather than a cookie.',
+	'YES_UNREAD_SEARCH'				=> 'Enable search for unread posts',
 ));
 
 // Auth settings
@@ -392,7 +394,7 @@
 	'LDAP_NO_EMAIL'					=> 'The specified e-mail attribute does not exist.',
 	'LDAP_NO_IDENTITY'				=> 'Could not find a login identity for %s.',
 	'LDAP_PASSWORD'					=> 'LDAP password',
-	'LDAP_PASSWORD_EXPLAIN'			=> 'Leave blank to use anonymous binding. Else fill in the password for the above user. Required for Active Directory Servers.<br /><em><strong>Warning:</strong> This password will be stored as plain text in the database visible to everybody who can access your database or who can view this configuration page.</em>',
+	'LDAP_PASSWORD_EXPLAIN'			=> 'Leave blank to use anonymous binding. Else fill in the password for the above user. Required for Active Directory Servers.<br /><em><strong>Warning:</strong> This password will be stored as plain text in the database, visible to everybody who can access your database or who can view this configuration page.</em>',
 	'LDAP_PORT'						=> 'LDAP server port',
 	'LDAP_PORT_EXPLAIN'				=> 'Optionally you can specify a port which should be used to connect to the LDAP server instead of the default port 389.',
 	'LDAP_SERVER'					=> 'LDAP server name',
@@ -461,7 +463,7 @@
 	'IP_VALID'						=> 'Session IP validation',
 	'IP_VALID_EXPLAIN'				=> 'Determines how much of the users IP is used to validate a session; <samp>All</samp> compares the complete address, <samp>A.B.C</samp> the first x.x.x, <samp>A.B</samp> the first x.x, <samp>None</samp> disables checking. On IPv6 addresses <samp>A.B.C</samp> compares the first 4 blocks and <samp>A.B</samp> the first 3 blocks.',
 	'MAX_LOGIN_ATTEMPTS'			=> 'Maximum number of login attempts',
-	'MAX_LOGIN_ATTEMPTS_EXPLAIN'	=> 'After this number of failed logins the user needs to additionally confirm his login visually (visual confirmation).',
+	'MAX_LOGIN_ATTEMPTS_EXPLAIN'	=> 'After this number of failed logins the user needs to additionally solve the anti-spambot task.',
 	'NO_IP_VALIDATION'				=> 'None',
 	'NO_REF_VALIDATION'				=> 'None',
 	'PASSWORD_TYPE'					=> 'Password complexity',
@@ -504,7 +506,7 @@
 	'SMTP_DIGEST_MD5'				=> 'DIGEST-MD5',
 	'SMTP_LOGIN'					=> 'LOGIN',
 	'SMTP_PASSWORD'					=> 'SMTP password',
-	'SMTP_PASSWORD_EXPLAIN'			=> 'Only enter a password if your SMTP server requires it.<br /><em><strong>Warning:</strong> This password will be stored as plain text in the database visible to everybody who can access your database or who can view this configuration page.</em>',
+	'SMTP_PASSWORD_EXPLAIN'			=> 'Only enter a password if your SMTP server requires it.<br /><em><strong>Warning:</strong> This password will be stored as plain text in the database, visible to everybody who can access your database or who can view this configuration page.</em>',
 	'SMTP_PLAIN'					=> 'PLAIN',
 	'SMTP_POP_BEFORE_SMTP'			=> 'POP-BEFORE-SMTP',
 	'SMTP_PORT'						=> 'SMTP server port',
@@ -527,7 +529,7 @@
 	'JAB_PACKAGE_SIZE'			=> 'Jabber package size',
 	'JAB_PACKAGE_SIZE_EXPLAIN'	=> 'This is the number of messages sent in one package. If set to 0 the message is sent immediately and will not be queued for later sending.',
 	'JAB_PASSWORD'				=> 'Jabber password',
-	'JAB_PASSWORD_EXPLAIN'		=> '<em><strong>Warning:</strong> This password will be stored as plain text in the database visible to everybody who can access your database or who can view this configuration page.</em>',
+	'JAB_PASSWORD_EXPLAIN'		=> '<em><strong>Warning:</strong> This password will be stored as plain text in the database, visible to everybody who can access your database or who can view this configuration page.</em>',
 	'JAB_PORT'					=> 'Jabber port',
 	'JAB_PORT_EXPLAIN'			=> 'Leave blank unless you know it is not port 5222.',
 	'JAB_SERVER'				=> 'Jabber server',
diff -x .svn -aruN 3.0.7-PL1.src/language/en/acp/common.php 3.0.8.src/language/en/acp/common.php
--- 3.0.7-PL1.src/language/en/acp/common.php	2010-03-05 14:37:00.000000000 -0600
+++ 3.0.8.src/language/en/acp/common.php	2010-11-19 06:22:12.000000000 -0600
@@ -190,7 +190,7 @@
 	'ACP_USER_SIG'					=> 'Signature',
 	'ACP_USER_WARNINGS'				=> 'Warnings',
 
-	'ACP_VC_SETTINGS'					=> 'CAPTCHA module settings',
+	'ACP_VC_SETTINGS'					=> 'Spambot countermeasures',
 	'ACP_VC_CAPTCHA_DISPLAY'			=> 'CAPTCHA image preview',
 	'ACP_VERSION_CHECK'					=> 'Check for updates',
 	'ACP_VIEW_ADMIN_PERMISSIONS'		=> 'View administrative permissions',
@@ -503,7 +503,7 @@
 	'LOG_CONFIG_SERVER'			=> '<strong>Altered server settings</strong>',
 	'LOG_CONFIG_SETTINGS'		=> '<strong>Altered board settings</strong>',
 	'LOG_CONFIG_SIGNATURE'		=> '<strong>Altered signature settings</strong>',
-	'LOG_CONFIG_VISUAL'			=> '<strong>Altered antibot settings</strong>',
+	'LOG_CONFIG_VISUAL'			=> '<strong>Altered anti-spambot settings</strong>',
 
 	'LOG_APPROVE_TOPIC'			=> '<strong>Approved topic</strong><br />» %s',
 	'LOG_BUMP_TOPIC'			=> '<strong>User bumped topic</strong><br />» %s',
diff -x .svn -aruN 3.0.7-PL1.src/language/en/acp/search.php 3.0.8.src/language/en/acp/search.php
--- 3.0.7-PL1.src/language/en/acp/search.php	2010-03-05 14:37:00.000000000 -0600
+++ 3.0.8.src/language/en/acp/search.php	2010-11-19 06:22:12.000000000 -0600
@@ -59,6 +59,8 @@
 	'FULLTEXT_MYSQL_PCRE'					=> 'Support for non-latin UTF-8 characters using PCRE:',
 	'FULLTEXT_MYSQL_MBSTRING_EXPLAIN'		=> 'If PCRE does not have unicode character properties, the search backend will try to use mbstring’s regular expression engine.',
 	'FULLTEXT_MYSQL_PCRE_EXPLAIN'			=> 'This search backend requires PCRE unicode character properties, only available in PHP 4.4, 5.1 and above, if you want to search for non-latin characters.',
+	'FULLTEXT_MYSQL_MIN_SEARCH_CHARS_EXPLAIN'	=> 'Words with at least this many characters will be indexed for searching. You or your host can only change this setting by changing the mysql configuration.',
+	'FULLTEXT_MYSQL_MAX_SEARCH_CHARS_EXPLAIN'	=> 'Words with no more than this many characters will be indexed for searching. You or your host can only change this setting by changing the mysql configuration.',
 
 	'GENERAL_SEARCH_SETTINGS'				=> 'General search settings',
 	'GO_TO_SEARCH_INDEX'					=> 'Go to search index page',
diff -x .svn -aruN 3.0.7-PL1.src/language/en/acp/styles.php 3.0.8.src/language/en/acp/styles.php
--- 3.0.7-PL1.src/language/en/acp/styles.php	2010-03-05 14:37:00.000000000 -0600
+++ 3.0.8.src/language/en/acp/styles.php	2010-11-19 06:22:12.000000000 -0600
@@ -76,13 +76,13 @@
 	'DEACTIVATE_DEFAULT'		=> 'You cannot deactivate the default style.',
 	'DELETE_FROM_FS'			=> 'Delete from filesystem',
 	'DELETE_IMAGESET'			=> 'Delete imageset',
-	'DELETE_IMAGESET_EXPLAIN'	=> 'Here you can remove the selected imageset from the database. Additionally, if you have permission you can elect to remove the set from the filesystem. Please note that there is no undo capability. When the imageset is deleted it is gone for good. It is recommended that you first export your set for possible future use.',
+	'DELETE_IMAGESET_EXPLAIN'	=> 'Here you can remove the selected imageset from the database. Please note that there is no undo capability. It is recommended that you first export your set for possible future use.',
 	'DELETE_STYLE'				=> 'Delete style',
-	'DELETE_STYLE_EXPLAIN'		=> 'Here you can remove the selected style. You cannot remove all the style elements from here. These must be deleted individually via their respective forms. Take care in deleting styles there is no undo facility.',
+	'DELETE_STYLE_EXPLAIN'		=> 'Here you can remove the selected style. You cannot remove all the style elements from here. These must be deleted individually via their respective forms. Take care when deleting styles, there is no undo facility.',
 	'DELETE_TEMPLATE'			=> 'Delete template',
-	'DELETE_TEMPLATE_EXPLAIN'	=> 'Here you can remove the selected template set from the database. Additionally, if you have permission you can elect to remove the set from the filesystem. Please note that there is no undo capability. When the templates are deleted they are gone for good. It is recommended that you first export your set for possible future use.',
+	'DELETE_TEMPLATE_EXPLAIN'	=> 'Here you can remove the selected template set from the database. Please note that there is no undo capability. It is recommended that you first export your set for possible future use.',
 	'DELETE_THEME'				=> 'Delete theme',
-	'DELETE_THEME_EXPLAIN'		=> 'Here you can remove the selected theme from the database. Additionally, if you have permission you can elect to remove the theme from the filesystem. Please note that there is no undo capability. When the theme is deleted it is gone for good. It is recommended that you first export your theme for possible future use.',
+	'DELETE_THEME_EXPLAIN'		=> 'Here you can remove the selected theme from the database. Please note that there is no undo capability. It is recommended that you first export your theme for possible future use.',
 	'DETAILS'					=> 'Details',
 	'DIMENSIONS_EXPLAIN'		=> 'Selecting yes here will include width/height parameters.',
 
@@ -165,11 +165,11 @@
 	'IMG_FORUM_READ'			=> 'Forum',
 	'IMG_FORUM_READ_LOCKED'		=> 'Forum locked',
 	'IMG_FORUM_READ_SUBFORUM'	=> 'Subforum',
-	'IMG_FORUM_UNREAD'			=> 'Forum new posts',
-	'IMG_FORUM_UNREAD_LOCKED'	=> 'Forum new posts locked',
-	'IMG_FORUM_UNREAD_SUBFORUM'	=> 'Subforum new posts',
+	'IMG_FORUM_UNREAD'			=> 'Forum unread posts',
+	'IMG_FORUM_UNREAD_LOCKED'	=> 'Forum unread posts locked',
+	'IMG_FORUM_UNREAD_SUBFORUM'	=> 'Subforum unread posts',
 	'IMG_SUBFORUM_READ'			=> 'Legend subforum',
-	'IMG_SUBFORUM_UNREAD'		=> 'Legend subforum new posts',
+	'IMG_SUBFORUM_UNREAD'		=> 'Legend subforum unread posts',
 
 	'IMG_TOPIC_MOVED'			=> 'Topic moved',
 
@@ -180,39 +180,39 @@
 	'IMG_TOPIC_READ_LOCKED'			=> 'Topic locked',
 	'IMG_TOPIC_READ_LOCKED_MINE'	=> 'Topic locked posted to',
 
-	'IMG_TOPIC_UNREAD'				=> 'Topic new posts',
-	'IMG_TOPIC_UNREAD_MINE'			=> 'Topic posted to new',
-	'IMG_TOPIC_UNREAD_HOT'			=> 'Topic popular new posts',
-	'IMG_TOPIC_UNREAD_HOT_MINE'		=> 'Topic popular posted to new',
-	'IMG_TOPIC_UNREAD_LOCKED'		=> 'Topic locked new',
-	'IMG_TOPIC_UNREAD_LOCKED_MINE'	=> 'Topic locked posted to new',
+	'IMG_TOPIC_UNREAD'				=> 'Topic unread posts',
+	'IMG_TOPIC_UNREAD_MINE'			=> 'Topic posted to unread',
+	'IMG_TOPIC_UNREAD_HOT'			=> 'Topic popular unread posts',
+	'IMG_TOPIC_UNREAD_HOT_MINE'		=> 'Topic popular posted to unread',
+	'IMG_TOPIC_UNREAD_LOCKED'		=> 'Topic locked unread',
+	'IMG_TOPIC_UNREAD_LOCKED_MINE'	=> 'Topic locked posted to unread',
 
 	'IMG_STICKY_READ'				=> 'Sticky topic',
 	'IMG_STICKY_READ_MINE'			=> 'Sticky topic posted to',
 	'IMG_STICKY_READ_LOCKED'		=> 'Sticky topic locked',
 	'IMG_STICKY_READ_LOCKED_MINE'	=> 'Sticky topic locked posted to',
-	'IMG_STICKY_UNREAD'				=> 'Sticky topic new posts',
-	'IMG_STICKY_UNREAD_MINE'		=> 'Sticky topic posted to new',
-	'IMG_STICKY_UNREAD_LOCKED'		=> 'Sticky topic locked new posts',
-	'IMG_STICKY_UNREAD_LOCKED_MINE'	=> 'Sticky topic locked posted to new',
+	'IMG_STICKY_UNREAD'				=> 'Sticky topic unread posts',
+	'IMG_STICKY_UNREAD_MINE'		=> 'Sticky topic posted to unread',
+	'IMG_STICKY_UNREAD_LOCKED'		=> 'Sticky topic locked unread posts',
+	'IMG_STICKY_UNREAD_LOCKED_MINE'	=> 'Sticky topic locked posted to unread',
 
 	'IMG_ANNOUNCE_READ'					=> 'Announcement',
 	'IMG_ANNOUNCE_READ_MINE'			=> 'Announcement posted to',
 	'IMG_ANNOUNCE_READ_LOCKED'			=> 'Announcement locked',
 	'IMG_ANNOUNCE_READ_LOCKED_MINE'		=> 'Announcement locked posted to',
-	'IMG_ANNOUNCE_UNREAD'				=> 'Announcement new posts',
-	'IMG_ANNOUNCE_UNREAD_MINE'			=> 'Announcement posted to new',
-	'IMG_ANNOUNCE_UNREAD_LOCKED'		=> 'Announcement locked new posts',
-	'IMG_ANNOUNCE_UNREAD_LOCKED_MINE'	=> 'Announcement locked posted to new',
+	'IMG_ANNOUNCE_UNREAD'				=> 'Announcement unread posts',
+	'IMG_ANNOUNCE_UNREAD_MINE'			=> 'Announcement posted to unread',
+	'IMG_ANNOUNCE_UNREAD_LOCKED'		=> 'Announcement locked unread posts',
+	'IMG_ANNOUNCE_UNREAD_LOCKED_MINE'	=> 'Announcement locked posted to unread',
 
 	'IMG_GLOBAL_READ'					=> 'Global',
 	'IMG_GLOBAL_READ_MINE'				=> 'Global posted to',
 	'IMG_GLOBAL_READ_LOCKED'			=> 'Global locked',
 	'IMG_GLOBAL_READ_LOCKED_MINE'		=> 'Global locked posted to',
-	'IMG_GLOBAL_UNREAD'					=> 'Global new posts',
-	'IMG_GLOBAL_UNREAD_MINE'			=> 'Global posted to new',
-	'IMG_GLOBAL_UNREAD_LOCKED'			=> 'Global locked new posts',
-	'IMG_GLOBAL_UNREAD_LOCKED_MINE'		=> 'Global locked posted to new',
+	'IMG_GLOBAL_UNREAD'					=> 'Global unread posts',
+	'IMG_GLOBAL_UNREAD_MINE'			=> 'Global posted to unread',
+	'IMG_GLOBAL_UNREAD_LOCKED'			=> 'Global locked unread posts',
+	'IMG_GLOBAL_UNREAD_LOCKED_MINE'		=> 'Global locked posted to unread',
 
 	'IMG_PM_READ'		=> 'Read private message',
 	'IMG_PM_UNREAD'		=> 'Unread private message',
diff -x .svn -aruN 3.0.7-PL1.src/language/en/acp/users.php 3.0.8.src/language/en/acp/users.php
--- 3.0.7-PL1.src/language/en/acp/users.php	2010-03-05 14:37:00.000000000 -0600
+++ 3.0.8.src/language/en/acp/users.php	2010-11-19 06:22:12.000000000 -0600
@@ -42,6 +42,7 @@
 	'BAN_ALREADY_ENTERED'	=> 'The ban had been previously entered successfully. The ban list has not been updated.',
 	'BAN_SUCCESSFUL'		=> 'Ban entered successfully.',
 
+	'CANNOT_BAN_ANONYMOUS'			=> 'You are not allowed to ban the anonymous account. Permissions for anonymous users can be set under the Permissions tab.',
 	'CANNOT_BAN_FOUNDER'			=> 'You are not allowed to ban founder accounts.',
 	'CANNOT_BAN_YOURSELF'			=> 'You are not allowed to ban yourself.',
 	'CANNOT_DEACTIVATE_BOT'			=> 'You are not allowed to deactivate bot accounts. Please deactivate the bot within the bots page instead.',
diff -x .svn -aruN 3.0.7-PL1.src/language/en/captcha_qa.php 3.0.8.src/language/en/captcha_qa.php
--- 3.0.7-PL1.src/language/en/captcha_qa.php	2010-03-05 14:37:00.000000000 -0600
+++ 3.0.8.src/language/en/captcha_qa.php	2010-11-19 06:22:12.000000000 -0600
@@ -36,9 +36,9 @@
 // in a url you again do not need to specify an order e.g., 'Click %sHERE%s' is fine
 
 $lang = array_merge($lang, array(
-	'CAPTCHA_QA'				=> 'Q&amp;A CAPTCHA',
-	'CONFIRM_QUESTION_EXPLAIN'	=> 'This question is a means of identifying and preventing automated submissions.',
-	'CONFIRM_QUESTION_WRONG'	=> 'You have provided an invalid answer to the confirmation question.',
+	'CAPTCHA_QA'				=> 'Q&amp;A',
+	'CONFIRM_QUESTION_EXPLAIN'	=> 'This question is a means of preventing automated form submissions by spambots.',
+	'CONFIRM_QUESTION_WRONG'	=> 'You have provided an invalid answer to the question.',
 
 	'QUESTION_ANSWERS'			=> 'Answers',
 	'ANSWERS_EXPLAIN'			=> 'Please enter valid answers to the question, one per line.',
@@ -47,15 +47,15 @@
 	'ANSWER'					=> 'Answer',
 	'EDIT_QUESTION'				=> 'Edit Question',
 	'QUESTIONS'					=> 'Questions',
-	'QUESTIONS_EXPLAIN'			=> 'During registration, users will be asked one of the questions specified here. To use this plugin, at least one question must be set in the default language. These questions should be easy for your target audience to answer, but beyond the ability of a bot capable of running a Google™ search. Using a large and regulary changed set of questions will yield the best results. Enable the strict setting if your question relies on punctuation or capitalisation.',
+	'QUESTIONS_EXPLAIN'			=> 'For every form submission where you have enabled the Q&amp;A plugin, users will be asked one of the questions specified here. To use this plugin at least one question must be set in the default language. These questions should be easy for your target audience to answer but beyond the ability of a bot capable of running a Google™ search. Using a large and regularly changed set of questions will yield the best results. Enable the strict setting if your question relies on mixed case, punctuation or whitespace.',
 	'QUESTION_DELETED'			=> 'Question deleted',
 	'QUESTION_LANG'				=> 'Language',
-	'QUESTION_LANG_EXPLAIN'		=> 'The language that this question and its answers are written in.',
+	'QUESTION_LANG_EXPLAIN'		=> 'The language this question and its answers are written in.',
 	'QUESTION_STRICT'			=> 'Strict check',
-	'QUESTION_STRICT_EXPLAIN'	=> 'If enabled, capitalisation and whitespace will also be enforced.',
+	'QUESTION_STRICT_EXPLAIN'	=> 'Enable to enforce mixed case, punctuation and whitespace.',
 
 	'QUESTION_TEXT'				=> 'Question',
-	'QUESTION_TEXT_EXPLAIN'		=> 'The question that will be asked on registration.',
+	'QUESTION_TEXT_EXPLAIN'		=> 'The question presented to the user.',
 
 	'QA_ERROR_MSG'				=> 'Please fill in all fields and enter at least one answer.',
 	'QA_LAST_QUESTION'			=> 'You cannot delete all questions while the plugin is active.',
diff -x .svn -aruN 3.0.7-PL1.src/language/en/captcha_recaptcha.php 3.0.8.src/language/en/captcha_recaptcha.php
--- 3.0.7-PL1.src/language/en/captcha_recaptcha.php	2010-03-05 14:37:00.000000000 -0600
+++ 3.0.8.src/language/en/captcha_recaptcha.php	2010-11-19 06:22:12.000000000 -0600
@@ -46,7 +46,7 @@
 	'RECAPTCHA_PRIVATE'				=> 'Private reCaptcha key',
 	'RECAPTCHA_PRIVATE_EXPLAIN'		=> 'Your private reCaptcha key. Keys can be obtained on <a href="http://recaptcha.net">reCaptcha.net</a>.',
 
-	'RECAPTCHA_EXPLAIN'				=> 'In an effort to prevent automatic submissions, we require that you enter both of the words displayed below into the text field underneath.',
+	'RECAPTCHA_EXPLAIN'				=> 'In an effort to prevent automatic submissions, we require that you enter both of the words displayed into the text field underneath.',
 ));
 
 ?>
\ No newline at end of file
diff -x .svn -aruN 3.0.7-PL1.src/language/en/common.php 3.0.8.src/language/en/common.php
--- 3.0.7-PL1.src/language/en/common.php	2010-03-05 14:37:00.000000000 -0600
+++ 3.0.8.src/language/en/common.php	2010-11-19 06:22:12.000000000 -0600
@@ -124,7 +124,7 @@
 	'COMMA_SEPARATOR'		=> ', ',	// Used in pagination of ACP & prosilver, use localised comma if appropriate, eg: Ideographic or Arabic
 	'CONFIRM'				=> 'Confirm',
 	'CONFIRM_CODE'			=> 'Confirmation code',
-	'CONFIRM_CODE_EXPLAIN'	=> 'Enter the code exactly as it appears. All letters are case insensitive, there is no zero.',
+	'CONFIRM_CODE_EXPLAIN'	=> 'Enter the code exactly as it appears. All letters are case insensitive.',
 	'CONFIRM_CODE_WRONG'	=> 'The confirmation code you entered was incorrect.',
 	'CONFIRM_OPERATION'		=> 'Are you sure you wish to carry out this operation?',
 	'CONGRATULATIONS'		=> 'Congratulations to',
@@ -295,6 +295,7 @@
 	'LAST_VISIT'						=> 'Last visit',
 	'LDAP_NO_LDAP_EXTENSION'			=> 'LDAP extension not available.',
 	'LDAP_NO_SERVER_CONNECTION'			=> 'Could not connect to LDAP server.',
+	'LDAP_SEARCH_FAILED'				=> 'An error occured while searching the LDAP directory.',
 	'LEGEND'							=> 'Legend',
 	'LOCATION'							=> 'Location',
 	'LOCK_POST'							=> 'Lock post',
@@ -303,8 +304,8 @@
 	'LOGIN'								=> 'Login',
 	'LOGIN_CHECK_PM'					=> 'Log in to check your private messages.',
 	'LOGIN_CONFIRMATION'				=> 'Confirmation of login',
-	'LOGIN_CONFIRM_EXPLAIN'				=> 'To prevent brute forcing accounts the board requires you to enter a confirmation code after a maximum amount of failed logins. 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.',
-	'LOGIN_ERROR_ATTEMPTS'				=> 'You exceeded the maximum allowed number of login attempts. In addition to your username and password you now also have to enter the confirm code from the image you see below.',
+	'LOGIN_CONFIRM_EXPLAIN'				=> 'To prevent brute forcing accounts the board requires you to enter a confirmation code after a maximum amount of failed logins. 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.', // unused
+	'LOGIN_ERROR_ATTEMPTS'				=> 'You exceeded the maximum allowed number of login attempts. In addition to your username and password you now also have to solve the CAPTCHA below.',
 	'LOGIN_ERROR_EXTERNAL_AUTH_APACHE'	=> 'You have not been authenticated by Apache.',
 	'LOGIN_ERROR_PASSWORD'				=> 'You have specified an incorrect password. Please check your password and try again. If you continue to have problems please contact the %sBoard Administrator%s.',
 	'LOGIN_ERROR_PASSWORD_CONVERT'		=> 'It was not possible to convert your password when updating this bulletin board’s software. Please %srequest a new password%s. If you continue to have problems please contact the %sBoard Administrator%s.',
@@ -346,8 +347,8 @@
 	'NEW_MESSAGES'				=> 'New messages',
 	'NEW_PM'					=> '<strong>%d</strong> new message',
 	'NEW_PMS'					=> '<strong>%d</strong> new messages',
-	'NEW_POST'					=> 'New post',
-	'NEW_POSTS'					=> 'New posts',
+	'NEW_POST'					=> 'New post',	// Not used anymore
+	'NEW_POSTS'					=> 'New posts',	// Not used anymore
 	'NEXT'						=> 'Next',		// Used in pagination
 	'NEXT_STEP'					=> 'Next',
 	'NEVER'						=> 'Never',
@@ -380,7 +381,7 @@
 	'NO_MODERATORS'				=> 'There are no moderators.',
 	'NO_NEW_MESSAGES'			=> 'No new messages',
 	'NO_NEW_PM'					=> '<strong>0</strong> new messages',
-	'NO_NEW_POSTS'				=> 'No new posts',
+	'NO_NEW_POSTS'				=> 'No new posts',	// Not used anymore
 	'NO_ONLINE_USERS'			=> 'No registered users',
 	'NO_POSTS'					=> 'No posts',
 	'NO_POSTS_TIME_FRAME'		=> 'No posts exist inside this topic for the selected time frame.',
@@ -394,6 +395,7 @@
 	'NO_TOPICS'					=> 'There are no topics or posts in this forum.',
 	'NO_TOPICS_TIME_FRAME'		=> 'No topics exist inside this forum for the selected time frame.',
 	'NO_UNREAD_PM'				=> '<strong>0</strong> unread messages',
+	'NO_UNREAD_POSTS'			=> 'No unread posts',
 	'NO_UPLOAD_FORM_FOUND'		=> 'Upload initiated but no valid file upload form found.',
 	'NO_USER'					=> 'The requested user does not exist.',
 	'NO_USERS'					=> 'The requested users do not exist.',
@@ -420,6 +422,7 @@
 	'PIXEL'					=> 'px',
 	'PLAY_QUICKTIME_FILE'	=> 'Play Quicktime file',
 	'PM'					=> 'PM',
+	'PM_REPORTED'			=> 'Click to view report',
 	'POSTING_MESSAGE'		=> 'Posting message in %s',
 	'POSTING_PRIVATE_MESSAGE'	=> 'Composing private message',
 	'POST'					=> 'Post',
@@ -563,6 +566,9 @@
 	'TEST_CONNECTION'	=> 'Test connection',
 	'THE_TEAM'			=> 'The team',
 	'TIME'				=> 'Time',
+	
+	'TOO_LARGE'						=> 'The value you entered is too large.',
+	'TOO_LARGE_MAX_RECIPIENTS'		=> 'The value of <strong>Maximum number of allowed recipients per private message</strong> setting you entered is too large.',
 
 	'TOO_LONG'						=> 'The value you entered is too long.',
 
@@ -605,6 +611,9 @@
 	'TOO_SHORT_EMAIL_CONFIRM'		=> 'The e-mail address confirmation you entered is too short.',
 	'TOO_SHORT_WEBSITE'				=> 'The website address you entered is too short.',
 	'TOO_SHORT_YIM'					=> 'The Yahoo! Messenger name you entered is too short.',
+	
+	'TOO_SMALL'						=> 'The value you entered is too small.',
+	'TOO_SMALL_MAX_RECIPIENTS'		=> 'The value of <strong>Maximum number of allowed recipients per private message</strong> setting you entered is too small.',
 
 	'TOPIC'				=> 'Topic',
 	'TOPICS'			=> 'Topics',
@@ -639,6 +648,8 @@
 	'UNREAD_MESSAGES'		=> 'Unread messages',
 	'UNREAD_PM'				=> '<strong>%d</strong> unread message',
 	'UNREAD_PMS'			=> '<strong>%d</strong> unread messages',
+	'UNREAD_POST'			=> 'Unread post',
+	'UNREAD_POSTS'			=> 'Unread posts',
 	'UNWATCHED_FORUMS'			=> 'You are no longer subscribed to the selected forums.',
 	'UNWATCHED_TOPICS'			=> 'You are no longer subscribed to the selected topics.',
 	'UNWATCHED_FORUMS_TOPICS'	=> 'You are no longer subscribed to the selected entries.',
diff -x .svn -aruN 3.0.7-PL1.src/language/en/email/admin_welcome_inactive.txt 3.0.8.src/language/en/email/admin_welcome_inactive.txt
--- 3.0.7-PL1.src/language/en/email/admin_welcome_inactive.txt	2010-03-05 14:37:00.000000000 -0600
+++ 3.0.8.src/language/en/email/admin_welcome_inactive.txt	2010-11-19 06:22:12.000000000 -0600
@@ -10,7 +10,7 @@
 Board URL: {U_BOARD}
 ----------------------------
 
-Your account is currently inactive and will need to be approved by an administrator before you can log in. Another email will be sent when this has occured.
+Your account is currently inactive and will need to be approved by an administrator before you can log in. Another email will be sent when this has occurred.
 
 Your password has been securely stored in our database and cannot be retrieved. In the event that it is forgotten, you will be able to reset it using the email address associated with your account.
 
diff -x .svn -aruN 3.0.7-PL1.src/language/en/help_faq.php 3.0.8.src/language/en/help_faq.php
--- 3.0.7-PL1.src/language/en/help_faq.php	2010-03-05 14:37:00.000000000 -0600
+++ 3.0.8.src/language/en/help_faq.php	2010-11-19 06:22:12.000000000 -0600
@@ -128,7 +128,7 @@
 	),
 	array(
 		0 => 'Why can’t I add more poll options?',
-		1 => 'The limit for poll options is set by the board administrator. If you feel you need to add more options to your poll then the allowed amount, contact the board administrator.'
+		1 => 'The limit for poll options is set by the board administrator. If you feel you need to add more options to your poll than the allowed amount, contact the board administrator.'
 	),
 	array(
 		0 => 'How do I edit or delete a poll?',
diff -x .svn -aruN 3.0.7-PL1.src/language/en/install.php 3.0.8.src/language/en/install.php
--- 3.0.7-PL1.src/language/en/install.php	2010-03-05 14:37:00.000000000 -0600
+++ 3.0.8.src/language/en/install.php	2010-11-19 06:22:12.000000000 -0600
@@ -128,7 +128,7 @@
 	'DB_ERR_QUERY_FIRST_TABLE'	=> 'Error while executing <var>query_first</var>, %s (“%s”).',
 	'DB_ERR_SELECT'				=> 'Error while running <code>SELECT</code> query.',
 	'DB_HOST'					=> 'Database server hostname or DSN',
-	'DB_HOST_EXPLAIN'			=> 'DSN stands for Data Source Name and is relevant only for ODBC installs.',
+	'DB_HOST_EXPLAIN'			=> 'DSN stands for Data Source Name and is relevant only for ODBC installs. On PostgreSQL, use localhost to connect to the local server via UNIX domain socket and 127.0.0.1 to connect via TCP.',
 	'DB_NAME'					=> 'Database name',
 	'DB_PASSWORD'				=> 'Database password',
 	'DB_PORT'					=> 'Database server port',
@@ -147,6 +147,7 @@
 	'DLL_MBSTRING'				=> 'Multi-byte character support',
 	'DLL_MSSQL'					=> 'MSSQL Server 2000+',
 	'DLL_MSSQL_ODBC'			=> 'MSSQL Server 2000+ via ODBC',
+	'DLL_MSSQLNATIVE'			=> 'MSSQL Server 2005+ [ Native ]',
 	'DLL_MYSQL'					=> 'MySQL',
 	'DLL_MYSQLI'				=> 'MySQL with MySQLi Extension',
 	'DLL_ORACLE'				=> 'Oracle',
@@ -214,6 +215,7 @@
 		<li>SQLite 2.8.2+</li>
 		<li>Firebird 2.1+</li>
 		<li>MS SQL Server 2000 or above (directly or via ODBC)</li>
+		<li>MS SQL Server 2005 or above (native)</li>
 		<li>Oracle</li>
 	</ul>
 
@@ -557,6 +559,7 @@
 	'UPDATING_DATA'					=> 'Updating data',
 	'UPDATING_TO_LATEST_STABLE'		=> 'Updating database to latest stable release',
 	'UPDATED_VERSION'				=> 'Updated version',
+	'UPGRADE_INSTRUCTIONS'			=> 'A new feature release <strong>%1$s</strong> is available. Please read <a href="%2$s" title="%2$s"><strong>the release announcement</strong></a> to learn about what it has to offer, and how to upgrade.',
 	'UPLOAD_METHOD'					=> 'Upload method',
 
 	'UPDATE_DB_SUCCESS'				=> 'Database update was successful.',
@@ -584,16 +587,6 @@
 
 	'DEFAULT_INSTALL_POST'			=> 'This is an example post in your phpBB3 installation. Everything seems to be working. You may delete this post if you like and continue to set up your board. During the installation process your first category and your first forum are assigned an appropriate set of permissions for the predefined usergroups administrators, bots, global moderators, guests, registered users and registered COPPA users. If you also choose to delete your first category and your first forum, do not forget to assign permissions for all these usergroups for all new categories and forums you create. It is recommended to rename your first category and your first forum and copy permissions from these while creating new categories and forums. Have fun!',
 
-	'EXT_GROUP_ARCHIVES'			=> 'Archives',
-	'EXT_GROUP_DOCUMENTS'			=> 'Documents',
-	'EXT_GROUP_DOWNLOADABLE_FILES'	=> 'Downloadable Files',
-	'EXT_GROUP_FLASH_FILES'			=> 'Flash Files',
-	'EXT_GROUP_IMAGES'				=> 'Images',
-	'EXT_GROUP_PLAIN_TEXT'			=> 'Plain Text',
-	'EXT_GROUP_QUICKTIME_MEDIA'		=> 'Quicktime Media',
-	'EXT_GROUP_REAL_MEDIA'			=> 'Real Media',
-	'EXT_GROUP_WINDOWS_MEDIA'		=> 'Windows Media',
-
 	'FORUMS_FIRST_CATEGORY'			=> 'Your first category',
 	'FORUMS_TEST_FORUM_DESC'		=> 'Description of your first forum.',
 	'FORUMS_TEST_FORUM_TITLE'		=> 'Your first forum',
diff -x .svn -aruN 3.0.7-PL1.src/language/en/search.php 3.0.8.src/language/en/search.php
--- 3.0.7-PL1.src/language/en/search.php	2010-03-05 14:37:00.000000000 -0600
+++ 3.0.8.src/language/en/search.php	2010-11-19 06:22:12.000000000 -0600
@@ -62,6 +62,7 @@
 	'NO_SEARCH'				=> 'Sorry but you are not permitted to use the search system.',
 	'NO_SEARCH_RESULTS'		=> 'No suitable matches were found.',
 	'NO_SEARCH_TIME'		=> 'Sorry but you cannot use search at this time. Please try again in a few minutes.',
+	'NO_SEARCH_UNREADS'		=> 'Sorry but searching for unread posts has been disabled on this board.',
 	'WORD_IN_NO_POST'		=> 'No posts were found because the word <strong>%s</strong> is not contained in any post.',
 	'WORDS_IN_NO_POST'		=> 'No posts were found because the words <strong>%s</strong> are not contained in any post.',
 
diff -x .svn -aruN 3.0.7-PL1.src/language/en/search_synonyms.php 3.0.8.src/language/en/search_synonyms.php
--- 3.0.7-PL1.src/language/en/search_synonyms.php	2010-03-05 14:37:00.000000000 -0600
+++ 3.0.8.src/language/en/search_synonyms.php	2010-11-19 06:22:12.000000000 -0600
@@ -77,7 +77,7 @@
 	'foriegn'		=> 'foreign',
 	'fourty'		=> 'forty',
 
-	'gage'			=> 'guage',
+	'gage'			=> 'gauge',
 	'geneology'		=> 'genealogy',
 	'grammer'		=> 'grammar',
 	'gray'			=> 'grey',
@@ -98,7 +98,7 @@
 	'irrevelant'	=> 'irrelevant',
 
 	'jeweler'	=> 'jeweller',
-	'judgement'	=> 'judgment',
+	'judgment'	=> 'judgement',
 
 	'labeled'	=> 'labelled',
 	'labor'		=> 'labour',
diff -x .svn -aruN 3.0.7-PL1.src/language/en/viewforum.php 3.0.8.src/language/en/viewforum.php
--- 3.0.7-PL1.src/language/en/viewforum.php	2010-03-05 14:37:00.000000000 -0600
+++ 3.0.8.src/language/en/viewforum.php	2010-11-19 06:22:12.000000000 -0600
@@ -48,16 +48,21 @@
 
 	'MARK_TOPICS_READ'		=> 'Mark topics read',
 
-	'NEW_POSTS_HOT'			=> 'New posts [ Popular ]',
-	'NEW_POSTS_LOCKED'		=> 'New posts [ Locked ]',
-	'NO_NEW_POSTS_HOT'		=> 'No new posts [ Popular ]',
-	'NO_NEW_POSTS_LOCKED'	=> 'No new posts [ Locked ]',
+	'NEW_POSTS_HOT'			=> 'New posts [ Popular ]',	// Not used anymore
+	'NEW_POSTS_LOCKED'		=> 'New posts [ Locked ]',	// Not used anymore
+	'NO_NEW_POSTS_HOT'		=> 'No new posts [ Popular ]',	// Not used anymore
+	'NO_NEW_POSTS_LOCKED'	=> 'No new posts [ Locked ]',	// Not used anymore
 	'NO_READ_ACCESS'		=> 'You do not have the required permissions to read topics within this forum.',
+	'NO_UNREAD_POSTS_HOT'		=> 'No unread posts [ Popular ]',
+	'NO_UNREAD_POSTS_LOCKED'	=> 'No unread posts [ Locked ]',
 
 	'POST_FORUM_LOCKED'		=> 'Forum is locked',
 
 	'TOPICS_MARKED'			=> 'The topics for this forum have now been marked read.',
 
+	'UNREAD_POSTS_HOT'		=> 'Unread posts [ Popular ]',
+	'UNREAD_POSTS_LOCKED'	=> 'Unread posts [ Locked ]',
+
 	'VIEW_FORUM'			=> 'View forum',
 	'VIEW_FORUM_TOPIC'		=> '1 topic',
 	'VIEW_FORUM_TOPICS'		=> '%d topics',
diff -x .svn -aruN 3.0.7-PL1.src/memberlist.php 3.0.8.src/memberlist.php
--- 3.0.7-PL1.src/memberlist.php	2010-03-05 14:36:59.000000000 -0600
+++ 3.0.8.src/memberlist.php	2010-11-19 06:22:12.000000000 -0600
@@ -1607,7 +1607,7 @@
 	$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'))
+	if ((!empty($data['user_allow_viewemail']) && $auth->acl_get('u_sendemail')) || $auth->acl_get('a_user'))
 	{
 		$email = ($config['board_email_form'] && $config['email_enable']) ? append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=email&amp;u=' . $user_id) : (($config['board_hide_emails'] && !$auth->acl_get('a_user')) ? '' : 'mailto:' . $data['user_email']);
 	}
diff -x .svn -aruN 3.0.7-PL1.src/posting.php 3.0.8.src/posting.php
--- 3.0.7-PL1.src/posting.php	2010-03-05 14:36:57.000000000 -0600
+++ 3.0.8.src/posting.php	2010-11-19 06:22:12.000000000 -0600
@@ -402,6 +402,19 @@
 	$db->sql_freeresult($result);
 }
 
+if ($mode == 'edit')
+{
+	$original_poll_data = array(
+		'poll_title'		=> $post_data['poll_title'],
+		'poll_length'		=> $post_data['poll_length'],
+		'poll_max_options'	=> $post_data['poll_max_options'],
+		'poll_option_text'	=> implode("\n", $post_data['poll_options']),
+		'poll_start'		=> $post_data['poll_start'],
+		'poll_last_vote'	=> $post_data['poll_last_vote'],
+		'poll_vote_change'	=> $post_data['poll_vote_change'],
+	);
+}
+
 $orig_poll_options_size = sizeof($post_data['poll_options']);
 
 $message_parser = new parse_message();
@@ -912,6 +925,22 @@
 			$message_parser->warn_msg[] = $user->lang['NO_DELETE_POLL_OPTIONS'];
 		}*/
 	}
+	else if (!$auth->acl_get('f_poll', $forum_id) && ($mode == 'edit') && ($post_id == $post_data['topic_first_post_id']) && ($original_poll_data['poll_title'] != ''))
+	{
+		// We have a poll but the editing user is not permitted to create/edit it.
+		// So we just keep the original poll-data.
+		$poll = array_merge($original_poll_data, array(
+			'enable_bbcode'		=> $post_data['enable_bbcode'],
+			'enable_urls'		=> $post_data['enable_urls'],
+			'enable_smilies'	=> $post_data['enable_smilies'],
+			'img_status'		=> $img_status,
+		));
+
+		$message_parser->parse_poll($poll);
+
+		$post_data['poll_options'] = (isset($poll['poll_options'])) ? $poll['poll_options'] : '';
+		$post_data['poll_title'] = (isset($poll['poll_title'])) ? $poll['poll_title'] : '';
+	}
 	else
 	{
 		$poll = array();
@@ -1152,7 +1181,7 @@
 		$parse_sig->bbcode_bitfield = $preview_signature_bitfield;
 
 		// Not sure about parameters for bbcode/smilies/urls... in signatures
-		$parse_sig->format_display($config['allow_sig_bbcode'], true, $config['allow_sig_smilies']);
+		$parse_sig->format_display($config['allow_sig_bbcode'], $config['allow_sig_links'], $config['allow_sig_smilies']);
 		$preview_signature = $parse_sig->message;
 		unset($parse_sig);
 	}
@@ -1258,7 +1287,7 @@
 
 		$message = $quote_string . $message;
 		$message = str_replace("\n", "\n" . $quote_string, $message);
-		$message_parser->message =  $post_data['quote_username'] . " " . $user->lang['WROTE'] . " :\n" . $message . "\n";
+		$message_parser->message =  $post_data['quote_username'] . " " . $user->lang['WROTE'] . ":\n" . $message . "\n";
 	}
 }
 
@@ -1271,7 +1300,7 @@
 $filename_data = $message_parser->filename_data;
 $post_data['post_text'] = $message_parser->message;
 
-if (sizeof($post_data['poll_options']) && $post_data['poll_title'])
+if (sizeof($post_data['poll_options']) || !empty($post_data['poll_title']))
 {
 	$message_parser->message = $post_data['poll_title'];
 	$message_parser->bbcode_uid = $post_data['bbcode_uid'];
@@ -1420,7 +1449,7 @@
 	'S_DISPLAY_USERNAME'		=> (!$user->data['is_registered'] || ($mode == 'edit' && $post_data['poster_id'] == ANONYMOUS)) ? true : false,
 	'S_SHOW_TOPIC_ICONS'		=> $s_topic_icons,
 	'S_DELETE_ALLOWED'			=> ($mode == 'edit' && (($post_id == $post_data['topic_last_post_id'] && $post_data['poster_id'] == $user->data['user_id'] && $auth->acl_get('f_delete', $forum_id) && !$post_data['post_edit_locked'] && ($post_data['post_time'] > time() - ($config['delete_time'] * 60) || !$config['delete_time'])) || $auth->acl_get('m_delete', $forum_id))) ? true : false,
-	'S_BBCODE_ALLOWED'			=> $bbcode_status,
+	'S_BBCODE_ALLOWED'			=> ($bbcode_status) ? 1 : 0,
 	'S_BBCODE_CHECKED'			=> ($bbcode_checked) ? ' checked="checked"' : '',
 	'S_SMILIES_ALLOWED'			=> $smilies_status,
 	'S_SMILIES_CHECKED'			=> ($smilies_checked) ? ' checked="checked"' : '',
diff -x .svn -aruN 3.0.7-PL1.src/search.php 3.0.8.src/search.php
--- 3.0.7-PL1.src/search.php	2010-03-05 14:36:59.000000000 -0600
+++ 3.0.8.src/search.php	2010-11-19 06:22:12.000000000 -0600
@@ -61,10 +61,18 @@
 	}
 }
 
-// Search for unread posts needs user to be logged in if topics tracking for guests is disabled
-if ($search_id == 'unreadposts' && !$config['load_anon_lastread'] && !$user->data['is_registered'])
+// Search for unread posts needs to be allowed and user to be logged in if topics tracking for guests is disabled
+if ($search_id == 'unreadposts')
 {
-	login_box('', $user->lang['LOGIN_EXPLAIN_UNREADSEARCH']);
+	if (!$config['load_unreads_search'])
+	{
+		$template->assign_var('S_NO_SEARCH', true);
+		trigger_error('NO_SEARCH_UNREADS');
+	}
+	else if (!$config['load_anon_lastread'] && !$user->data['is_registered'])
+	{
+		login_box('', $user->lang['LOGIN_EXPLAIN_UNREADSEARCH']);
+	}
 }
 
 // Is user able to search? Has search been disabled?
@@ -81,9 +89,10 @@
 	trigger_error('NO_SEARCH_TIME');
 }
 
-// Check flood limit ... if applicable
+// It is applicable if the configuration setting is non-zero, and the user cannot
+// ignore the flood setting, and the search is a keyword search.
 $interval = ($user->data['user_id'] == ANONYMOUS) ? $config['search_anonymous_interval'] : $config['search_interval'];
-if ($interval && !$auth->acl_get('u_ignoreflood'))
+if ($interval && !in_array($search_id, array('unreadposts', 'unanswered', 'active_topics', 'egosearch')) && !$auth->acl_get('u_ignoreflood'))
 {
 	if ($user->data['user_last_search'] > time() - $interval)
 	{
@@ -387,18 +396,6 @@
 
 				gen_sort_selects($limit_days, $sort_by_text, $sort_days, $sort_key, $sort_dir, $s_limit_days, $s_sort_key, $s_sort_dir, $u_sort_param);
 				$s_sort_key = $s_sort_dir = $u_sort_param = $s_limit_days = '';
-
-				$unread_list = array();
-				$unread_list = get_unread_topics($user->data['user_id'], $sql_where, $sql_sort);
-
-				if (!empty($unread_list))
-				{
-					$sql = 'SELECT t.topic_id
-						FROM ' . TOPICS_TABLE . ' t
-						WHERE ' . $db->sql_in_set('t.topic_id', array_keys($unread_list)) . "
-						$sql_sort";
-					$field = 'topic_id';
-				}
 			break;
 
 			case 'newposts':
@@ -476,6 +473,13 @@
 			$total_match_count = sizeof($id_ary) + $start;
 			$id_ary = array_slice($id_ary, 0, $per_page);
 		}
+		else if ($search_id == 'unreadposts')
+		{
+			$id_ary = array_keys(get_unread_topics($user->data['user_id'], $sql_where, $sql_sort, 1001 - $start, $start));
+
+			$total_match_count = sizeof($id_ary) + $start;
+			$id_ary = array_slice($id_ary, 0, $per_page);
+		}
 		else
 		{
 			$search_id = '';
@@ -896,7 +900,7 @@
 
 					'S_TOPIC_GLOBAL'		=> (!$forum_id) ? true : false,
 					'S_TOPIC_TYPE'			=> $row['topic_type'],
-					'S_USER_POSTED'			=> (!empty($row['mark_type'])) ? true : false,
+					'S_USER_POSTED'			=> (!empty($row['topic_posted'])) ? true : false,
 					'S_UNREAD_TOPIC'		=> $unread_topic,
 
 					'S_TOPIC_REPORTED'		=> (!empty($row['topic_reported']) && $auth->acl_get('m_report', $forum_id)) ? true : false,
@@ -1155,6 +1159,7 @@
 
 		case 'mssql':
 		case 'mssql_odbc':
+		case 'mssqlnative':
 			$sql = 'SELECT search_time, search_keywords
 				FROM ' . SEARCH_RESULTS_TABLE . '
 				WHERE DATALENGTH(search_keywords) > 0
diff -x .svn -aruN 3.0.7-PL1.src/style.php 3.0.8.src/style.php
--- 3.0.7-PL1.src/style.php	2010-03-05 14:36:59.000000000 -0600
+++ 3.0.8.src/style.php	2010-11-19 06:22:12.000000000 -0600
@@ -45,15 +45,8 @@
 	}
 }
 
-
-$sid = (isset($_GET['sid']) && !is_array($_GET['sid'])) ? htmlspecialchars($_GET['sid']) : '';
 $id = (isset($_GET['id'])) ? intval($_GET['id']) : 0;
 
-if (strspn($sid, 'abcdefABCDEF0123456789') !== strlen($sid))
-{
-	$sid = '';
-}
-
 // This is a simple script to grab and output the requested CSS data stored in the DB
 // We include a session_id check to try and limit 3rd party linking ... unless they
 // happen to have a current session it will output nothing. We will also cache the
@@ -81,6 +74,20 @@
 	$config = $cache->obtain_config();
 	$user = false;
 
+	// try to get a session ID from REQUEST array
+	$sid = request_var('sid', '');
+
+	if (!$sid)
+	{
+		// if that failed, then look in the cookies
+		$sid = request_var($config['cookie_name'] . '_sid', '', false, true);
+	}
+
+	if (strspn($sid, 'abcdefABCDEF0123456789') !== strlen($sid))
+	{
+		$sid = '';
+	}
+
 	if ($sid)
 	{
 		$sql = 'SELECT u.user_id, u.user_lang
diff -x .svn -aruN 3.0.7-PL1.src/styles/prosilver/imageset/imageset.cfg 3.0.8.src/styles/prosilver/imageset/imageset.cfg
--- 3.0.7-PL1.src/styles/prosilver/imageset/imageset.cfg	2010-03-05 14:36:59.000000000 -0600
+++ 3.0.8.src/styles/prosilver/imageset/imageset.cfg	2010-11-19 06:22:12.000000000 -0600
@@ -19,7 +19,7 @@
 # General Information about this style
 name = prosilver
 copyright = &copy; phpBB Group, 2007
-version = 3.0.7
+version = 3.0.8
 
 # Images
 img_site_logo = site_logo.gif*52*139
diff -x .svn -aruN 3.0.7-PL1.src/styles/prosilver/style.cfg 3.0.8.src/styles/prosilver/style.cfg
--- 3.0.7-PL1.src/styles/prosilver/style.cfg	2010-03-05 14:36:59.000000000 -0600
+++ 3.0.8.src/styles/prosilver/style.cfg	2010-11-19 06:22:12.000000000 -0600
@@ -19,4 +19,4 @@
 # General Information about this style
 name = prosilver
 copyright = &copy; phpBB Group, 2007
-version = 3.0.7
\ No newline at end of file
+version = 3.0.8
\ No newline at end of file
diff -x .svn -aruN 3.0.7-PL1.src/styles/prosilver/template/captcha_recaptcha.html 3.0.8.src/styles/prosilver/template/captcha_recaptcha.html
--- 3.0.7-PL1.src/styles/prosilver/template/captcha_recaptcha.html	2010-03-05 14:36:59.000000000 -0600
+++ 3.0.8.src/styles/prosilver/template/captcha_recaptcha.html	2010-11-19 06:22:12.000000000 -0600
@@ -16,6 +16,7 @@
 		// <![CDATA[
 		var RecaptchaOptions = {
 			lang : '{LA_RECAPTCHA_LANG}',
+			theme : 'clean',
 			tabindex : <!-- IF $CAPTCHA_TAB_INDEX -->{$CAPTCHA_TAB_INDEX}<!-- ELSE -->10<!-- ENDIF -->
 		};
 		// ]]>
diff -x .svn -aruN 3.0.7-PL1.src/styles/prosilver/template/editor.js 3.0.8.src/styles/prosilver/template/editor.js
--- 3.0.7-PL1.src/styles/prosilver/template/editor.js	2010-03-05 14:36:59.000000000 -0600
+++ 3.0.8.src/styles/prosilver/template/editor.js	2010-11-19 06:22:12.000000000 -0600
@@ -157,7 +157,7 @@
 		var sel_start = textarea.selectionStart;
 		var sel_end = textarea.selectionEnd;
 
-		mozWrap(textarea, text, '')
+		mozWrap(textarea, text, '');
 		textarea.selectionStart = sel_start + text.length;
 		textarea.selectionEnd = sel_end + text.length;
 	}
@@ -194,12 +194,18 @@
 /**
 * Add quote text to message
 */
-function addquote(post_id, username)
+function addquote(post_id, username, l_wrote)
 {
 	var message_name = 'message_' + post_id;
 	var theSelection = '';
 	var divarea = false;
 
+	if (l_wrote === undefined)
+	{
+		// Backwards compatibility
+		l_wrote = 'wrote';
+	}
+
 	if (document.all)
 	{
 		divarea = document.all[message_name];
@@ -256,10 +262,11 @@
 		}
 		else
 		{
+			insert_text(username + ' ' + l_wrote + ':' + '\n');
 			var lines = split_lines(theSelection);
 			for (i = 0; i < lines.length; i++)
 			{
-				insert_text('> ' + lines[i] + '\n')
+				insert_text('> ' + lines[i] + '\n');
 			}
 		}
 	}
@@ -289,7 +296,7 @@
 				if (splitAt == -1)
 				{
 					splitLines[j] = line;
-					j++
+					j++;
 				}
 				else
 				{
@@ -298,7 +305,7 @@
 					j++;
 				}
 			}
-			while(splitAt != -1)
+			while(splitAt != -1);
 		}
 	}
 	return splitLines;
@@ -319,7 +326,7 @@
 	}
 
 	var s1 = (txtarea.value).substring(0,selStart);
-	var s2 = (txtarea.value).substring(selStart, selEnd)
+	var s2 = (txtarea.value).substring(selStart, selEnd);
 	var s3 = (txtarea.value).substring(selEnd, selLength);
 
 	txtarea.value = s1 + open + s2 + close + s3;
diff -x .svn -aruN 3.0.7-PL1.src/styles/prosilver/template/forum_fn.js 3.0.8.src/styles/prosilver/template/forum_fn.js
--- 3.0.7-PL1.src/styles/prosilver/template/forum_fn.js	2010-03-05 14:36:59.000000000 -0600
+++ 3.0.8.src/styles/prosilver/template/forum_fn.js	2010-11-19 06:22:12.000000000 -0600
@@ -98,16 +98,21 @@
 /**
 * Set display of page element
 * s[-1,0,1] = hide,toggle display,show
+* type = string: inline, block, inline-block or other CSS "display" type
 */
-function dE(n, s)
+function dE(n, s, type)
 {
-	var e = document.getElementById(n);
+	if (!type)
+	{
+		type = 'block';
+	}
 
+	var e = document.getElementById(n);
 	if (!s)
 	{
-		s = (e.style.display == '' || e.style.display == 'block') ? -1 : 1;
+		s = (e.style.display == '' || e.style.display == type) ? -1 : 1;
 	}
-	e.style.display = (s == 1) ? 'block' : 'none';
+	e.style.display = (s == 1) ? type : 'none';
 }
 
 /**
diff -x .svn -aruN 3.0.7-PL1.src/styles/prosilver/template/index_body.html 3.0.8.src/styles/prosilver/template/index_body.html
--- 3.0.7-PL1.src/styles/prosilver/template/index_body.html	2010-03-05 14:36:59.000000000 -0600
+++ 3.0.8.src/styles/prosilver/template/index_body.html	2010-11-19 06:22:12.000000000 -0600
@@ -6,7 +6,7 @@
 <!-- IF S_DISPLAY_SEARCH or (S_USER_LOGGED_IN and not S_IS_BOT) -->
 <ul class="linklist">
 	<!-- IF S_DISPLAY_SEARCH -->
-		<li><a href="{U_SEARCH_UNANSWERED}">{L_SEARCH_UNANSWERED}</a><!-- IF S_USER_LOGGED_IN --> &bull; <a href="{U_SEARCH_UNREAD}">{L_SEARCH_UNREAD}</a> &bull; <a href="{U_SEARCH_NEW}">{L_SEARCH_NEW}</a><!-- ENDIF --> &bull; <a href="{U_SEARCH_ACTIVE_TOPICS}">{L_SEARCH_ACTIVE_TOPICS}</a></li>
+		<li><a href="{U_SEARCH_UNANSWERED}">{L_SEARCH_UNANSWERED}</a><!-- IF S_LOAD_UNREADS --> &bull; <a href="{U_SEARCH_UNREAD}">{L_SEARCH_UNREAD}</a><!-- ENDIF --><!-- IF S_USER_LOGGED_IN --> &bull; <a href="{U_SEARCH_NEW}">{L_SEARCH_NEW}</a><!-- ENDIF --> &bull; <a href="{U_SEARCH_ACTIVE_TOPICS}">{L_SEARCH_ACTIVE_TOPICS}</a></li>
 	<!-- ENDIF -->
 	<!-- IF not S_IS_BOT and U_MARK_FORUMS --><li class="rightside"><a href="{U_MARK_FORUMS}" accesskey="m">{L_MARK_FORUMS_READ}</a></li><!-- ENDIF -->
 </ul>
diff -x .svn -aruN 3.0.7-PL1.src/styles/prosilver/template/login_body.html 3.0.8.src/styles/prosilver/template/login_body.html
--- 3.0.7-PL1.src/styles/prosilver/template/login_body.html	2010-03-05 14:36:59.000000000 -0600
+++ 3.0.8.src/styles/prosilver/template/login_body.html	2010-11-19 06:22:12.000000000 -0600
@@ -1,5 +1,11 @@
 <!-- INCLUDE overall_header.html -->
 
+<script type="text/javascript">
+// <![CDATA[
+	onload_functions.push('document.getElementById("{USERNAME_CREDENTIAL}").focus();');
+// ]]>
+</script>
+
 <form action="{S_LOGIN_ACTION}" method="post" id="login">
 <div class="panel">
 	<div class="inner"><span class="corners-top"><span></span></span>
@@ -32,11 +38,11 @@
 		</dl>
 		<!-- ENDIF -->
 
+		{S_LOGIN_REDIRECT}
 		<dl>
 			<dt>&nbsp;</dt>
 			<dd>{S_HIDDEN_FIELDS}<input type="submit" name="login" tabindex="6" value="{L_LOGIN}" class="button1" /></dd>
 		</dl>
-		{S_LOGIN_REDIRECT}
 		</fieldset>
 	</div>
 	<span class="corners-bottom"><span></span></span></div>
diff -x .svn -aruN 3.0.7-PL1.src/styles/prosilver/template/mcp_post.html 3.0.8.src/styles/prosilver/template/mcp_post.html
--- 3.0.7-PL1.src/styles/prosilver/template/mcp_post.html	2010-03-05 14:36:59.000000000 -0600
+++ 3.0.8.src/styles/prosilver/template/mcp_post.html	2010-11-19 06:22:12.000000000 -0600
@@ -54,6 +54,8 @@
 		</ul>
 		<!-- ENDIF -->
 
+		<span class="right-box" id="expand"><a href="#post_details" onclick="viewableArea(getElementById('post_details'), true); var rev_text = getElementById('expand').getElementsByTagName('a').item(0).firstChild; if (rev_text.data == '{LA_EXPAND_VIEW}'){rev_text.data = '{LA_COLLAPSE_VIEW}'; } else if (rev_text.data == '{LA_COLLAPSE_VIEW}'){rev_text.data = '{LA_EXPAND_VIEW}'}; return false;">{L_EXPAND_VIEW}</a></span>
+
 		<h3><a href="{U_VIEW_POST}">{POST_SUBJECT}</a></h3>
 		<!-- IF S_PM -->
 		<p class="author">
@@ -84,7 +86,7 @@
 			</p>
 		<!-- ENDIF -->
 
-		<div class="content">
+		<div class="content" id="post_details">
 			{POST_PREVIEW}
 		</div>
 
diff -x .svn -aruN 3.0.7-PL1.src/styles/prosilver/template/mcp_reports.html 3.0.8.src/styles/prosilver/template/mcp_reports.html
--- 3.0.7-PL1.src/styles/prosilver/template/mcp_reports.html	2010-03-05 14:36:59.000000000 -0600
+++ 3.0.8.src/styles/prosilver/template/mcp_reports.html	2010-11-19 06:22:12.000000000 -0600
@@ -54,7 +54,7 @@
 					</dt>
 					<dd class="moderation">
 						<span>{postrow.REPORTER_FULL} &laquo; {postrow.REPORT_TIME}<br />
-						{L_FORUM}: <a href="{postrow.U_VIEWFORUM}">{postrow.FORUM_NAME}</a></span>
+						<!-- IF postrow.U_VIEWFORUM -->{L_FORUM}: <a href="{postrow.U_VIEWFORUM}">{postrow.FORUM_NAME}</a><!-- ELSE -->{postrow.FORUM_NAME}<!-- ENDIF --></span>
 					</dd>
 					<!-- ENDIF -->
 					<dd class="mark"><input type="checkbox" name="report_id_list[]" value="{postrow.REPORT_ID}" /></dd>
diff -x .svn -aruN 3.0.7-PL1.src/styles/prosilver/template/overall_header.html 3.0.8.src/styles/prosilver/template/overall_header.html
--- 3.0.7-PL1.src/styles/prosilver/template/overall_header.html	2010-03-05 14:36:59.000000000 -0600
+++ 3.0.8.src/styles/prosilver/template/overall_header.html	2010-11-19 06:22:12.000000000 -0600
@@ -11,7 +11,7 @@
 <meta name="copyright" content="2000, 2002, 2005, 2007 phpBB Group" />
 <meta name="keywords" content="" />
 <meta name="description" content="" />
-<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />
+<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7; IE=EmulateIE9" />
 {META}
 <title>{SITENAME} &bull; <!-- IF S_IN_MCP -->{L_MCP} &bull; <!-- ELSEIF S_IN_UCP -->{L_UCP} &bull; <!-- ENDIF -->{PAGE_TITLE}</title>
 
diff -x .svn -aruN 3.0.7-PL1.src/styles/prosilver/template/posting_buttons.html 3.0.8.src/styles/prosilver/template/posting_buttons.html
--- 3.0.7-PL1.src/styles/prosilver/template/posting_buttons.html	2010-03-05 14:36:59.000000000 -0600
+++ 3.0.8.src/styles/prosilver/template/posting_buttons.html	2010-11-19 06:22:12.000000000 -0600
@@ -79,7 +79,7 @@
 	<input type="button" class="button2" accesskey="c" name="addbbcode8" value="Code" style="width: 40px" onclick="bbstyle(8)" title="{L_BBCODE_C_HELP}" />
 	<input type="button" class="button2" accesskey="l" name="addbbcode10" value="List" style="width: 40px" onclick="bbstyle(10)" title="{L_BBCODE_L_HELP}" />
 	<input type="button" class="button2" accesskey="o" name="addbbcode12" value="List=" style="width: 40px" onclick="bbstyle(12)" title="{L_BBCODE_O_HELP}" />
-	<input type="button" class="button2" accesskey="t" name="addlitsitem" value="[*]" style="width: 40px" onclick="bbstyle(-1)" title="{L_BBCODE_LISTITEM_HELP}" />
+	<input type="button" class="button2" accesskey="y" name="addlitsitem" value="[*]" style="width: 40px" onclick="bbstyle(-1)" title="{L_BBCODE_LISTITEM_HELP}" />
 	<!-- IF S_BBCODE_IMG -->
 		<input type="button" class="button2" accesskey="p" name="addbbcode14" value="Img" style="width: 40px" onclick="bbstyle(14)" title="{L_BBCODE_P_HELP}" />
 	<!-- ENDIF -->
diff -x .svn -aruN 3.0.7-PL1.src/styles/prosilver/template/posting_editor.html 3.0.8.src/styles/prosilver/template/posting_editor.html
--- 3.0.7-PL1.src/styles/prosilver/template/posting_editor.html	2010-03-05 14:36:59.000000000 -0600
+++ 3.0.8.src/styles/prosilver/template/posting_editor.html	2010-11-19 06:22:12.000000000 -0600
@@ -187,8 +187,8 @@
 		<fieldset class="submit-buttons">
 			{S_HIDDEN_ADDRESS_FIELD}
 			{S_HIDDEN_FIELDS}
-			<!-- IF S_HAS_DRAFTS --><input type="submit" accesskey="d" tabindex="8" name="load" value="{L_LOAD}" class="button2" onclick="load_draft = true;" />&nbsp; <!-- ENDIF -->
-			<!-- IF S_SAVE_ALLOWED --><input type="submit" accesskey="k" tabindex="7" name="save" value="{L_SAVE}" class="button2" />&nbsp; <!-- ENDIF -->
+			<!-- IF S_HAS_DRAFTS --><input type="submit" accesskey="d" tabindex="8" name="load" value="{L_LOAD_DRAFT}" class="button2" onclick="load_draft = true;" />&nbsp; <!-- ENDIF -->
+			<!-- IF S_SAVE_ALLOWED --><input type="submit" accesskey="k" tabindex="7" name="save" value="{L_SAVE_DRAFT}" class="button2" />&nbsp; <!-- ENDIF -->
 			<input type="submit" tabindex="5" name="preview" value="{L_PREVIEW}" class="button1"<!-- IF not S_PRIVMSGS --> onclick="document.getElementById('postform').action += '#preview';"<!-- ENDIF --> />&nbsp;
 			<input type="submit" accesskey="s" tabindex="6" name="post" value="{L_SUBMIT}" class="button1 default-submit-action" />&nbsp;
 
diff -x .svn -aruN 3.0.7-PL1.src/styles/prosilver/template/posting_topic_review.html 3.0.8.src/styles/prosilver/template/posting_topic_review.html
--- 3.0.7-PL1.src/styles/prosilver/template/posting_topic_review.html	2010-03-05 14:36:59.000000000 -0600
+++ 3.0.8.src/styles/prosilver/template/posting_topic_review.html	2010-11-19 06:22:12.000000000 -0600
@@ -24,7 +24,7 @@
 		<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">
-				<li class="quote-icon"><a href="#postingbox" onclick="addquote({topic_review_row.POST_ID}, '{topic_review_row.POSTER_QUOTE}');" title="{L_QUOTE} {topic_review_row.POST_AUTHOR}"><span>{L_QUOTE} {topic_review_row.POST_AUTHOR}</span></a></li>
+				<li class="quote-icon"><a href="#postingbox" onclick="addquote({topic_review_row.POST_ID}, '{topic_review_row.POSTER_QUOTE}', '{LA_WROTE}');" title="{L_QUOTE} {topic_review_row.POST_AUTHOR}"><span>{L_QUOTE} {topic_review_row.POST_AUTHOR}</span></a></li>
 			</ul>
 			<!-- 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 -->
diff -x .svn -aruN 3.0.7-PL1.src/styles/prosilver/template/quickreply_editor.html 3.0.8.src/styles/prosilver/template/quickreply_editor.html
--- 3.0.7-PL1.src/styles/prosilver/template/quickreply_editor.html	2010-03-05 14:36:59.000000000 -0600
+++ 3.0.8.src/styles/prosilver/template/quickreply_editor.html	2010-11-19 06:22:12.000000000 -0600
@@ -61,7 +61,7 @@
 					{S_FORM_TOKEN}
 					{QR_HIDDEN_FIELDS}
 					<input type="submit" accesskey="s" tabindex="6" name="post" value="{L_SUBMIT}" class="button1" />&nbsp;
-					<input type="submit" accesskey="f" tabindex="6" name="full_editor" value="{L_FULL_EDITOR}" class="button2" />&nbsp;
+					<input type="submit" accesskey="f" tabindex="7" name="full_editor" value="{L_FULL_EDITOR}" class="button2" />&nbsp;
 				</fieldset>
 				<a href="" class="right-box up" onclick="hide_qr(false); return false;" title="{L_COLLAPSE_QR}">{L_COLLAPSE_QR}</a>
 		<span class="corners-bottom"><span></span></span></div>
diff -x .svn -aruN 3.0.7-PL1.src/styles/prosilver/template/search_body.html 3.0.8.src/styles/prosilver/template/search_body.html
--- 3.0.7-PL1.src/styles/prosilver/template/search_body.html	2010-03-05 14:36:59.000000000 -0600
+++ 3.0.8.src/styles/prosilver/template/search_body.html	2010-11-19 06:22:12.000000000 -0600
@@ -1,5 +1,11 @@
 <!-- INCLUDE overall_header.html -->
 
+<script type="text/javascript">
+// <![CDATA[
+	onload_functions.push('document.getElementById("keywords").focus();');
+// ]]>
+</script>
+
 <h2 class="solo">{L_SEARCH}</h2>
 
 <form method="get" action="{S_SEARCH_ACTION}">
@@ -119,4 +125,4 @@
 </div>
 <!-- ENDIF -->
 
-<!-- INCLUDE overall_footer.html -->
\ No newline at end of file
+<!-- INCLUDE overall_footer.html -->
diff -x .svn -aruN 3.0.7-PL1.src/styles/prosilver/template/template.cfg 3.0.8.src/styles/prosilver/template/template.cfg
--- 3.0.7-PL1.src/styles/prosilver/template/template.cfg	2010-03-05 14:36:59.000000000 -0600
+++ 3.0.8.src/styles/prosilver/template/template.cfg	2010-11-19 06:22:12.000000000 -0600
@@ -19,7 +19,7 @@
 # General Information about this template
 name = prosilver
 copyright = &copy; phpBB Group, 2007
-version = 3.0.7
+version = 3.0.8
 
 # Defining a different template bitfield
 template_bitfield = lNg=
diff -x .svn -aruN 3.0.7-PL1.src/styles/prosilver/template/ucp_pm_history.html 3.0.8.src/styles/prosilver/template/ucp_pm_history.html
--- 3.0.7-PL1.src/styles/prosilver/template/ucp_pm_history.html	2010-03-05 14:36:59.000000000 -0600
+++ 3.0.8.src/styles/prosilver/template/ucp_pm_history.html	2010-11-19 06:22:12.000000000 -0600
@@ -1,10 +1,15 @@
 
 <h3 id="review">
 	<span class="right-box"><a href="#review" onclick="viewableArea(getElementById('topicreview'), true); var rev_text = getElementById('review').getElementsByTagName('a').item(0).firstChild; if (rev_text.data == '{LA_EXPAND_VIEW}'){rev_text.data = '{LA_COLLAPSE_VIEW}'; } else if (rev_text.data == '{LA_COLLAPSE_VIEW}'){rev_text.data = '{LA_EXPAND_VIEW}'};">{L_EXPAND_VIEW}</a></span>
-	{L_MESSAGE_HISTORY}: {HISTORY_TITLE}
+	{L_MESSAGE_HISTORY}:
 </h3>
 
 <div id="topicreview">
+	<script type="text/javascript">
+	// <![CDATA[
+		bbcodeEnabled = {S_BBCODE_ALLOWED};
+	// ]]>
+	</script>
 	<!-- BEGIN history_row -->
 	<div class="post <!-- IF history_row.S_ROW_COUNT is even -->bg1<!-- ELSE -->bg2<!-- ENDIF -->">
 		<div class="inner"><span class="corners-top"><span></span></span>
@@ -12,7 +17,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}', '{LA_WROTE}');"<!-- 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.7-PL1.src/styles/prosilver/template/ucp_pm_viewfolder.html 3.0.8.src/styles/prosilver/template/ucp_pm_viewfolder.html
--- 3.0.7-PL1.src/styles/prosilver/template/ucp_pm_viewfolder.html	2010-03-05 14:36:59.000000000 -0600
+++ 3.0.8.src/styles/prosilver/template/ucp_pm_viewfolder.html	2010-11-19 06:22:12.000000000 -0600
@@ -71,7 +71,7 @@
 							<br /><em class="small">{L_PM_FROM_REMOVED_AUTHOR}</em>
 						<!-- ENDIF -->
 
-						<!-- IF messagerow.S_TOPIC_REPORTED --><a href="{messagerow.U_MCP_REPORT}">{REPORTED_IMG}</a><!-- ENDIF --> {messagerow.ATTACH_ICON_IMG}<br />
+						<!-- IF messagerow.S_PM_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} &raquo; {messagerow.SENT_TIME}<!-- ENDIF -->
 					</dt>
 					<!-- IF S_SHOW_RECIPIENTS --><dd class="info"><span>{L_SENT_AT}: {messagerow.SENT_TIME}</span></dd><!-- ENDIF -->
diff -x .svn -aruN 3.0.7-PL1.src/styles/prosilver/template/ucp_profile_signature.html 3.0.8.src/styles/prosilver/template/ucp_profile_signature.html
--- 3.0.7-PL1.src/styles/prosilver/template/ucp_profile_signature.html	2010-03-05 14:36:59.000000000 -0600
+++ 3.0.8.src/styles/prosilver/template/ucp_profile_signature.html	2010-11-19 06:22:12.000000000 -0600
@@ -4,7 +4,7 @@
 
 <h2>{L_TITLE}</h2>
 
-<!-- IF SIGNATURE_PREVIEW -->
+<!-- IF SIGNATURE_PREVIEW != '' -->
 	<div class="panel">
 		<div class="inner"><span class="corners-top"><span></span></span>
 		<h3>{L_SIGNATURE_PREVIEW}</h3>
diff -x .svn -aruN 3.0.7-PL1.src/styles/prosilver/template/viewforum_body.html 3.0.8.src/styles/prosilver/template/viewforum_body.html
--- 3.0.7-PL1.src/styles/prosilver/template/viewforum_body.html	2010-03-05 14:36:59.000000000 -0600
+++ 3.0.8.src/styles/prosilver/template/viewforum_body.html	2010-11-19 06:22:12.000000000 -0600
@@ -39,7 +39,7 @@
 
 	<!-- IF not S_IS_BOT and S_DISPLAY_POST_INFO -->
 		<div class="buttons">
-			<div class="<!-- IF S_IS_LOCKED -->locked-icon<!-- ELSE -->post-icon<!-- ENDIF -->"><a href="{U_POST_NEW_TOPIC}" title="<!-- IF S_IS_LOCKED -->{L_FORUM_LOCKED}<!-- ELSE -->{L_POST_TOPIC}<!-- ENDIF -->"><span></span><!-- IF S_IS_LOCKED -->{L_FORUM_LOCKED}<!-- ELSE -->{L_POST_TOPIC}<!-- ENDIF --></a></div>
+			<div class="<!-- IF S_IS_LOCKED -->locked-icon<!-- ELSE -->post-icon<!-- ENDIF -->" title="<!-- IF S_IS_LOCKED -->{L_FORUM_LOCKED}<!-- ELSE -->{L_POST_TOPIC}<!-- ENDIF -->"><a href="{U_POST_NEW_TOPIC}"><span></span><!-- IF S_IS_LOCKED -->{L_FORUM_LOCKED}<!-- ELSE -->{L_POST_TOPIC}<!-- ENDIF --></a></div>
 		</div>
 	<!-- ENDIF -->
 
@@ -122,12 +122,12 @@
 	<!-- ENDIF -->
 
 	<!-- IF topicrow.S_FIRST_ROW or not topicrow.S_TOPIC_TYPE_SWITCH -->
-		<div class="forumbg<!-- IF topicrow.S_TOPIC_TYPE_SWITCH --> announcement<!-- ENDIF -->">
+		<div class="forumbg<!-- IF topicrow.S_TOPIC_TYPE_SWITCH and (topicrow.S_POST_ANNOUNCE or topicrow.S_POST_GLOBAL) --> announcement<!-- ENDIF -->">
 		<div class="inner"><span class="corners-top"><span></span></span>
 		<ul class="topiclist">
 			<li class="header">
 				<dl class="icon">
-					<dt><!-- IF S_DISPLAY_ACTIVE -->{L_ACTIVE_TOPICS}<!-- ELSEIF topicrow.S_TOPIC_TYPE_SWITCH and topicrow.S_TOPIC_TYPE gt 1 -->{L_ANNOUNCEMENTS}<!-- ELSE -->{L_TOPICS}<!-- ENDIF --></dt>
+					<dt><!-- IF S_DISPLAY_ACTIVE -->{L_ACTIVE_TOPICS}<!-- ELSEIF topicrow.S_TOPIC_TYPE_SWITCH and (topicrow.S_POST_ANNOUNCE or topicrow.S_POST_GLOBAL) -->{L_ANNOUNCEMENTS}<!-- ELSE -->{L_TOPICS}<!-- ENDIF --></dt>
 					<dd class="posts">{L_REPLIES}</dd>
 					<dd class="views">{L_VIEWS}</dd>
 					<dd class="lastpost"><span>{L_LAST_POST}</span></dd>
@@ -137,7 +137,7 @@
 		<ul class="topiclist topics">
 	<!-- ENDIF -->
 
-		<li class="row<!-- IF topicrow.S_ROW_COUNT is even --> bg1<!-- ELSE --> bg2<!-- ENDIF --><!-- IF topicrow.S_POST_ANNOUNCE --> announce<!-- ENDIF --><!-- IF topicrow.S_POST_STICKY --> sticky<!-- ENDIF --><!-- IF topicrow.S_TOPIC_REPORTED --> reported<!-- ENDIF -->">
+		<li class="row<!-- IF topicrow.S_ROW_COUNT is even --> bg1<!-- ELSE --> bg2<!-- ENDIF --><!-- IF topicrow.S_POST_GLOBAL --> global-announce<!-- ENDIF --><!-- IF topicrow.S_POST_ANNOUNCE --> announce<!-- ENDIF --><!-- IF topicrow.S_POST_STICKY --> sticky<!-- 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 --> title="{topicrow.TOPIC_FOLDER_IMG_ALT}"><!-- IF topicrow.S_UNREAD_TOPIC --><a href="{topicrow.U_NEWEST_POST}">{NEWEST_POST_IMG}</a> <!-- 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 -->
diff -x .svn -aruN 3.0.7-PL1.src/styles/prosilver/theme/bidi.css 3.0.8.src/styles/prosilver/theme/bidi.css
--- 3.0.7-PL1.src/styles/prosilver/theme/bidi.css	2010-03-05 14:36:59.000000000 -0600
+++ 3.0.8.src/styles/prosilver/theme/bidi.css	2010-11-19 06:22:12.000000000 -0600
@@ -236,6 +236,7 @@
 }
 
 .rtl a.top2 {
+	background-position: 100% 50%;
 	padding-left: 0;
 	padding-right: 15px;
 }
diff -x .svn -aruN 3.0.7-PL1.src/styles/prosilver/theme/content.css 3.0.8.src/styles/prosilver/theme/content.css
--- 3.0.7-PL1.src/styles/prosilver/theme/content.css	2010-03-05 14:36:59.000000000 -0600
+++ 3.0.8.src/styles/prosilver/theme/content.css	2010-11-19 06:22:12.000000000 -0600
@@ -298,6 +298,20 @@
 	display: none;
 }
 
+/* MCP Post details
+----------------------------------------*/
+#post_details
+{
+	/* This will only work in IE7+, plus the others */
+	overflow: auto;
+	max-height: 300px;
+}
+
+#expand
+{
+	clear: both;
+}
+
 /* Content container styles
 ----------------------------------------*/
 .content {
diff -x .svn -aruN 3.0.7-PL1.src/styles/prosilver/theme/forms.css 3.0.8.src/styles/prosilver/theme/forms.css
--- 3.0.7-PL1.src/styles/prosilver/theme/forms.css	2010-03-05 14:36:59.000000000 -0600
+++ 3.0.8.src/styles/prosilver/theme/forms.css	2010-11-19 06:22:12.000000000 -0600
@@ -96,6 +96,11 @@
 	margin-bottom: 3px;
 }
 
+/* Set it back to 0px for the reCaptcha divs: PHPBB3-9587 */
+fieldset.fields1 #recaptcha_widget_div div {
+	margin-bottom: 0;
+}
+
 /* Specific layout 2 */
 fieldset.fields2 dt {
 	width: 15em;
diff -x .svn -aruN 3.0.7-PL1.src/styles/prosilver/theme/print.css 3.0.8.src/styles/prosilver/theme/print.css
--- 3.0.7-PL1.src/styles/prosilver/theme/print.css	2010-03-05 14:36:59.000000000 -0600
+++ 3.0.8.src/styles/prosilver/theme/print.css	2010-11-19 06:22:12.000000000 -0600
@@ -140,3 +140,5 @@
 
 /* Accessibility tweaks: Mozilla.org */
 .skip_link { display: none; }
+
+dl.codebox dt { display: none; }
\ No newline at end of file
diff -x .svn -aruN 3.0.7-PL1.src/styles/prosilver/theme/theme.cfg 3.0.8.src/styles/prosilver/theme/theme.cfg
--- 3.0.7-PL1.src/styles/prosilver/theme/theme.cfg	2010-03-05 14:36:59.000000000 -0600
+++ 3.0.8.src/styles/prosilver/theme/theme.cfg	2010-11-19 06:22:12.000000000 -0600
@@ -21,7 +21,7 @@
 # General Information about this theme
 name = prosilver
 copyright = &copy; phpBB Group, 2007
-version = 3.0.7
+version = 3.0.8
 
 # Some configuration options
 
diff -x .svn -aruN 3.0.7-PL1.src/styles/subsilver2/imageset/imageset.cfg 3.0.8.src/styles/subsilver2/imageset/imageset.cfg
--- 3.0.7-PL1.src/styles/subsilver2/imageset/imageset.cfg	2010-03-05 14:36:59.000000000 -0600
+++ 3.0.8.src/styles/subsilver2/imageset/imageset.cfg	2010-11-19 06:22:12.000000000 -0600
@@ -19,7 +19,7 @@
 # General Information about this style
 name = subsilver2
 copyright = &copy; phpBB Group, 2003
-version = 3.0.7
+version = 3.0.8
 
 # Images
 img_site_logo = site_logo.gif*94*170
diff -x .svn -aruN 3.0.7-PL1.src/styles/subsilver2/style.cfg 3.0.8.src/styles/subsilver2/style.cfg
--- 3.0.7-PL1.src/styles/subsilver2/style.cfg	2010-03-05 14:37:00.000000000 -0600
+++ 3.0.8.src/styles/subsilver2/style.cfg	2010-11-19 06:22:12.000000000 -0600
@@ -19,4 +19,4 @@
 # General Information about this style
 name = subsilver2
 copyright = &copy; 2005 phpBB Group
-version = 3.0.7
+version = 3.0.8
diff -x .svn -aruN 3.0.7-PL1.src/styles/subsilver2/template/attachment.html 3.0.8.src/styles/subsilver2/template/attachment.html
--- 3.0.7-PL1.src/styles/subsilver2/template/attachment.html	2010-03-05 14:36:59.000000000 -0600
+++ 3.0.8.src/styles/subsilver2/template/attachment.html	2010-11-19 06:22:12.000000000 -0600
@@ -58,13 +58,13 @@
 
 		<!-- ELSEIF _file.S_FLASH_FILE -->
 			<object classid="clsid:D27CDB6E-AE6D-11CF-96B8-444553540000" codebase="http://active.macromedia.com/flash2/cabs/swflash.cab#version=5,0,0,0" width="{_file.WIDTH}" height="{_file.HEIGHT}">
-				<param name="movie" value="{_file.U_DOWNLOAD_LINK}" />
+				<param name="movie" value="{_file.U_VIEW_LINK}" />
 				<param name="play" value="true" />
 				<param name="loop" value="true" />
 				<param name="quality" value="high" />
 				<param name="allowScriptAccess" value="never" />
 				<param name="allowNetworking" value="internal" />
-				<embed src="{_file.U_DOWNLOAD_LINK}" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash" width="{_file.WIDTH}" height="{_file.HEIGHT}" play="true" loop="true" quality="high" allowscriptaccess="never" allownetworking="internal"></embed>
+				<embed src="{_file.U_VIEW_LINK}" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash" width="{_file.WIDTH}" height="{_file.HEIGHT}" play="true" loop="true" quality="high" allowscriptaccess="never" allownetworking="internal"></embed>
 			</object>
 		<!-- ELSEIF _file.S_QUICKTIME_FILE -->
 			<object id="qtstream_{_file.ATTACH_ID}" classid="clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B" codebase="http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0" width="0" height="16">
diff -x .svn -aruN 3.0.7-PL1.src/styles/subsilver2/template/captcha_default.html 3.0.8.src/styles/subsilver2/template/captcha_default.html
--- 3.0.7-PL1.src/styles/subsilver2/template/captcha_default.html	2010-03-05 14:37:00.000000000 -0600
+++ 3.0.8.src/styles/subsilver2/template/captcha_default.html	2010-11-19 06:22:12.000000000 -0600
@@ -1,9 +1,11 @@
 	<tr>
 		<th colspan="2" valign="middle">{L_CONFIRM_CODE}</th>
 	</tr>
+	<!-- IF S_TYPE == 1 -->
 	<tr>
 		<td class="row3" colspan="2"><span class="gensmall">{L_CONFIRM_EXPLAIN}</span></td>
 	</tr>
+	<!-- ENDIF -->	
 	<tr>
 		<td class="row1" colspan="2" align="center"><img src="{CONFIRM_IMAGE_LINK}" alt="{L_CONFIRM_CODE}" />
 		<input type="hidden" name="confirm_id" id="confirm_id" value="{CONFIRM_ID}" /></td>
diff -x .svn -aruN 3.0.7-PL1.src/styles/subsilver2/template/captcha_recaptcha.html 3.0.8.src/styles/subsilver2/template/captcha_recaptcha.html
--- 3.0.7-PL1.src/styles/subsilver2/template/captcha_recaptcha.html	2010-03-05 14:37:00.000000000 -0600
+++ 3.0.8.src/styles/subsilver2/template/captcha_recaptcha.html	2010-11-19 06:22:12.000000000 -0600
@@ -9,6 +9,7 @@
 		// <![CDATA[
 		var RecaptchaOptions = {
 			lang : '{LA_RECAPTCHA_LANG}',
+			theme : 'clean',
 			tabindex : <!-- IF $CAPTCHA_TAB_INDEX -->{$CAPTCHA_TAB_INDEX}<!-- ELSE -->10<!-- ENDIF -->
 		};
 		// ]]>
diff -x .svn -aruN 3.0.7-PL1.src/styles/subsilver2/template/editor.js 3.0.8.src/styles/subsilver2/template/editor.js
--- 3.0.7-PL1.src/styles/subsilver2/template/editor.js	2010-03-05 14:36:59.000000000 -0600
+++ 3.0.8.src/styles/subsilver2/template/editor.js	2010-11-19 06:22:12.000000000 -0600
@@ -6,6 +6,7 @@
 // Startup variables
 var imageTag = false;
 var theSelection = false;
+var bbcodeEnabled = true;
 
 // Check for Browser & Platform for PC & IE specific bits
 // More details from: http://www.mozilla.org/docs/web-developer/sniffer/browser_type.html
@@ -156,7 +157,7 @@
 		var sel_start = textarea.selectionStart;
 		var sel_end = textarea.selectionEnd;
 
-		mozWrap(textarea, text, '')
+		mozWrap(textarea, text, '');
 		textarea.selectionStart = sel_start + text.length;
 		textarea.selectionEnd = sel_end + text.length;
 	}	
@@ -195,12 +196,18 @@
 /**
 * Add quote text to message
 */
-function addquote(post_id, username)
+function addquote(post_id, username, l_wrote)
 {
 	var message_name = 'message_' + post_id;
 	var theSelection = '';
 	var divarea = false;
 
+	if (l_wrote === undefined)
+	{
+		// Backwards compatibility
+		l_wrote = 'wrote';
+	}
+
 	if (document.all)
 	{
 		divarea = document.all[message_name];
@@ -233,6 +240,7 @@
 			theSelection = theSelection.replace(/&lt\;/ig, '<');
 			theSelection = theSelection.replace(/&gt\;/ig, '>');
 			theSelection = theSelection.replace(/&amp\;/ig, '&');
+			theSelection = theSelection.replace(/&nbsp\;/ig, ' ');
 		}
 		else if (document.all)
 		{
@@ -250,12 +258,62 @@
 
 	if (theSelection)
 	{
-		insert_text('[quote="' + username + '"]' + theSelection + '[/quote]');
+		if (bbcodeEnabled)
+		{
+			insert_text('[quote="' + username + '"]' + theSelection + '[/quote]');
+		}
+		else
+		{
+			insert_text(username + ' ' + l_wrote + ':' + '\n');
+			var lines = split_lines(theSelection);
+			for (i = 0; i < lines.length; i++)
+			{
+				insert_text('> ' + lines[i] + '\n');
+			}
+		}
 	}
 
 	return;
 }
 
+
+function split_lines(text)
+{
+	var lines = text.split('\n');
+	var splitLines = new Array();
+	var j = 0;
+	for(i = 0; i < lines.length; i++)
+	{
+		if (lines[i].length <= 80)
+		{
+			splitLines[j] = lines[i];
+			j++;
+		}
+		else
+		{
+			var line = lines[i];
+			do
+			{
+				var splitAt = line.indexOf(' ', 80);
+				
+				if (splitAt == -1)
+				{
+					splitLines[j] = line;
+					j++;
+				}
+				else
+				{
+					splitLines[j] = line.substring(0, splitAt);
+					line = line.substring(splitAt);
+					j++;
+				}
+			}
+			while(splitAt != -1);
+		}
+	}
+	return splitLines;
+}
+
 /**
 * From http://www.massless.org/mozedit/
 */
@@ -272,7 +330,7 @@
 	}
 
 	var s1 = (txtarea.value).substring(0,selStart);
-	var s2 = (txtarea.value).substring(selStart, selEnd)
+	var s2 = (txtarea.value).substring(selStart, selEnd);
 	var s3 = (txtarea.value).substring(selEnd, selLength);
 
 	txtarea.value = s1 + open + s2 + close + s3;
@@ -330,8 +388,8 @@
 			for (b = 0; b < 5; b++)
 			{
 				color = String(numberList[r]) + String(numberList[g]) + String(numberList[b]);
-				document.write('<td bgcolor="#' + color + '">');
-				document.write('<a href="#" onclick="bbfontstyle(\'[color=#' + color + ']\', \'[/color]\'); return false;" onmouseover="helpline(\'s\');"  onmouseout="helpline(\'tip\');"><img src="images/spacer.gif" width="' + width + '" height="' + height + '" alt="#' + color + '" title="#' + color + '" /></a>');
+				document.write('<td bgcolor="#' + color + '" style="width: ' + width + 'px; height: ' + height + 'px;">');
+				document.write('<a href="#" onclick="bbfontstyle(\'[color=#' + color + ']\', \'[/color]\'); return false;"><img src="images/spacer.gif" width="' + width + '" height="' + height + '" alt="#' + color + '" title="#' + color + '" /></a>');
 				document.writeln('</td>');
 			}
 
diff -x .svn -aruN 3.0.7-PL1.src/styles/subsilver2/template/index_body.html 3.0.8.src/styles/subsilver2/template/index_body.html
--- 3.0.7-PL1.src/styles/subsilver2/template/index_body.html	2010-03-05 14:36:59.000000000 -0600
+++ 3.0.8.src/styles/subsilver2/template/index_body.html	2010-11-19 06:22:12.000000000 -0600
@@ -89,11 +89,11 @@
 
 <table class="legend">
 <tr>
-	<td width="20" align="center">{FORUM_NEW_IMG}</td>
-	<td><span class="gensmall">{L_NEW_POSTS}</span></td>
+	<td width="20" align="center">{FORUM_UNREAD_IMG}</td>
+	<td><span class="gensmall">{L_UNREAD_POSTS}</span></td>
 	<td>&nbsp;&nbsp;</td>
 	<td width="20" align="center">{FORUM_IMG}</td>
-	<td><span class="gensmall">{L_NO_NEW_POSTS}</span></td>
+	<td><span class="gensmall">{L_NO_UNREAD_POSTS}</span></td>
 	<td>&nbsp;&nbsp;</td>
 	<td width="20" align="center">{FORUM_LOCKED_IMG}</td>
 	<td><span class="gensmall">{L_FORUM_LOCKED}</span></td>
diff -x .svn -aruN 3.0.7-PL1.src/styles/subsilver2/template/login_body.html 3.0.8.src/styles/subsilver2/template/login_body.html
--- 3.0.7-PL1.src/styles/subsilver2/template/login_body.html	2010-03-05 14:37:00.000000000 -0600
+++ 3.0.8.src/styles/subsilver2/template/login_body.html	2010-11-19 06:22:12.000000000 -0600
@@ -72,12 +72,12 @@
 	<!-- INCLUDE {CAPTCHA_TEMPLATE} -->
 <!-- ENDIF -->
 
+{S_LOGIN_REDIRECT}
 <tr>
 	<td class="cat" <!-- IF not S_ADMIN_AUTH or S_CONFIRM_CODE -->colspan="2"<!-- ENDIF --> align="center">{S_HIDDEN_FIELDS}<input type="submit" name="login" class="btnmain" value="{L_LOGIN}" tabindex="5" /></td>
 </tr>
 </table>
 {S_FORM_TOKEN}
-{S_LOGIN_REDIRECT}
 </form>
 
 <br clear="all" />
@@ -88,4 +88,21 @@
 
 <div align="{S_CONTENT_FLOW_END}"><!-- INCLUDE jumpbox.html --></div>
 
-<!-- INCLUDE overall_footer.html -->
\ No newline at end of file
+<script type="text/javascript">
+// <![CDATA[
+	(function()
+	{
+		var elements = document.getElementsByName("{USERNAME_CREDENTIAL}");
+		for (var i = 0; i < elements.length; ++i)
+		{
+			if (elements[i].tagName.toLowerCase() == 'input')
+			{
+				elements[i].focus();
+				break;
+			}
+		}
+	})();
+// ]]>
+</script>
+
+<!-- INCLUDE overall_footer.html -->
diff -x .svn -aruN 3.0.7-PL1.src/styles/subsilver2/template/overall_header.html 3.0.8.src/styles/subsilver2/template/overall_header.html
--- 3.0.7-PL1.src/styles/subsilver2/template/overall_header.html	2010-03-05 14:37:00.000000000 -0600
+++ 3.0.8.src/styles/subsilver2/template/overall_header.html	2010-11-19 06:22:12.000000000 -0600
@@ -11,7 +11,7 @@
 <meta name="copyright" content="2000, 2002, 2005, 2007 phpBB Group" />
 <meta name="keywords" content="" />
 <meta name="description" content="" />
-<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />
+<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7; IE=EmulateIE9" />
 {META}
 <title>{SITENAME} &bull; <!-- IF S_IN_MCP -->{L_MCP} &bull; <!-- ELSEIF S_IN_UCP -->{L_UCP} &bull; <!-- ENDIF -->{PAGE_TITLE}</title>
 
@@ -201,8 +201,8 @@
 	<!-- IF S_DISPLAY_SEARCH -->
 	<p class="searchbar">
 		<span style="float: {S_CONTENT_FLOW_BEGIN};"><a href="{U_SEARCH_UNANSWERED}">{L_SEARCH_UNANSWERED}</a> | <a href="{U_SEARCH_ACTIVE_TOPICS}">{L_SEARCH_ACTIVE_TOPICS}</a></span>
-		<!-- IF S_USER_LOGGED_IN -->
-		<span style="float: {S_CONTENT_FLOW_END};"><a href="{U_SEARCH_UNREAD}">{L_SEARCH_UNREAD}</a> | <a href="{U_SEARCH_NEW}">{L_SEARCH_NEW}</a> | <a href="{U_SEARCH_SELF}">{L_SEARCH_SELF}</a></span>
+		<!-- IF S_USER_LOGGED_IN or S_LOAD_UNREADS -->
+		<span style="float: {S_CONTENT_FLOW_END};"><!-- IF S_LOAD_UNREADS --><a href="{U_SEARCH_UNREAD}">{L_SEARCH_UNREAD}</a><!-- IF S_USER_LOGGED_IN --> | <!-- ENDIF --><!-- ENDIF --><!-- IF S_USER_LOGGED_IN --><a href="{U_SEARCH_NEW}">{L_SEARCH_NEW}</a> | <a href="{U_SEARCH_SELF}">{L_SEARCH_SELF}</a><!-- ENDIF --></span>
 		<!-- ENDIF -->
 	</p>
 	<!-- ENDIF -->
diff -x .svn -aruN 3.0.7-PL1.src/styles/subsilver2/template/posting_body.html 3.0.8.src/styles/subsilver2/template/posting_body.html
--- 3.0.7-PL1.src/styles/subsilver2/template/posting_body.html	2010-03-05 14:36:59.000000000 -0600
+++ 3.0.8.src/styles/subsilver2/template/posting_body.html	2010-11-19 06:22:12.000000000 -0600
@@ -342,8 +342,8 @@
 		<td class="cat" colspan="2" align="center">
 			<input class="btnlite" type="submit" tabindex="5" name="preview" value="{L_PREVIEW}" />
 			&nbsp; <input class="btnmain" type="submit" accesskey="s" tabindex="6" name="post" value="{L_SUBMIT}" />
-			<!-- IF S_SAVE_ALLOWED -->&nbsp; <input class="btnlite" type="submit" accesskey="k" tabindex="7" name="save" value="{L_SAVE}" /><!-- ENDIF -->
-			<!-- IF S_HAS_DRAFTS -->&nbsp; <input class="btnlite" type="submit" accesskey="d" tabindex="8" name="load" value="{L_LOAD}" /><!-- ENDIF -->
+			<!-- IF S_SAVE_ALLOWED -->&nbsp; <input class="btnlite" type="submit" accesskey="k" tabindex="7" name="save" value="{L_SAVE_DRAFT}" /><!-- ENDIF -->
+			<!-- IF S_HAS_DRAFTS -->&nbsp; <input class="btnlite" type="submit" accesskey="d" tabindex="8" name="load" value="{L_LOAD_DRAFT}" /><!-- ENDIF -->
 			&nbsp; <input class="btnlite" type="submit" accesskey="c" tabindex="9" name="cancel" value="{L_CANCEL}" />
 		</td>
 	</tr>
@@ -365,8 +365,8 @@
 		<input class="btnlite" type="submit" tabindex="10" name="preview" value="{L_PREVIEW}" />
 		&nbsp; <input class="btnmain" type="submit" accesskey="s" tabindex="11" name="post" value="{L_SUBMIT}" />
 		<!-- IF not S_SHOW_ATTACH_BOX and not S_SHOW_POLL_BOX -->
-			<!-- IF S_SAVE_ALLOWED -->&nbsp; <input class="btnlite" type="submit" accesskey="k" tabindex="12" name="save" value="{L_SAVE}" /><!-- ENDIF -->
-			<!-- IF S_HAS_DRAFTS -->&nbsp; <input class="btnlite" type="submit" accesskey="d" tabindex="13" name="load" value="{L_LOAD}" /><!-- ENDIF -->
+			<!-- IF S_SAVE_ALLOWED -->&nbsp; <input class="btnlite" type="submit" accesskey="k" tabindex="12" name="save" value="{L_SAVE_DRAFT}" /><!-- ENDIF -->
+			<!-- IF S_HAS_DRAFTS -->&nbsp; <input class="btnlite" type="submit" accesskey="d" tabindex="13" name="load" value="{L_LOAD_DRAFT}" /><!-- ENDIF -->
 		<!-- ENDIF -->
 		&nbsp; <input class="btnlite" type="submit" accesskey="c" tabindex="14" name="cancel" value="{L_CANCEL}" />
 	</td>
diff -x .svn -aruN 3.0.7-PL1.src/styles/subsilver2/template/posting_buttons.html 3.0.8.src/styles/subsilver2/template/posting_buttons.html
--- 3.0.7-PL1.src/styles/subsilver2/template/posting_buttons.html	2010-03-05 14:37:00.000000000 -0600
+++ 3.0.8.src/styles/subsilver2/template/posting_buttons.html	2010-11-19 06:22:12.000000000 -0600
@@ -19,6 +19,7 @@
 			o: '{LA_BBCODE_O_HELP}',
 			p: '{LA_BBCODE_P_HELP}',
 			w: '{LA_BBCODE_W_HELP}',
+			a: '{LA_BBCODE_A_HELP}',
 			s: '{LA_BBCODE_S_HELP}',
 			f: '{LA_BBCODE_F_HELP}',
 			e: '{LA_BBCODE_E_HELP}',
@@ -44,7 +45,7 @@
 		<input type="button" class="btnbbcode" accesskey="c" name="addbbcode8" value="Code" style="width: 40px" onclick="bbstyle(8)" onmouseover="helpline('c')" onmouseout="helpline('tip')" />
 		<input type="button" class="btnbbcode" accesskey="l" name="addbbcode10" value="List" style="width: 40px" onclick="bbstyle(10)" onmouseover="helpline('l')" onmouseout="helpline('tip')" />
 		<input type="button" class="btnbbcode" accesskey="o" name="addbbcode12" value="List=" style="width: 40px" onclick="bbstyle(12)" onmouseover="helpline('o')" onmouseout="helpline('tip')" />
-		<input type="button" class="btnbbcode" accesskey="t" name="addlitsitem" value="[*]" style="width: 40px" onclick="bbstyle(-1)" onmouseover="helpline('e')" onmouseout="helpline('tip')" />				
+		<input type="button" class="btnbbcode" accesskey="y" name="addlitsitem" value="[*]" style="width: 40px" onclick="bbstyle(-1)" onmouseover="helpline('e')" onmouseout="helpline('tip')" />				
 		<!-- IF S_BBCODE_IMG -->
 			<input type="button" class="btnbbcode" accesskey="p" name="addbbcode14" value="Img" style="width: 40px" onclick="bbstyle(14)" onmouseover="helpline('p')" onmouseout="helpline('tip')" />
 		<!-- ENDIF -->
diff -x .svn -aruN 3.0.7-PL1.src/styles/subsilver2/template/posting_topic_review.html 3.0.8.src/styles/subsilver2/template/posting_topic_review.html
--- 3.0.7-PL1.src/styles/subsilver2/template/posting_topic_review.html	2010-03-05 14:37:00.000000000 -0600
+++ 3.0.8.src/styles/subsilver2/template/posting_topic_review.html	2010-11-19 06:22:12.000000000 -0600
@@ -1,3 +1,8 @@
+<script type="text/javascript">
+// <![CDATA[
+	bbcodeEnabled = {S_BBCODE_ALLOWED};
+// ]]>
+</script>
 
 <table class="tablebg" width="100%" cellspacing="1">
 <tr>
@@ -31,7 +36,7 @@
 						<td>&nbsp;</td>
 						<td class="gensmall" valign="middle" nowrap="nowrap"><b>{L_POST_SUBJECT}:</b>&nbsp;</td>
 						<td class="gensmall" width="100%" valign="middle">{topic_review_row.POST_SUBJECT}</td>
-						<td valign="top" nowrap="nowrap">&nbsp;<!-- IF topic_review_row.POSTER_QUOTE and topic_review_row.DECODED_MESSAGE --><a href="#" onclick="addquote({topic_review_row.POST_ID},'{topic_review_row.POSTER_QUOTE}'); return false;">{QUOTE_IMG}</a><!-- ENDIF --></td>
+						<td valign="top" nowrap="nowrap">&nbsp;<!-- IF topic_review_row.POSTER_QUOTE and topic_review_row.DECODED_MESSAGE --><a href="#" onclick="addquote({topic_review_row.POST_ID},'{topic_review_row.POSTER_QUOTE}', '{LA_WROTE}'); return false;">{QUOTE_IMG}</a><!-- ENDIF --></td>
 					</tr>
 					</table>
 				</td>
diff -x .svn -aruN 3.0.7-PL1.src/styles/subsilver2/template/search_body.html 3.0.8.src/styles/subsilver2/template/search_body.html
--- 3.0.7-PL1.src/styles/subsilver2/template/search_body.html	2010-03-05 14:36:59.000000000 -0600
+++ 3.0.8.src/styles/subsilver2/template/search_body.html	2010-11-19 06:22:12.000000000 -0600
@@ -75,4 +75,21 @@
 
 	<div align="{S_CONTENT_FLOW_END}"><!-- INCLUDE jumpbox.html --></div>
 
-<!-- INCLUDE overall_footer.html -->
\ No newline at end of file
+<script type="text/javascript">
+// <![CDATA[
+	(function()
+	{
+		var elements = document.getElementsByName("keywords");
+		for (var i = 0; i < elements.length; ++i)
+		{
+			if (elements[i].tagName.toLowerCase() == 'input')
+			{
+				elements[i].focus();
+				break;
+			}
+		}
+	})();
+// ]]>
+</script>
+
+<!-- INCLUDE overall_footer.html -->
diff -x .svn -aruN 3.0.7-PL1.src/styles/subsilver2/template/template.cfg 3.0.8.src/styles/subsilver2/template/template.cfg
--- 3.0.7-PL1.src/styles/subsilver2/template/template.cfg	2010-03-05 14:37:00.000000000 -0600
+++ 3.0.8.src/styles/subsilver2/template/template.cfg	2010-11-19 06:22:12.000000000 -0600
@@ -19,5 +19,5 @@
 # General Information about this template
 name = subsilver2
 copyright = &copy; phpBB Group, 2003
-version = 3.0.7
+version = 3.0.8
 
diff -x .svn -aruN 3.0.7-PL1.src/styles/subsilver2/template/ucp_pm_history.html 3.0.8.src/styles/subsilver2/template/ucp_pm_history.html
--- 3.0.7-PL1.src/styles/subsilver2/template/ucp_pm_history.html	2010-03-05 14:37:00.000000000 -0600
+++ 3.0.8.src/styles/subsilver2/template/ucp_pm_history.html	2010-11-19 06:22:12.000000000 -0600
@@ -1,7 +1,12 @@
+<script type="text/javascript">
+// <![CDATA[
+	bbcodeEnabled = {S_BBCODE_ALLOWED};
+// ]]>
+</script>
 
 <table class="tablebg" width="100%" cellspacing="1">
 <tr>
-	<th align="center">{L_MESSAGE_HISTORY} - {HISTORY_TITLE}</th>
+	<th align="center">{L_MESSAGE_HISTORY}</th>
 </tr>
 <tr>
 	<td class="row1"><div style="overflow: auto; width: 100%; height: 300px;">
@@ -54,7 +59,7 @@
 
 		<!-- IF history_row.S_ROW_COUNT is even --><tr class="row1"><!-- ELSE --><tr class="row2"><!-- ENDIF -->
 			<td class="gensmall"><a href="{history_row.U_VIEW_MESSAGE}">{L_VIEW_PM}</a></td>
-			<td><div class="gensmall" style="float: {S_CONTENT_FLOW_BEGIN};">&nbsp;<!-- IF history_row.U_PROFILE --><a href="{history_row.U_PROFILE}">{PROFILE_IMG}</a> <!-- ENDIF --> <!-- IF history_row.U_EMAIL --><a href="{history_row.U_EMAIL}">{EMAIL_IMG}</a> <!-- ENDIF -->&nbsp;</div> <div class="gensmall" style="float: {S_CONTENT_FLOW_END};"><!-- IF history_row.U_QUOTE or history_row.MESSAGE_AUTHOR_QUOTE --><a <!-- IF history_row.U_QUOTE -->href="{history_row.U_QUOTE}"<!-- ELSE -->href="#" onclick="addquote({history_row.MSG_ID}, '{history_row.MESSAGE_AUTHOR_QUOTE}'); return false;"<!-- ENDIF -->>{QUOTE_IMG}</a> <!-- ENDIF --> <!-- IF history_row.U_POST_REPLY_PM --><a href="{history_row.U_POST_REPLY_PM}">{REPLY_IMG}</a><!-- ENDIF -->&nbsp;</div></td>
+			<td><div class="gensmall" style="float: {S_CONTENT_FLOW_BEGIN};">&nbsp;<!-- IF history_row.U_PROFILE --><a href="{history_row.U_PROFILE}">{PROFILE_IMG}</a> <!-- ENDIF --> <!-- IF history_row.U_EMAIL --><a href="{history_row.U_EMAIL}">{EMAIL_IMG}</a> <!-- ENDIF -->&nbsp;</div> <div class="gensmall" style="float: {S_CONTENT_FLOW_END};"><!-- IF history_row.U_QUOTE or history_row.MESSAGE_AUTHOR_QUOTE --><a <!-- IF history_row.U_QUOTE -->href="{history_row.U_QUOTE}"<!-- ELSE -->href="#" onclick="addquote({history_row.MSG_ID}, '{history_row.MESSAGE_AUTHOR_QUOTE}', '{LA_WROTE}'); return false;"<!-- ENDIF -->>{QUOTE_IMG}</a> <!-- ENDIF --> <!-- IF history_row.U_POST_REPLY_PM --><a href="{history_row.U_POST_REPLY_PM}">{REPLY_IMG}</a><!-- ENDIF -->&nbsp;</div></td>
 		</tr>
 		<tr>
 			<td class="spacer" colspan="2"><img src="images/spacer.gif" alt="" width="1" height="1" /></td>
diff -x .svn -aruN 3.0.7-PL1.src/styles/subsilver2/template/ucp_pm_message_footer.html 3.0.8.src/styles/subsilver2/template/ucp_pm_message_footer.html
--- 3.0.7-PL1.src/styles/subsilver2/template/ucp_pm_message_footer.html	2010-03-05 14:37:00.000000000 -0600
+++ 3.0.8.src/styles/subsilver2/template/ucp_pm_message_footer.html	2010-11-19 06:22:12.000000000 -0600
@@ -14,6 +14,7 @@
 					<span class="gensmall">
 						<!-- IF U_PRINT_PM --><a href="{U_PRINT_PM}" title="{L_PRINT_PM}">{L_PRINT_PM}</a><!-- IF U_FORWARD_PM --> | <!-- ENDIF --><!-- ENDIF -->
 						<!-- IF U_FORWARD_PM --><a href="{U_FORWARD_PM}" title="{L_FORWARD_PM}">{L_FORWARD_PM}</a><!-- ENDIF -->
+						<!-- IF U_POST_REPLY_PM and S_PM_RECIPIENTS gt 1 --><!-- IF U_PRINT_PM or U_FORWARD_PM --> | <!-- ENDIF --><a title="{L_REPLY_TO_ALL}" href="{U_POST_REPLY_ALL}">{L_REPLY_TO_ALL}</a><!-- ENDIF -->
 					</span>
 				<!-- ENDIF -->
 			</td>
diff -x .svn -aruN 3.0.7-PL1.src/styles/subsilver2/template/ucp_pm_viewfolder.html 3.0.8.src/styles/subsilver2/template/ucp_pm_viewfolder.html
--- 3.0.7-PL1.src/styles/subsilver2/template/ucp_pm_viewfolder.html	2010-03-05 14:36:59.000000000 -0600
+++ 3.0.8.src/styles/subsilver2/template/ucp_pm_viewfolder.html	2010-11-19 06:22:12.000000000 -0600
@@ -81,6 +81,9 @@
 				<!-- ELSE -->
 					<a href="{messagerow.U_VIEW_PM}">{messagerow.SUBJECT}</a>
 				<!-- ENDIF -->
+				<!-- IF messagerow.S_PM_REPORTED -->
+					<a href="{messagerow.U_MCP_REPORT}">{REPORTED_IMG}</a>&nbsp;
+				<!-- ENDIF -->
 				<!-- IF messagerow.S_AUTHOR_DELETED -->
 					<br /><em class="gensmall">{L_PM_FROM_REMOVED_AUTHOR}</em>
 				<!-- ENDIF -->
diff -x .svn -aruN 3.0.7-PL1.src/styles/subsilver2/template/ucp_profile_signature.html 3.0.8.src/styles/subsilver2/template/ucp_profile_signature.html
--- 3.0.7-PL1.src/styles/subsilver2/template/ucp_profile_signature.html	2010-03-05 14:37:00.000000000 -0600
+++ 3.0.8.src/styles/subsilver2/template/ucp_profile_signature.html	2010-11-19 06:22:12.000000000 -0600
@@ -93,7 +93,7 @@
 	</td>
 </tr>
 
-<!-- IF SIGNATURE_PREVIEW -->
+<!-- IF SIGNATURE_PREVIEW != '' -->
 	<tr>
 		<th colspan="2" valign="middle">{L_SIGNATURE_PREVIEW}</th>
 	</tr>
diff -x .svn -aruN 3.0.7-PL1.src/styles/subsilver2/template/viewforum_body.html 3.0.8.src/styles/subsilver2/template/viewforum_body.html
--- 3.0.7-PL1.src/styles/subsilver2/template/viewforum_body.html	2010-03-05 14:36:59.000000000 -0600
+++ 3.0.8.src/styles/subsilver2/template/viewforum_body.html	2010-11-19 06:22:12.000000000 -0600
@@ -281,31 +281,31 @@
 		<td align="{S_CONTENT_FLOW_BEGIN}" valign="top">
 			<table cellspacing="3" cellpadding="0" border="0">
 			<tr>
-				<td width="20" style="text-align: center;">{FOLDER_NEW_IMG}</td>
-				<td class="gensmall">{L_NEW_POSTS}</td>
+				<td width="20" style="text-align: center;">{FOLDER_UNREAD_IMG}</td>
+				<td class="gensmall">{L_UNREAD_POSTS}</td>
 				<td>&nbsp;&nbsp;</td>
 				<td width="20" style="text-align: center;">{FOLDER_IMG}</td>
-				<td class="gensmall">{L_NO_NEW_POSTS}</td>
+				<td class="gensmall">{L_NO_UNREAD_POSTS}</td>
 				<td>&nbsp;&nbsp;</td>
 				<td width="20" style="text-align: center;">{FOLDER_ANNOUNCE_IMG}</td>
 				<td class="gensmall">{L_ICON_ANNOUNCEMENT}</td>
 			</tr>
 			<tr>
-				<td style="text-align: center;">{FOLDER_HOT_NEW_IMG}</td>
-				<td class="gensmall">{L_NEW_POSTS_HOT}</td>
+				<td style="text-align: center;">{FOLDER_HOT_UNREAD_IMG}</td>
+				<td class="gensmall">{L_UNREAD_POSTS_HOT}</td>
 				<td>&nbsp;&nbsp;</td>
 				<td style="text-align: center;">{FOLDER_HOT_IMG}</td>
-				<td class="gensmall">{L_NO_NEW_POSTS_HOT}</td>
+				<td class="gensmall">{L_NO_UNREAD_POSTS_HOT}</td>
 				<td>&nbsp;&nbsp;</td>
 				<td style="text-align: center;">{FOLDER_STICKY_IMG}</td>
 				<td class="gensmall">{L_ICON_STICKY}</td>
 			</tr>
 			<tr>
-				<td style="text-align: center;">{FOLDER_LOCKED_NEW_IMG}</td>
-				<td class="gensmall">{L_NEW_POSTS_LOCKED}</td>
+				<td style="text-align: center;">{FOLDER_LOCKED_UNREAD_IMG}</td>
+				<td class="gensmall">{L_UNREAD_POSTS_LOCKED}</td>
 				<td>&nbsp;&nbsp;</td>
 				<td style="text-align: center;">{FOLDER_LOCKED_IMG}</td>
-				<td class="gensmall">{L_NO_NEW_POSTS_LOCKED}</td>
+				<td class="gensmall">{L_NO_UNREAD_POSTS_LOCKED}</td>
 				<td>&nbsp;&nbsp;</td>
 				<td style="text-align: center;">{FOLDER_MOVED_IMG}</td>
 				<td class="gensmall">{L_TOPIC_MOVED}</td>
diff -x .svn -aruN 3.0.7-PL1.src/styles/subsilver2/template/viewtopic_body.html 3.0.8.src/styles/subsilver2/template/viewtopic_body.html
--- 3.0.7-PL1.src/styles/subsilver2/template/viewtopic_body.html	2010-03-05 14:36:59.000000000 -0600
+++ 3.0.8.src/styles/subsilver2/template/viewtopic_body.html	2010-11-19 06:22:12.000000000 -0600
@@ -238,7 +238,7 @@
 						<span class="gensmall error"><br /><br />{L_DOWNLOAD_NOTICE}</span>
 					<!-- ENDIF -->
 					<!-- IF postrow.SIGNATURE -->
-						<span class="postbody"><br />_________________<br />{postrow.SIGNATURE}</span>
+						<div class="postbody"><br />_________________<br />{postrow.SIGNATURE}</div>
 					<!-- ENDIF -->
 
 					<!-- IF postrow.EDITED_MESSAGE or postrow.EDIT_REASON -->
diff -x .svn -aruN 3.0.7-PL1.src/styles/subsilver2/theme/theme.cfg 3.0.8.src/styles/subsilver2/theme/theme.cfg
--- 3.0.7-PL1.src/styles/subsilver2/theme/theme.cfg	2010-03-05 14:37:00.000000000 -0600
+++ 3.0.8.src/styles/subsilver2/theme/theme.cfg	2010-11-19 06:22:12.000000000 -0600
@@ -21,7 +21,7 @@
 # General Information about this theme
 name = subsilver2
 copyright = &copy; phpBB Group, 2003
-version = 3.0.7
+version = 3.0.8
 
 # Some configuration options
 
diff -x .svn -aruN 3.0.7-PL1.src/ucp.php 3.0.8.src/ucp.php
--- 3.0.7-PL1.src/ucp.php	2010-03-05 14:36:59.000000000 -0600
+++ 3.0.8.src/ucp.php	2010-11-19 06:22:12.000000000 -0600
@@ -22,7 +22,7 @@
 $id 	= request_var('i', '');
 $mode	= request_var('mode', '');
 
-if ($mode == 'login' || $mode == 'logout' || $mode == 'confirm')
+if (in_array($mode, array('login', 'logout', 'confirm', 'sendpassword', 'activate')))
 {
 	define('IN_LOGIN', true);
 }
diff -x .svn -aruN 3.0.7-PL1.src/viewforum.php 3.0.8.src/viewforum.php
--- 3.0.7-PL1.src/viewforum.php	2010-03-05 14:36:57.000000000 -0600
+++ 3.0.8.src/viewforum.php	2010-11-19 06:22:12.000000000 -0600
@@ -151,7 +151,7 @@
 make_jumpbox(append_sid("{$phpbb_root_path}viewforum.$phpEx"), $forum_id);
 
 $template->assign_vars(array(
-	'U_VIEW_FORUM'			=> append_sid("{$phpbb_root_path}viewforum.$phpEx", "f=$forum_id&amp;start=$start"),
+	'U_VIEW_FORUM'			=> append_sid("{$phpbb_root_path}viewforum.$phpEx", "f=$forum_id" . (($start == 0) ? '' : "&amp;start=$start")),
 ));
 
 // Not postable forum or showing active topics?
@@ -273,16 +273,16 @@
 	'POST_IMG'					=> ($forum_data['forum_status'] == ITEM_LOCKED) ? $user->img('button_topic_locked', $post_alt) : $user->img('button_topic_new', $post_alt),
 	'NEWEST_POST_IMG'			=> $user->img('icon_topic_newest', 'VIEW_NEWEST_POST'),
 	'LAST_POST_IMG'				=> $user->img('icon_topic_latest', 'VIEW_LATEST_POST'),
-	'FOLDER_IMG'				=> $user->img('topic_read', 'NO_NEW_POSTS'),
-	'FOLDER_NEW_IMG'			=> $user->img('topic_unread', 'NEW_POSTS'),
-	'FOLDER_HOT_IMG'			=> $user->img('topic_read_hot', 'NO_NEW_POSTS_HOT'),
-	'FOLDER_HOT_NEW_IMG'		=> $user->img('topic_unread_hot', 'NEW_POSTS_HOT'),
-	'FOLDER_LOCKED_IMG'			=> $user->img('topic_read_locked', 'NO_NEW_POSTS_LOCKED'),
-	'FOLDER_LOCKED_NEW_IMG'		=> $user->img('topic_unread_locked', 'NEW_POSTS_LOCKED'),
+	'FOLDER_IMG'				=> $user->img('topic_read', 'NO_UNREAD_POSTS'),
+	'FOLDER_UNREAD_IMG'			=> $user->img('topic_unread', 'UNREAD_POSTS'),
+	'FOLDER_HOT_IMG'			=> $user->img('topic_read_hot', 'NO_UNREAD_POSTS_HOT'),
+	'FOLDER_HOT_UNREAD_IMG'		=> $user->img('topic_unread_hot', 'UNREAD_POSTS_HOT'),
+	'FOLDER_LOCKED_IMG'			=> $user->img('topic_read_locked', 'NO_UNREAD_POSTS_LOCKED'),
+	'FOLDER_LOCKED_UNREAD_IMG'	=> $user->img('topic_unread_locked', 'UNREAD_POSTS_LOCKED'),
 	'FOLDER_STICKY_IMG'			=> $user->img('sticky_read', 'POST_STICKY'),
-	'FOLDER_STICKY_NEW_IMG'		=> $user->img('sticky_unread', 'POST_STICKY'),
+	'FOLDER_STICKY_UNREAD_IMG'	=> $user->img('sticky_unread', 'POST_STICKY'),
 	'FOLDER_ANNOUNCE_IMG'		=> $user->img('announce_read', 'POST_ANNOUNCEMENT'),
-	'FOLDER_ANNOUNCE_NEW_IMG'	=> $user->img('announce_unread', 'POST_ANNOUNCEMENT'),
+	'FOLDER_ANNOUNCE_UNREAD_IMG'=> $user->img('announce_unread', 'POST_ANNOUNCEMENT'),
 	'FOLDER_MOVED_IMG'			=> $user->img('topic_moved', 'TOPIC_MOVED'),
 	'REPORTED_IMG'				=> $user->img('icon_topic_reported', 'TOPIC_REPORTED'),
 	'UNAPPROVED_IMG'			=> $user->img('icon_topic_unapproved', 'TOPIC_UNAPPROVED'),
@@ -302,7 +302,7 @@
 	'S_WATCH_FORUM_LINK'	=> $s_watching_forum['link'],
 	'S_WATCH_FORUM_TITLE'	=> $s_watching_forum['title'],
 	'S_WATCHING_FORUM'		=> $s_watching_forum['is_watching'],
-	'S_FORUM_ACTION'		=> append_sid("{$phpbb_root_path}viewforum.$phpEx", "f=$forum_id&amp;start=$start"),
+	'S_FORUM_ACTION'		=> append_sid("{$phpbb_root_path}viewforum.$phpEx", "f=$forum_id" . (($start == 0) ? '' : "&amp;start=$start")),
 	'S_DISPLAY_SEARCHBOX'	=> ($auth->acl_get('u_search') && $auth->acl_get('f_search', $forum_id) && $config['load_search']) ? true : false,
 	'S_SEARCHBOX_ACTION'	=> append_sid("{$phpbb_root_path}search.$phpEx", 'fid[]=' . $forum_id),
 	'S_SINGLE_MODERATOR'	=> (!empty($moderators[$forum_id]) && sizeof($moderators[$forum_id]) > 1) ? false : true,
@@ -311,7 +311,7 @@
 
 	'U_MCP'				=> ($auth->acl_get('m_', $forum_id)) ? append_sid("{$phpbb_root_path}mcp.$phpEx", "f=$forum_id&amp;i=main&amp;mode=forum_view", true, $user->session_id) : '',
 	'U_POST_NEW_TOPIC'	=> ($auth->acl_get('f_post', $forum_id) || $user->data['user_id'] == ANONYMOUS) ? append_sid("{$phpbb_root_path}posting.$phpEx", 'mode=post&amp;f=' . $forum_id) : '',
-	'U_VIEW_FORUM'		=> append_sid("{$phpbb_root_path}viewforum.$phpEx", "f=$forum_id" . ((strlen($u_sort_param)) ? "&amp;$u_sort_param" : '') . "&amp;start=$start"),
+	'U_VIEW_FORUM'		=> append_sid("{$phpbb_root_path}viewforum.$phpEx", "f=$forum_id" . ((strlen($u_sort_param)) ? "&amp;$u_sort_param" : '') . (($start == 0) ? '' : "&amp;start=$start")),
 	'U_MARK_TOPICS'		=> ($user->data['is_registered'] || $config['load_anon_lastread']) ? append_sid("{$phpbb_root_path}viewforum.$phpEx", 'hash=' . generate_link_hash('global') . "&amp;f=$forum_id&amp;mark=topics") : '',
 ));
 
@@ -508,6 +508,7 @@
 			'topic_moved_id'	=> $rowset[$orig_topic_id]['topic_moved_id'],
 			'topic_status'		=> $rowset[$orig_topic_id]['topic_status'],
 			'topic_type'		=> $rowset[$orig_topic_id]['topic_type'],
+			'topic_title'		=> $rowset[$orig_topic_id]['topic_title'],
 		));
 
 		// Shadow topics are never reported
@@ -592,12 +593,14 @@
 	{
 		$row = &$rowset[$topic_id];
 
+		$topic_forum_id = ($row['forum_id']) ? (int) $row['forum_id'] : $forum_id;
+
 		// This will allow the style designer to output a different header
 		// or even separate the list of announcements from sticky and normal topics
 		$s_type_switch_test = ($row['topic_type'] == POST_ANNOUNCE || $row['topic_type'] == POST_GLOBAL) ? 1 : 0;
 
 		// Replies
-		$replies = ($auth->acl_get('m_approve', $forum_id)) ? $row['topic_replies_real'] : $row['topic_replies'];
+		$replies = ($auth->acl_get('m_approve', $topic_forum_id)) ? $row['topic_replies_real'] : $row['topic_replies'];
 
 		if ($row['topic_status'] == ITEM_MOVED)
 		{
@@ -614,16 +617,16 @@
 		topic_status($row, $replies, $unread_topic, $folder_img, $folder_alt, $topic_type);
 
 		// Generate all the URIs ...
-		$view_topic_url_params = 'f=' . (($row['forum_id']) ? $row['forum_id'] : $forum_id) . '&amp;t=' . $topic_id;
+		$view_topic_url_params = 'f=' . $topic_forum_id . '&amp;t=' . $topic_id;
 		$view_topic_url = append_sid("{$phpbb_root_path}viewtopic.$phpEx", $view_topic_url_params);
 
-		$topic_unapproved = (!$row['topic_approved'] && $auth->acl_get('m_approve', (($row['forum_id']) ? $row['forum_id'] : $forum_id))) ? true : false;
-		$posts_unapproved = ($row['topic_approved'] && $row['topic_replies'] < $row['topic_replies_real'] && $auth->acl_get('m_approve', (($row['forum_id']) ? $row['forum_id'] : $forum_id))) ? true : false;
+		$topic_unapproved = (!$row['topic_approved'] && $auth->acl_get('m_approve', $topic_forum_id)) ? true : false;
+		$posts_unapproved = ($row['topic_approved'] && $row['topic_replies'] < $row['topic_replies_real'] && $auth->acl_get('m_approve', $topic_forum_id)) ? true : false;
 		$u_mcp_queue = ($topic_unapproved || $posts_unapproved) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=queue&amp;mode=' . (($topic_unapproved) ? 'approve_details' : 'unapproved_posts') . "&amp;t=$topic_id", true, $user->session_id) : '';
 
 		// Send vars to template
 		$template->assign_block_vars('topicrow', array(
-			'FORUM_ID'					=> $forum_id,
+			'FORUM_ID'					=> $topic_forum_id,
 			'TOPIC_ID'					=> $topic_id,
 			'TOPIC_AUTHOR'				=> get_username_string('username', $row['topic_poster'], $row['topic_first_poster_name'], $row['topic_first_poster_colour']),
 			'TOPIC_AUTHOR_COLOUR'		=> get_username_string('colour', $row['topic_poster'], $row['topic_first_poster_name'], $row['topic_first_poster_colour']),
@@ -651,13 +654,13 @@
 			'TOPIC_ICON_IMG'		=> (!empty($icons[$row['icon_id']])) ? $icons[$row['icon_id']]['img'] : '',
 			'TOPIC_ICON_IMG_WIDTH'	=> (!empty($icons[$row['icon_id']])) ? $icons[$row['icon_id']]['width'] : '',
 			'TOPIC_ICON_IMG_HEIGHT'	=> (!empty($icons[$row['icon_id']])) ? $icons[$row['icon_id']]['height'] : '',
-			'ATTACH_ICON_IMG'		=> ($auth->acl_get('u_download') && $auth->acl_get('f_download', $forum_id) && $row['topic_attachment']) ? $user->img('icon_topic_attach', $user->lang['TOTAL_ATTACHMENTS']) : '',
+			'ATTACH_ICON_IMG'		=> ($auth->acl_get('u_download') && $auth->acl_get('f_download', $topic_forum_id) && $row['topic_attachment']) ? $user->img('icon_topic_attach', $user->lang['TOTAL_ATTACHMENTS']) : '',
 			'UNAPPROVED_IMG'		=> ($topic_unapproved || $posts_unapproved) ? $user->img('icon_topic_unapproved', ($topic_unapproved) ? 'TOPIC_UNAPPROVED' : 'POSTS_UNAPPROVED') : '',
 
 			'S_TOPIC_TYPE'			=> $row['topic_type'],
 			'S_USER_POSTED'			=> (isset($row['topic_posted']) && $row['topic_posted']) ? true : false,
 			'S_UNREAD_TOPIC'		=> $unread_topic,
-			'S_TOPIC_REPORTED'		=> (!empty($row['topic_reported']) && $auth->acl_get('m_report', $forum_id)) ? true : false,
+			'S_TOPIC_REPORTED'		=> (!empty($row['topic_reported']) && $auth->acl_get('m_report', $topic_forum_id)) ? true : false,
 			'S_TOPIC_UNAPPROVED'	=> $topic_unapproved,
 			'S_POSTS_UNAPPROVED'	=> $posts_unapproved,
 			'S_HAS_POLL'			=> ($row['poll_start']) ? true : false,
@@ -672,7 +675,7 @@
 			'U_LAST_POST_AUTHOR'	=> get_username_string('profile', $row['topic_last_poster_id'], $row['topic_last_poster_name'], $row['topic_last_poster_colour']),
 			'U_TOPIC_AUTHOR'		=> get_username_string('profile', $row['topic_poster'], $row['topic_first_poster_name'], $row['topic_first_poster_colour']),
 			'U_VIEW_TOPIC'			=> $view_topic_url,
-			'U_MCP_REPORT'			=> append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=reports&amp;mode=reports&amp;f=' . $forum_id . '&amp;t=' . $topic_id, true, $user->session_id),
+			'U_MCP_REPORT'			=> append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=reports&amp;mode=reports&amp;f=' . $topic_forum_id . '&amp;t=' . $topic_id, true, $user->session_id),
 			'U_MCP_QUEUE'			=> $u_mcp_queue,
 
 			'S_TOPIC_TYPE_SWITCH'	=> ($s_type_switch == $s_type_switch_test) ? -1 : $s_type_switch_test)
diff -x .svn -aruN 3.0.7-PL1.src/viewtopic.php 3.0.8.src/viewtopic.php
--- 3.0.7-PL1.src/viewtopic.php	2010-03-05 14:36:59.000000000 -0600
+++ 3.0.8.src/viewtopic.php	2010-11-19 06:22:12.000000000 -0600
@@ -477,7 +477,7 @@
 }
 
 // General Viewtopic URL for return links
-$viewtopic_url = append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&amp;t=$topic_id&amp;start=$start" . ((strlen($u_sort_param)) ? "&amp;$u_sort_param" : '') . (($highlight_match) ? "&amp;hilit=$highlight" : ''));
+$viewtopic_url = append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&amp;t=$topic_id" . (($start == 0) ? '' : "&amp;start=$start") . ((strlen($u_sort_param)) ? "&amp;$u_sort_param" : '') . (($highlight_match) ? "&amp;hilit=$highlight" : ''));
 
 // Are we watching this topic?
 $s_watching_topic = array(
@@ -601,7 +601,7 @@
 	'PAGINATION' 	=> $pagination,
 	'PAGE_NUMBER' 	=> on_page($total_posts, $config['posts_per_page'], $start),
 	'TOTAL_POSTS'	=> ($total_posts == 1) ? $user->lang['VIEW_TOPIC_POST'] : sprintf($user->lang['VIEW_TOPIC_POSTS'], $total_posts),
-	'U_MCP' 		=> ($auth->acl_get('m_', $forum_id)) ? append_sid("{$phpbb_root_path}mcp.$phpEx", "i=main&amp;mode=topic_view&amp;f=$forum_id&amp;t=$topic_id&amp;start=$start" . ((strlen($u_sort_param)) ? "&amp;$u_sort_param" : ''), true, $user->session_id) : '',
+	'U_MCP' 		=> ($auth->acl_get('m_', $forum_id)) ? append_sid("{$phpbb_root_path}mcp.$phpEx", "i=main&amp;mode=topic_view&amp;f=$forum_id&amp;t=$topic_id" . (($start == 0) ? '' : "&amp;start=$start") . ((strlen($u_sort_param)) ? "&amp;$u_sort_param" : ''), true, $user->session_id) : '',
 	'MODERATORS'	=> (isset($forum_moderators[$forum_id]) && sizeof($forum_moderators[$forum_id])) ? implode(', ', $forum_moderators[$forum_id]) : '',
 
 	'POST_IMG' 			=> ($topic_data['forum_status'] == ITEM_LOCKED) ? $user->img('button_topic_locked', 'FORUM_LOCKED') : $user->img('button_topic_new', 'POST_NEW_TOPIC'),
@@ -630,9 +630,9 @@
 	'S_SELECT_SORT_KEY' 	=> $s_sort_key,
 	'S_SELECT_SORT_DAYS' 	=> $s_limit_days,
 	'S_SINGLE_MODERATOR'	=> (!empty($forum_moderators[$forum_id]) && sizeof($forum_moderators[$forum_id]) > 1) ? false : true,
-	'S_TOPIC_ACTION' 		=> append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&amp;t=$topic_id&amp;start=$start"),
+	'S_TOPIC_ACTION' 		=> append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&amp;t=$topic_id" . (($start == 0) ? '' : "&amp;start=$start")),
 	'S_TOPIC_MOD' 			=> ($topic_mod != '') ? '<select name="action" id="quick-mod-select">' . $topic_mod . '</select>' : '',
-	'S_MOD_ACTION' 			=> append_sid("{$phpbb_root_path}mcp.$phpEx", "f=$forum_id&amp;t=$topic_id&amp;start=$start&amp;quickmod=1&amp;redirect=" . urlencode(str_replace('&amp;', '&', $viewtopic_url)), true, $user->session_id),
+	'S_MOD_ACTION' 			=> append_sid("{$phpbb_root_path}mcp.$phpEx", "f=$forum_id&amp;t=$topic_id" . (($start == 0) ? '' : "&amp;start=$start") . "&amp;quickmod=1&amp;redirect=" . urlencode(str_replace('&amp;', '&', $viewtopic_url)), true, $user->session_id),
 
 	'S_VIEWTOPIC'			=> true,
 	'S_DISPLAY_SEARCHBOX'	=> ($auth->acl_get('u_search') && $auth->acl_get('f_search', $forum_id) && $config['load_search']) ? true : false,
@@ -722,7 +722,7 @@
 
 		if (!sizeof($voted_id) || sizeof($voted_id) > $topic_data['poll_max_options'] || in_array(VOTE_CONVERTED, $cur_voted_id) || !check_form_key('posting'))
 		{
-			$redirect_url = append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&amp;t=$topic_id&amp;start=$start");
+			$redirect_url = append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&amp;t=$topic_id" . (($start == 0) ? '' : "&amp;start=$start"));
 
 			meta_refresh(5, $redirect_url);
 			if (!sizeof($voted_id))
@@ -805,7 +805,7 @@
 		//, topic_last_post_time = ' . time() . " -- for bumping topics with new votes, ignore for now
 		$db->sql_query($sql);
 
-		$redirect_url = append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&amp;t=$topic_id&amp;start=$start");
+		$redirect_url = append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&amp;t=$topic_id" . (($start == 0) ? '' : "&amp;start=$start"));
 
 		meta_refresh(5, $redirect_url);
 		trigger_error($user->lang['VOTE_SUBMITTED'] . '<br /><br />' . sprintf($user->lang['RETURN_TOPIC'], '<a href="' . $redirect_url . '">', '</a>'));
@@ -1146,7 +1146,7 @@
 
 			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']);
 
-			if (!empty($row['user_allow_viewemail']) || $auth->acl_get('a_email'))
+			if ((!empty($row['user_allow_viewemail']) && $auth->acl_get('u_sendemail')) || $auth->acl_get('a_email'))
 			{
 				$user_cache[$poster_id]['email'] = ($config['board_email_form'] && $config['email_enable']) ? append_sid("{$phpbb_root_path}memberlist.$phpEx", "mode=email&amp;u=$poster_id") : (($config['board_hide_emails'] && !$auth->acl_get('a_email')) ? '' : 'mailto:' . $row['user_email']);
 			}
@@ -1513,7 +1513,7 @@
 		'EDIT_REASON'		=> $row['post_edit_reason'],
 		'BUMPED_MESSAGE'	=> $l_bumped_by,
 
-		'MINI_POST_IMG'			=> ($post_unread) ? $user->img('icon_post_target_unread', 'NEW_POST') : $user->img('icon_post_target', 'POST'),
+		'MINI_POST_IMG'			=> ($post_unread) ? $user->img('icon_post_target_unread', 'UNREAD_POST') : $user->img('icon_post_target', 'POST'),
 		'POST_ICON_IMG'			=> ($topic_data['enable_icons'] && !empty($row['icon_id'])) ? $icons[$row['icon_id']]['img'] : '',
 		'POST_ICON_IMG_WIDTH'	=> ($topic_data['enable_icons'] && !empty($row['icon_id'])) ? $icons[$row['icon_id']]['width'] : '',
 		'POST_ICON_IMG_HEIGHT'	=> ($topic_data['enable_icons'] && !empty($row['icon_id'])) ? $icons[$row['icon_id']]['height'] : '',
diff -x .svn -aruN 3.0.7-PL1.src/web.config 3.0.8.src/web.config
--- 3.0.7-PL1.src/web.config	1969-12-31 18:00:00.000000000 -0600
+++ 3.0.8.src/web.config	2010-11-19 06:22:12.000000000 -0600
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration>
+	<system.webServer>
+		<security>
+			<requestFiltering>
+				<hiddenSegments>
+					<add segment="cache" />
+					<add segment="files" />
+					<add segment="store" />­
+					<add segment="config.php" />
+					<add segment="common.php" />
+				</hiddenSegments>
+			</requestFiltering>
+		</security>
+	</system.webServer>
+	<location path="images/avatars">
+		<system.webServer>
+			<security>
+				<requestFiltering>
+					<hiddenSegments>
+						<add segment="upload" />
+					</hiddenSegments>
+				</requestFiltering>
+			</security>
+		</system.webServer>
+	</location>
+</configuration>
