Index: .hgsubstate
===================================================================
--- .hgsubstate	(revision 1258)
+++ .hgsubstate	(revision 1387)
@@ -1,1 +1,1 @@
-4a0351ee5d566a83ff06ca8bc9fffeb99885f545 inc/libs/clearbricks
+4288bdc1f21d00f93331bbe098485727b276c1fe inc/libs/clearbricks
Index: .hgtags
===================================================================
--- .hgtags	(revision 1219)
+++ .hgtags	(revision 1351)
@@ -13,2 +13,3 @@
 514d5121a12586b7ff320924d44028b677a01020 2.4.4
 baf879af43beea9764d920c2facd7226e90c5cf3 2.5.1
+cfad9f2a9f6ec03206ff5db91985208e833a7528 2.5.2
Index: CHANGELOG
===================================================================
--- CHANGELOG	(revision 1216)
+++ CHANGELOG	(revision 1350)
@@ -1,2 +1,19 @@
+Dotclear 2.5.2 - 2013-08-14
+===========================================================
+* Security fix: Fixed potential XSS
+* Bugfix: l10n Clearbricks library
+* <tpl:LoopPosition> now works <tpl:Attachments>
+* Dotclear update check may now be forced (ignoring cache)
+* Enforce integration of daInstaller plugin
+* Tags link button is now available on page editor
+* Default cache age is now 1 week instead of 2 hours
+* Quick entry dashboard module is not activated by default on new installation
+* New template {{tpl:BlogParentThemeURL}} (return URL of parent theme of blog's theme if any, URL of blog's theme otherwise)
+* Fix post comments number on comments deletion
+* Fix order of backup files
+* Minor enhancements
+* Various bug fixes
+* Various cosmetic adjustments
+
 Dotclear 2.5.1 - 2013-07-20
 ===========================================================
Index: admin/blog.php
===================================================================
--- admin/blog.php	(revision 1179)
+++ admin/blog.php	(revision 1277)
@@ -74,5 +74,4 @@
 	'<form action="blog.php" method="post" id="blog-form" class="fieldset">'.
 	
-	$core->formNonce().
 	'<p><label class="required"><abbr title="'.__('Required field').'">*</abbr> '.__('Blog ID:').' '.
 	form::field('blog_id',30,32,html::escapeHTML($blog_id)).'</label></p>'.
@@ -89,5 +88,7 @@
 	form::textarea('blog_desc',60,5,html::escapeHTML($blog_desc)).'</p>'.
 	
-	'<p><input type="submit" accesskey="s" value="'.__('Create').'" /></p>'.
+	'<p><input type="submit" accesskey="s" value="'.__('Create').'" />'.
+	$core->formNonce().
+	'</p>'.
 	'</form>';
 
Index: admin/blog_del.php
===================================================================
--- admin/blog_del.php	(revision 1179)
+++ admin/blog_del.php	(revision 1288)
@@ -49,5 +49,5 @@
 }
 
-dcPage::open('Delete a blog');
+dcPage::open(__('Delete a blog'));
 
 if (!$core->error->flag())
Index: admin/blog_theme.php
===================================================================
--- admin/blog_theme.php	(revision 1179)
+++ admin/blog_theme.php	(revision 1263)
@@ -332,5 +332,5 @@
 	echo
 	'<h2>'.html::escapeHTML($core->blog->name).
-	' &rsaquo; <a href="blog_theme.php">'.__('Blog appearance').'</a> &rsaquo; <span class="page-title">'.__('Theme configuration').'<span class="page-title"></h2>'.
+	' &rsaquo; <a href="blog_theme.php">'.__('Blog appearance').'</a> &rsaquo; <span class="page-title">'.__('Theme configuration').'</span></h2>'.
 	'<p><a class="back" href="blog_theme.php">'.__('back').'</a></p>';
 	
Index: admin/categories.php
===================================================================
--- admin/categories.php	(revision 1179)
+++ admin/categories.php	(revision 1421)
@@ -31,5 +31,5 @@
 		$mov_cat = $mov_cat ? $mov_cat : null;
 		if ($mov_cat !== null) {
-			$c = $core->blog->getCategory((integer) $_POST['del_cat']);
+			$c = $core->blog->getCategory((integer) $_POST['mov_cat']);
 			if ($c->isEmpty()) {
 				throw new Exception(__('This category does not exist.'));
@@ -141,4 +141,15 @@
 echo '</div>';
 
+$categories_combo = array();
+if (!$rs->isEmpty())
+{
+	while ($rs->fetch()) {
+		$catparents_combo[] = $categories_combo[] = new formSelectOption(
+			str_repeat('&nbsp;&nbsp;',$rs->level-1).($rs->level-1 == 0 ? '' : '&bull; ').html::escapeHTML($rs->cat_title),
+			$rs->cat_id
+		);
+	}
+}
+
 echo '<div class="col">'.
 
@@ -146,15 +157,8 @@
 '<fieldset><legend>'.__('Add a new category').'</legend>'.
 '<p><label class="required" for="cat_title"><abbr title="'.__('Required field').'">*</abbr> '.__('Title:').' '.
-form::field('cat_title',30,255).'</label></p>'.
+form::field('cat_title',30,255,'','maximal').'</label></p>'.
 '<p><label for="new_cat_parent">'.__('Parent:').' '.
-'<select id="new_cat_parent" name="new_cat_parent">'.
-'<option value="0">'.__('Top level').'</option>';
-while ($rs->fetch()) {
-	echo '<option value="'.$rs->cat_id.'">'.
-		str_repeat('&nbsp;&nbsp;',$rs->level-1).($rs->level-1 == 0 ? '' : '&bull; ').
-		html::escapeHTML($rs->cat_title).'</option>';
-}
-echo
-'</select></label></p>'.
+form::combo('new_cat_parent',array_merge(array(__('(No cat)') => 0),$categories_combo),'','maximal').
+'</label></p>'.
 '<p><input type="submit" value="'.__('Create').'" /></p>'.
 $core->formNonce().
@@ -164,30 +168,11 @@
 if (!$rs->isEmpty())
 {
-	$cats = array();
-	$dest = array('&nbsp;' => '');
-	$l = $rs->level;
-	$full_name = array($rs->cat_title);
-	while ($rs->fetch())
-	{
-		if ($rs->level < $l) {
-			$full_name = array();
-		} elseif ($rs->level == $l) {
-			array_pop($full_name);
-		}
-		$full_name[] = html::escapeHTML($rs->cat_title);
-		
-		$cats[implode(' / ',$full_name)] = $rs->cat_id;
-		$dest[implode(' / ',$full_name)] = $rs->cat_id;
-		
-		$l = $rs->level;
-	}
-	
 	echo
 	'<form action="categories.php" method="post" id="delete-category">'.
 	'<fieldset><legend>'.__('Remove a category').'</legend>'.
 	'<p><label for="del_cat">'.__('Choose a category to remove:').' '.
-	form::combo('del_cat',$cats).'</label></p> '.
+	form::combo('del_cat',$categories_combo,'','maximal').'</label></p> '.
 	'<p><label for="mov_cat">'.__('And choose the category which will receive its entries:').' '.
-	form::combo('mov_cat',$dest).'</label></p> '.
+	form::combo('mov_cat',array_merge(array(__('(No cat)') => ''),$categories_combo),'','maximal').'</label></p> '.
 	'<p><input type="submit" value="'.__('Delete').'" class="delete" /></p>'.
 	$core->formNonce().
Index: admin/index.php
===================================================================
--- admin/index.php	(revision 1247)
+++ admin/index.php	(revision 1421)
@@ -304,16 +304,18 @@
 	if ($core->auth->check('usage,contentadmin',$core->blog->id))
 	{
-		$categories_combo = array('&nbsp;' => '');
+		# Getting categories
+		$categories_combo = array(__('(No cat)') => '');
 		try {
 			$categories = $core->blog->getCategories(array('post_type'=>'post'));
-			while ($categories->fetch()) {
-				$categories_combo[] = new formSelectOption(
-					str_repeat('&nbsp;&nbsp;',$categories->level-1).
-					($categories->level-1 == 0 ? '' : '&bull; ').html::escapeHTML($categories->cat_title),
-					$categories->cat_id
-				);
+			if (!$categories->isEmpty()) {
+				while ($categories->fetch()) {
+					$catparents_combo[] = $categories_combo[] = new formSelectOption(
+						str_repeat('&nbsp;&nbsp;',$categories->level-1).($categories->level-1 == 0 ? '' : '&bull; ').html::escapeHTML($categories->cat_title),
+						$categories->cat_id
+					);
+				}
 			}
 		} catch (Exception $e) { }
-	
+		
 		echo
 		'<div id="quick">'.
@@ -330,4 +332,14 @@
 		'<p><label for="cat_id" class="classic">'.__('Category:').' '.
 		form::combo('cat_id',$categories_combo).'</label></p>'.
+		($core->auth->check('categories', $core->blog->id)
+			? '<div>'.
+			'<p id="new_cat">'.__('Add a new category').'</p>'.
+			'<p><label for="new_cat_title">'.__('Title:').' '.
+			form::field('new_cat_title',30,255,'','maximal').'</label></p>'.
+			'<p><label for="new_cat_parent">'.__('Parent:').' '.
+			form::combo('new_cat_parent',$categories_combo,'','maximal').
+			'</label></p>'.
+			'</div>'
+			: '').
 		'<p><input type="submit" value="'.__('Save').'" name="save" /> '.
 		($core->auth->check('publish',$core->blog->id)
Index: admin/js/_index.js
===================================================================
--- admin/js/_index.js	(revision 1140)
+++ admin/js/_index.js	(revision 1418)
@@ -61,4 +61,8 @@
 			});
 		}
+		$('#new_cat').toggleWithLegend(
+			$('#new_cat').parent().children().not('#new_cat'),
+			{} // no cookie on new category as we don't use this every day
+		);
 	}
 
Index: admin/js/_post.js
===================================================================
--- admin/js/_post.js	(revision 1256)
+++ admin/js/_post.js	(revision 1417)
@@ -123,4 +123,8 @@
 			hide: $('#post_notes').val() == ''
 		});
+		$('#new_cat').toggleWithLegend(
+			$('#new_cat').parent().children().not('#new_cat'),
+			{} // no cookie on new category as we don't use this every day
+		);
 		$('#post_lang').parent().toggleWithLegend($('#post_lang'),{
 			cookie: 'dcx_post_lang'
Index: admin/js/_posts_actions.js
===================================================================
--- admin/js/_posts_actions.js	(revision 1035)
+++ admin/js/_posts_actions.js	(revision 1419)
@@ -6,3 +6,7 @@
 		matchContains: true
 	});
+	$('#new_cat').toggleWithLegend(
+		$('#new_cat').parent().children().not('#new_cat'),
+		{} // no cookie on new category as we don't use this every day
+	);
 });
Index: admin/js/_users_actions.js
===================================================================
--- admin/js/_users_actions.js	(revision 935)
+++ admin/js/_users_actions.js	(revision 1432)
@@ -1,4 +1,5 @@
 jQuery.fn.updatePermissionsForm = function() {
 	return this.each(function() {
+		
 		var perms = {};
 		var re = /^perm\[(.+?)\]\[(.+?)\]$/;
@@ -12,4 +13,5 @@
 				continue;
 			}
+			var prop;
 			prop = e.name.match(re);
 			if (!prop) {
@@ -20,35 +22,48 @@
 			}
 			perms[prop[1]][prop[2]] = e;
-		}
-		
-		// Update elements status
-		var E;
-		for (blog in perms) {
-			for (perm in perms[blog]) {
-				E = perms[blog][perm];
-				E.onclick = function() {};
-				
-				if (perm == 'admin' && !E.disabled) {
-					perms[blog]['usage'].disabled = E.checked;
-					perms[blog]['publish'].disabled = E.checked;
-					perms[blog]['delete'].disabled = E.checked;
-					perms[blog]['contentadmin'].disabled = E.checked;
-					perms[blog]['categories'].disabled = E.checked;
-					perms[blog]['media'].disabled = E.checked;
-					perms[blog]['media_admin'].disabled = E.checked;
-					E.onclick = function() { $(this.form).updatePermissionsForm(); };
-				} else if (perm == 'contentadmin' && !E.disabled) {
-					perms[blog]['usage'].checked = E.checked;
-					perms[blog]['publish'].checked = E.checked;
-					perms[blog]['delete'].checked = E.checked;
-					perms[blog]['usage'].disabled = E.checked;
-					perms[blog]['publish'].disabled = E.checked;
-					perms[blog]['delete'].disabled = E.checked;
-					E.onclick = function() { $(this.form).updatePermissionsForm(); };
-				} else if (perm == 'media_admin' && !E.disabled) {
-					perms[blog]['media'].checked = E.checked;
-					perms[blog]['media'].disabled = E.checked;
-					E.onclick = function() { $(this.form).updatePermissionsForm(); };
-				}
+			
+			// select related permissions for admin
+			if (prop[2] == 'admin') {
+				$(e).click(function(){
+					P = this.name.match(re);
+					
+					perms[P[1]]['usage'].checked = this.checked;
+					perms[P[1]]['publish'].checked = this.checked;
+					perms[P[1]]['delete'].checked = this.checked;
+					perms[P[1]]['contentadmin'].checked = this.checked;
+					perms[P[1]]['categories'].checked = this.checked;
+					perms[P[1]]['media'].checked = this.checked;
+					perms[P[1]]['media_admin'].checked = this.checked;
+					perms[P[1]]['usage'].disabled = this.checked;
+					perms[P[1]]['publish'].disabled = this.checked;
+					perms[P[1]]['delete'].disabled = this.checked;
+					perms[P[1]]['contentadmin'].disabled = this.checked;
+					perms[P[1]]['categories'].disabled = this.checked;
+					perms[P[1]]['media'].disabled = this.checked;
+					perms[P[1]]['media_admin'].disabled = this.checked;
+					
+				});
+			// select related permissions for content admin
+			} else if (prop[2] == 'contentadmin') {
+				$(e).click(function(){
+					P = this.name.match(re);
+					
+					perms[P[1]]['usage'].checked = this.checked;
+					perms[P[1]]['publish'].checked = this.checked;
+					perms[P[1]]['delete'].checked = this.checked;
+					perms[P[1]]['usage'].disabled = this.checked;
+					perms[P[1]]['publish'].disabled = this.checked;
+					perms[P[1]]['delete'].disabled = this.checked;
+					
+				});
+			// select related permissions for media admin
+			} else if (prop[2] == 'media_admin') {
+				$(e).click(function(){
+					P = this.name.match(re);
+					
+					perms[P[1]]['media'].checked = this.checked;
+					perms[P[1]]['media'].disabled = this.checked;
+					
+				});
 			}
 		}
Index: admin/js/jquery/jquery.pwstrength.js
===================================================================
--- admin/js/jquery/jquery.pwstrength.js	(revision 1371)
+++ admin/js/jquery/jquery.pwstrength.js	(revision 1371)
@@ -0,0 +1,66 @@
+/**
+ * jquery.pwstrength http://matoilic.github.com/jquery.pwstrength
+ *
+ * @version v0.1.1
+ * @author Mato Ilic <info@matoilic.ch>
+ * @copyright 2013 Mato Ilic
+ *
+ * Dual licensed under the MIT and GPL licenses:
+ * http://www.opensource.org/licenses/mit-license.php
+ * http://www.gnu.org/licenses/gpl.html
+ */
+;(function($) {
+    $.pwstrength = function(password) {
+        var score = 0, length = password.length, upperCase, lowerCase, digits, nonAlpha;
+        
+        if(length < 5) score += 0;
+        else if(length < 8) score += 5;
+        else if(length < 16) score += 10;
+        else score += 15;
+        
+        lowerCase = password.match(/[a-z]/g);
+        if(lowerCase) score += 1;
+        
+        upperCase = password.match(/[A-Z]/g);
+        if(upperCase) score += 5;
+        
+        if(upperCase && lowerCase) score += 2;
+        
+        digits = password.match(/\d/g);
+        if(digits && digits.length > 1) score += 5;
+        
+        nonAlpha = password.match(/\W/g)
+        if(nonAlpha) score += (nonAlpha.length > 1) ? 15 : 10;
+        
+        if(upperCase && lowerCase && digits && nonAlpha) score += 15;
+
+        if(password.match(/\s/)) score += 10;
+
+        if(score < 15) return 0;
+        if(score < 20) return 1;
+        if(score < 35) return 2;
+        if(score < 50) return 3;
+        return 4;
+    };
+    
+    function updateIndicator(event) {
+        var strength = $.pwstrength($(this).val()), options = event.data, klass;
+        klass = options.classes[strength];
+        
+        options.indicator.removeClass(options.indicator.data('pwclass'));
+        options.indicator.data('pwclass', klass);
+        options.indicator.addClass(klass);
+        options.indicator.find(options.label).html(options.texts[strength]);
+    }
+    
+    $.fn.pwstrength = function(options) {
+        var options = $.extend({
+            label: '.label',
+            classes: ['pw-very-weak', 'pw-weak', 'pw-mediocre', 'pw-strong', 'pw-very-strong'],
+            texts: ['very weak', 'weak', 'mediocre', 'strong', 'very strong']
+        }, options || {});
+        options.indicator = $('#' + this.data('indicator'));
+        
+        return this.keyup(options, updateIndicator);
+    };
+})(jQuery);
Index: admin/plugins.php
===================================================================
--- admin/plugins.php	(revision 1238)
+++ admin/plugins.php	(revision 1271)
@@ -233,4 +233,5 @@
 		'<a href="plugin.php?p=daInstaller">'.__('DotAddict.org Installer').'</a>'));
 
+echo '<p>';
 if ($is_writable) {
 	echo __('To install or upgrade a plugin you generally just need to upload it '.
Index: admin/post.php
===================================================================
--- admin/post.php	(revision 1215)
+++ admin/post.php	(revision 1421)
@@ -49,16 +49,4 @@
 	$post_status = -2;
 }
-
-# Getting categories
-$categories_combo = array('&nbsp;' => '');
-try {
-	$categories = $core->blog->getCategories(array('post_type'=>'post'));
-	while ($categories->fetch()) {
-		$categories_combo[] = new formSelectOption(
-			str_repeat('&nbsp;&nbsp;',$categories->level-1).($categories->level-1 == 0 ? '' : '&bull; ').html::escapeHTML($categories->cat_title),
-			$categories->cat_id
-		);
-	}
-} catch (Exception $e) { }
 
 # Status combo
@@ -218,4 +206,22 @@
 if (!empty($_POST) && !empty($_POST['save']) && $can_edit_post && !$bad_dt)
 {
+	# Create category
+	if (!empty($_POST['new_cat_title']) && $core->auth->check('categories', $core->blog->id)) {
+	
+		$cur_cat = $core->con->openCursor($core->prefix.'category');
+		$cur_cat->cat_title = $_POST['new_cat_title'];
+		$cur_cat->cat_url = '';
+		
+		$parent_cat = !empty($_POST['new_cat_parent']) ? $_POST['new_cat_parent'] : '';
+		
+		# --BEHAVIOR-- adminBeforeCategoryCreate
+		$core->callBehavior('adminBeforeCategoryCreate', $cur_cat);
+		
+		$cat_id = $core->blog->addCategory($cur_cat, (integer) $parent_cat);
+		
+		# --BEHAVIOR-- adminAfterCategoryCreate
+		$core->callBehavior('adminAfterCategoryCreate', $cur_cat, $cat_id);
+	}
+	
 	$cur = $core->con->openCursor($core->prefix.'post');
 	
@@ -284,4 +290,18 @@
 }
 
+# Getting categories
+$categories_combo = array(__('(No cat)') => '');
+try {
+	$categories = $core->blog->getCategories(array('post_type'=>'post'));
+	if (!$categories->isEmpty()) {
+		while ($categories->fetch()) {
+			$catparents_combo[] = $categories_combo[] = new formSelectOption(
+				str_repeat('&nbsp;&nbsp;',$categories->level-1).($categories->level-1 == 0 ? '' : '&bull; ').html::escapeHTML($categories->cat_title),
+				$categories->cat_id
+			);
+		}
+	}
+} catch (Exception $e) { }
+
 /* DISPLAY
 -------------------------------------------------------- */
@@ -334,5 +354,5 @@
 }
 
-echo '<h2>'.html::escapeHTML($core->blog->name).' &rsaquo; '.'<a href="posts.php">'.__('Entries').'</a> &rsaquo; <span class="page-title">'.$page_title;
+echo '<h2>'.html::escapeHTML($core->blog->name).' &rsaquo; '.'<a href="posts.php">'.__('Entries').'</a> &rsaquo; <span class="page-title">';
 if ($post_id) {
 	switch ($post_status) {
@@ -352,5 +372,8 @@
 			$img_status = '';
 	}
-	echo ' &ldquo;'.$post_title.'&rdquo;'.' '.$img_status;
+	$edit_entry_str = __('Edit entry &ldquo;%s&rdquo;');
+	echo sprintf($edit_entry_str, html::escapeHTML($post_title)).' '.$img_status;
+} else {
+	echo $page_title;
 }
 echo	'</span></h2>';
@@ -440,4 +463,15 @@
 	'</label></p>'.
 	
+	($core->auth->check('categories', $core->blog->id) ?
+		'<div>'.
+		'<p id="new_cat">'.__('Add a new category').'</p>'.
+		'<p><label for="new_cat_title">'.__('Title:').' '.
+		form::field('new_cat_title',30,255,'','maximal').'</label></p>'.
+		'<p><label for="new_cat_parent">'.__('Parent:').' '.
+		form::combo('new_cat_parent',$categories_combo,'','maximal').
+		'</label></p>'.
+		'</div>'
+	: '').
+	
 	'<p><label for="post_status">'.__('Entry status:').
 	form::combo('post_status',$status_combo,$post_status,'','',!$can_publish).
Index: admin/posts_actions.php
===================================================================
--- admin/posts_actions.php	(revision 1179)
+++ admin/posts_actions.php	(revision 1421)
@@ -16,4 +16,5 @@
 
 $params = array();
+$action = '';
 
 /* Actions
@@ -126,7 +127,26 @@
 	elseif ($action == 'category' && isset($_POST['new_cat_id']))
 	{
-		try
-		{
-			$core->blog->updPostsCategory($posts_ids,$_POST['new_cat_id']);
+		$new_cat_id = $_POST['new_cat_id'];
+		
+		try
+		{
+			if (!empty($_POST['new_cat_title']) && $core->auth->check('categories', $core->blog->id))
+			{
+				$cur_cat = $core->con->openCursor($core->prefix.'category');
+				$cur_cat->cat_title = $_POST['new_cat_title'];
+				$cur_cat->cat_url = '';
+				
+				$parent_cat = !empty($_POST['new_cat_parent']) ? $_POST['new_cat_parent'] : '';
+				
+				# --BEHAVIOR-- adminBeforeCategoryCreate
+				$core->callBehavior('adminBeforeCategoryCreate', $cur_cat);
+				
+				$new_cat_id = $core->blog->addCategory($cur_cat, (integer) $parent_cat);
+				
+				# --BEHAVIOR-- adminAfterCategoryCreate
+				$core->callBehavior('adminAfterCategoryCreate', $cur_cat, $new_cat_id);
+			}
+			
+			$core->blog->updPostsCategory($posts_ids, $new_cat_id);
 			
 			http::redirect($redir);
@@ -246,15 +266,15 @@
 	echo '<h2 class="page-title">'.__('Change category for entries').'</h2>';
 	
-	# categories list
 	# Getting categories
-	$categories_combo = array('&nbsp;' => '');
+	$categories_combo = array(__('(No cat)') => '');
 	try {
 		$categories = $core->blog->getCategories(array('post_type'=>'post'));
-		while ($categories->fetch()) {
-			$categories_combo[] = new formSelectOption(
-				str_repeat('&nbsp;&nbsp;',$categories->level-1).
-				($categories->level-1 == 0 ? '' : '&bull; ').html::escapeHTML($categories->cat_title),
-				$categories->cat_id
-			);
+		if (!$categories->isEmpty()) {
+			while ($categories->fetch()) {
+				$catparents_combo[] = $categories_combo[] = new formSelectOption(
+					str_repeat('&nbsp;&nbsp;',$categories->level-1).($categories->level-1 == 0 ? '' : '&bull; ').html::escapeHTML($categories->cat_title),
+					$categories->cat_id
+				);
+			}
 		}
 	} catch (Exception $e) { }
@@ -265,4 +285,16 @@
 	form::combo('new_cat_id',$categories_combo,'').
 	'</label> ';
+	
+	if ($core->auth->check('categories', $core->blog->id)) {
+		echo 
+		'<div>'.
+		'<p id="new_cat">'.__('Add a new category').'</p>'.
+		'<p><label for="new_cat_title">'.__('Title:').' '.
+		form::field('new_cat_title',30,255,'','maximal').'</label></p>'.
+		'<p><label for="new_cat_parent">'.__('Parent:').' '.
+		form::combo('new_cat_parent',$categories_combo,'','maximal').
+		'</label></p>'.
+		'</div>';
+	}
 	
 	echo
Index: admin/preferences.php
===================================================================
--- admin/preferences.php	(revision 1179)
+++ admin/preferences.php	(revision 1375)
@@ -344,4 +344,17 @@
 	($user_acc_nodragdrop ? '' : dcPage::jsLoad('js/_preferences-dragdrop.js')).
 	dcPage::jsLoad('js/jquery/jquery-ui.custom.js').
+	dcPage::jsLoad('js/jquery/jquery.pwstrength.js').
+		'<script type="text/javascript">'."\n".
+		"//<![CDATA[\n".
+		"\$(function() {\n".
+		"	\$('#new_pwd').pwstrength({texts: ['".
+				sprintf(__('Password strength: %s'),__('very weak'))."', '".
+				sprintf(__('Password strength: %s'),__('weak'))."', '".
+				sprintf(__('Password strength: %s'),__('mediocre'))."', '".
+				sprintf(__('Password strength: %s'),__('strong'))."', '".
+				sprintf(__('Password strength: %s'),__('very strong'))."']});\n".
+		"});\n".
+		"\n//]]>\n".
+		"</script>\n".
 	dcPage::jsPageTabs($default_tab).
 	dcPage::jsConfirmClose('user-form').
@@ -416,14 +429,20 @@
 	'<legend>'.__('Change your password').'</legend>'.
 	
-	'<p><label for="new_pwd">'.__('New password:').
-	form::password('new_pwd',20,255).'</label></p>'.
+	'<div class="pw-table">'.
+	'<p class="pw-cell"><label for="new_pwd">'.__('New password:').'</label>'.
+	form::password('new_pwd',20,255,'','','',false,' data-indicator="pwindicator" ').'</p>'.
+    '<div id="pwindicator">'.
+    '    <div class="bar"></div>'.
+    '    <p class="label no-margin"></p>'.
+    '</div>'.
+    '</div>'.
 	
-	'<p><label for="new_pwd_c">'.__('Confirm password:').
-	form::password('new_pwd_c',20,255).'</label></p>'.
+	'<p><label for="new_pwd_c">'.__('Confirm password:').'</label>'.
+	form::password('new_pwd_c',20,255).'</p>'.
 	'</fieldset>'.
 	
 	'<p>'.__('If you have changed this user email or password you must provide your current password to save these modifications.').'</p>'.
-	'<p><label for="cur_pwd">'.__('Your password:').
-	form::password('cur_pwd',20,255).'</label></p>';
+	'<p><label for="cur_pwd">'.__('Your password:').'</label>'.
+	form::password('cur_pwd',20,255).'</p>';
 }
 
Index: admin/search.php
===================================================================
--- admin/search.php	(revision 1179)
+++ admin/search.php	(revision 1276)
@@ -79,5 +79,5 @@
 '<p><label for="qtype1" class="classic">'.form::radio(array('qtype','qtype1'),'p',$qtype == 'p').' '.__('Search entries').'</label> '.
 '<label for="qtype2" class="classic">'.form::radio(array('qtype','qtype2'),'c',$qtype == 'c').' '.__('Search comments').'</label></p>'.
-'</p><input type="submit" value="'.__('Search').'" /></p>'.
+'<p><input type="submit" value="'.__('Search').'" /></p>'.
 '</div>'.
 '</form>';
Index: admin/style/default.css
===================================================================
--- admin/style/default.css	(revision 1179)
+++ admin/style/default.css	(revision 1375)
@@ -901,5 +901,4 @@
 	margin: 0;
 }
-
 /* paragraphe pour bouton Nouveau bidule */
 p.top-add {
@@ -1384,2 +1383,42 @@
 	color: white;
 }
+
+/* --------------------------------------------------------------- password indcator */
+.pw-table {
+	display: table;
+	margin-bottom: 1em;
+}
+.pw-cell {
+	display: table-cell;
+	margin-bottom: 1em;
+}
+#pwindicator {
+	display: table-cell;
+	vertical-align: bottom;
+	padding-left: 1.5em;
+	height: 3.8em;
+}
+#pwindicator .bar {
+	height: 6px;
+	margin-bottom: 4px;
+}
+.pw-very-weak .bar {
+	background: #900;
+	width: 30px;
+}
+.pw-weak .bar {
+	background: #c00;
+	width: 60px;
+}
+.pw-mediocre .bar {
+	background: #f60;
+	width: 90px;
+}
+.pw-strong .bar {
+	background: #060;
+	width: 120px;
+}
+.pw-very-strong .bar {
+	background: #0c0;
+	width: 150px;
+}
Index: admin/update.php
===================================================================
--- admin/update.php	(revision 1231)
+++ admin/update.php	(revision 1287)
@@ -54,5 +54,5 @@
 }
 if (!empty($archives)) {
-	$archives = array_reverse($archives);
+	usort($archives,"version_compare");
 } else {
 	$default_tab = 'update';
@@ -216,5 +216,4 @@
 		
 		echo	'<form action="'.$p_url.'" method="post">';
-		
 		foreach ($archives as $v) {
 			echo
Index: inc/admin/lib.dc.page.php
===================================================================
--- inc/admin/lib.dc.page.php	(revision 1256)
+++ inc/admin/lib.dc.page.php	(revision 1384)
@@ -160,5 +160,5 @@
 		if ($core->error->flag()) {
 			echo
-			'<div class="error"><p><strong>'.(count($core->error->getErrors()) > 1 ? __('Errors:') : __('Error:')).'</p></strong>'.
+			'<div class="error"><p><strong>'.(count($core->error->getErrors()) > 1 ? __('Errors:') : __('Error:')).'</strong></p>'.
 			$core->error->toHTML().
 			'</div>';
Index: inc/admin/lib.pager.php
===================================================================
--- inc/admin/lib.pager.php	(revision 1179)
+++ inc/admin/lib.pager.php	(revision 1364)
@@ -87,5 +87,5 @@
 			html::escapeHTML($this->rs->cat_title));
 		} else {
-			$cat_title = __('None');
+			$cat_title = __('(No cat)');
 		}
 		
Index: inc/core/class.dc.blog.php
===================================================================
--- inc/core/class.dc.blog.php	(revision 1262)
+++ inc/core/class.dc.blog.php	(revision 1429)
@@ -645,18 +645,55 @@
 	private function checkCategory($title,$url,$id=null)
 	{
-		$strReq = 'SELECT cat_id '.
-				'FROM '.$this->prefix.'category '.
-				"WHERE cat_url = '".$this->con->escape($url)."' ".
-				"AND blog_id = '".$this->con->escape($this->id)."' ";
-		
-		if ($id !== null) {
-			$strReq .= 'AND cat_id <> '.(integer) $id.' ';
-		}
+		# Let's check if URL is taken...
+		$strReq = 
+			'SELECT cat_url FROM '.$this->prefix.'category '.
+			"WHERE cat_url = '".$this->con->escape($url)."' ".
+			($id ? 'AND cat_id <> '.(integer) $id. ' ' : '').
+			"AND blog_id = '".$this->con->escape($this->id)."' ".
+			'ORDER BY cat_url DESC';
 		
 		$rs = $this->con->select($strReq);
 		
-		if (!$rs->isEmpty()) {
-			throw new Exception(__('Category URL must be unique.'));
-		}
+		if (!$rs->isEmpty())
+		{
+			if ($this->con->driver() == 'mysql') {
+				$clause = "REGEXP '^".$this->con->escape($url)."[0-9]+$'";
+			} elseif ($this->con->driver() == 'pgsql') {
+				$clause = "~ '^".$this->con->escape($url)."[0-9]+$'";
+			} else {
+				$clause = "LIKE '".$this->con->escape($url)."%'";
+			}
+			$strReq = 
+				'SELECT cat_url FROM '.$this->prefix.'category '.
+				"WHERE cat_url ".$clause.' '.
+				($id ? 'AND cat_id <> '.(integer) $id. ' ' : '').
+				"AND blog_id = '".$this->con->escape($this->id)."' ".
+				'ORDER BY cat_url DESC ';
+			
+			$rs = $this->con->select($strReq);
+			$a = array();
+			while ($rs->fetch()) {
+				$a[] = $rs->cat_url;
+			}
+			
+			natsort($a);
+			$t_url = end($a);
+			
+			if (preg_match('/(.*?)([0-9]+)$/',$t_url,$m)) {
+				$i = (integer) $m[2];
+				$url = $m[1];
+			} else {
+				$i = 1;
+			}
+			
+			return $url.($i+1);
+		}
+		
+		# URL is empty?
+		if ($url == '') {
+			throw new Exception(__('Empty category URL'));
+		}
+		
+		return $url;
 	}
 	
@@ -680,5 +717,5 @@
 		
 		# Check if title or url are unique
-		$this->checkCategory($cur->cat_title,$cur->cat_url,$id);
+		$cur->cat_url = $this->checkCategory($cur->cat_title,$cur->cat_url,$id);
 		
 		if ($cur->cat_desc !== null) {
Index: inc/core/class.dc.media.php
===================================================================
--- inc/core/class.dc.media.php	(revision 1220)
+++ inc/core/class.dc.media.php	(revision 1381)
@@ -30,4 +30,5 @@
 	
 	public $thumb_tp = '%s/.%s_%s.jpg';	///< <b>string</b> Thumbnail file pattern
+	public $thumb_tp_alpha = '%s/.%s_%s.png'; ///< <b>string</b> Thumbnail file pattern (with alpha layer)
 	
 	/**
@@ -298,6 +299,7 @@
 			$f->media_thumb = array();
 			$p = path::info($f->relname);
-			$thumb = sprintf($this->thumb_tp,$this->root.'/'.$p['dirname'],$p['base'],'%s');
-			$thumb_url = sprintf($this->thumb_tp,$this->root_url.$p['dirname'],$p['base'],'%s');
+			$alpha = ($p['extension'] == 'png') || ($p['extension'] == 'PNG');
+			$thumb = sprintf(($alpha ? $this->thumb_tp_alpha : $this->thumb_tp),$this->root.'/'.$p['dirname'],$p['base'],'%s');
+			$thumb_url = sprintf(($alpha ? $this->thumb_tp_alpha : $this->thumb_tp),$this->root_url.$p['dirname'],$p['base'],'%s');
 			
 			# Cleaner URLs
@@ -497,7 +499,8 @@
 	@param	post_id	<b>integer</b>		Post ID
 	@param	media_id	<b>integer</b>		Optionnal media ID
-	@return	<b>array</b> Array of fileItems
-	*/
-	public function getPostMedia($post_id,$media_id=null)
+	@param	return_rs	<b>boolean</b>		Whether to return a resultset (true) or an array (false, default value).
+	@return	<b>array</b> Array or ResultSet of fileItems
+	*/
+	public function getPostMedia($post_id,$media_id=null,$return_rs=false)
 	{
 		$params = array(
@@ -515,9 +518,9 @@
 			$f = $this->fileRecord($rs);
 			if ($f !== null) {
-				$res[] = new ArrayObject($f);
-			}
-		}
-		
-		return $res;
+				$res[] = $return_rs ? new ArrayObject($f) : $f;
+			}
+		}
+		
+		return $return_rs ? staticRecord::newFromArray($res) : $res;
 	}
 	
@@ -920,5 +923,6 @@
 		
 		$p = path::info($file);
-		$thumb = sprintf($this->thumb_tp,$p['dirname'],$p['base'],'%s');
+		$alpha = ($p['extension'] == 'png') || ($p['extension'] == 'PNG');
+		$thumb = sprintf(($alpha ? $this->thumb_tp_alpha : $this->thumb_tp),$p['dirname'],$p['base'],'%s');
 		
 		try
@@ -939,5 +943,5 @@
 					$rate = ($s[0] < 100 ? 95 : ($s[0] < 600 ? 90 : 85));
 					$img->resize($s[0],$s[0],$s[1]);
-					$img->output('jpeg',$thumb_file,$rate);
+					$img->output(($alpha ? 'png' : 'jpeg'),$thumb_file,$rate);
 					$img->loadImage($file);
 				}
@@ -958,8 +962,10 @@
 		{
 			$p = path::info($file->relname);
-			$thumb_old = sprintf($this->thumb_tp,$p['dirname'],$p['base'],'%s');
+			$alpha = ($p['extension'] == 'png') || ($p['extension'] == 'PNG');
+			$thumb_old = sprintf(($alpha ? $this->thumb_tp_alpha : $this->thumb_tp),$p['dirname'],$p['base'],'%s');
 			
 			$p = path::info($newFile->relname);
-			$thumb_new = sprintf($this->thumb_tp,$p['dirname'],$p['base'],'%s');
+			$alpha = ($p['extension'] == 'png') || ($p['extension'] == 'PNG');
+			$thumb_new = sprintf(($alpha ? $this->thumb_tp_alpha : $this->thumb_tp),$p['dirname'],$p['base'],'%s');
 			
 			foreach ($this->thumb_sizes as $suffix => $s) {
@@ -974,5 +980,6 @@
 	{
 		$p = path::info($f);
-		$thumb = sprintf($this->thumb_tp,'',$p['base'],'%s');
+		$alpha = ($p['extension'] == 'png') || ($p['extension'] == 'PNG');
+		$thumb = sprintf(($alpha ? $this->thumb_tp_alpha : $this->thumb_tp),'',$p['base'],'%s');
 		
 		foreach ($this->thumb_sizes as $suffix => $s) {
Index: inc/prepend.php
===================================================================
--- inc/prepend.php	(revision 1233)
+++ inc/prepend.php	(revision 1352)
@@ -123,5 +123,5 @@
 # Constants
 define('DC_ROOT',path::real(dirname(__FILE__).'/..'));
-define('DC_VERSION','2.5.2-dev');
+define('DC_VERSION','2.5.3-dev');
 define('DC_DIGESTS',dirname(__FILE__).'/digests');
 define('DC_L10N_ROOT',dirname(__FILE__).'/../locales');
Index: locales/bn/help/blowupConfig.html
===================================================================
--- locales/bn/help/blowupConfig.html	(revision 0)
+++ locales/bn/help/blowupConfig.html	(revision 1264)
@@ -35,5 +35,5 @@
 <p>You can choose a header image among the list to use in place of the default one.</p>
 
-<p>When you choose "Custom..." in the image list, you will be able to upload your own image. <strong>The image file must be in JPG or PNG format and must be precisely 800px wide.</strong>
+<p>When you choose "Custom..." in the image list, you will be able to upload your own image. <strong>The image file must be in JPG or PNG format and must be precisely 800px wide.</strong></p>
 
 <p>If you upload a JPG image, a border will be added to the image, which is not the case with PNG images (the transparency of which will also be kept).</p>
Index: locales/ca/help/blowupConfig.html
===================================================================
--- locales/ca/help/blowupConfig.html	(revision 0)
+++ locales/ca/help/blowupConfig.html	(revision 1264)
@@ -35,5 +35,5 @@
 <p>You can choose a header image among the list to use in place of the default one.</p>
 
-<p>When you choose "Custom..." in the image list, you will be able to upload your own image. <strong>The image file must be in JPG or PNG format and must be precisely 800px wide.</strong>
+<p>When you choose "Custom..." in the image list, you will be able to upload your own image. <strong>The image file must be in JPG or PNG format and must be precisely 800px wide.</strong></p>
 
 <p>If you upload a JPG image, a border will be added to the image, which is not the case with PNG images (the transparency of which will also be kept).</p>
Index: locales/cs/help/blowupConfig.html
===================================================================
--- locales/cs/help/blowupConfig.html	(revision 0)
+++ locales/cs/help/blowupConfig.html	(revision 1264)
@@ -35,5 +35,5 @@
 <p>You can choose a header image among the list to use in place of the default one.</p>
 
-<p>When you choose "Custom..." in the image list, you will be able to upload your own image. <strong>The image file must be in JPG or PNG format and must be precisely 800px wide.</strong>
+<p>When you choose "Custom..." in the image list, you will be able to upload your own image. <strong>The image file must be in JPG or PNG format and must be precisely 800px wide.</strong></p>
 
 <p>If you upload a JPG image, a border will be added to the image, which is not the case with PNG images (the transparency of which will also be kept).</p>
Index: locales/da/help/blowupConfig.html
===================================================================
--- locales/da/help/blowupConfig.html	(revision 0)
+++ locales/da/help/blowupConfig.html	(revision 1264)
@@ -35,5 +35,5 @@
 <p>You can choose a header image among the list to use in place of the default one.</p>
 
-<p>When you choose "Custom..." in the image list, you will be able to upload your own image. <strong>The image file must be in JPG or PNG format and must be precisely 800px wide.</strong>
+<p>When you choose "Custom..." in the image list, you will be able to upload your own image. <strong>The image file must be in JPG or PNG format and must be precisely 800px wide.</strong></p>
 
 <p>If you upload a JPG image, a border will be added to the image, which is not the case with PNG images (the transparency of which will also be kept).</p>
Index: locales/de/help/blowupConfig.html
===================================================================
--- locales/de/help/blowupConfig.html	(revision 175)
+++ locales/de/help/blowupConfig.html	(revision 1264)
@@ -35,5 +35,5 @@
 <p>Du kannst ein Bild Deiner Wahl statt des Standardbildes einsetzen.</p>
 
-<p>Wenn Du  "Benutzerdefiniert..." in der Bilderliste ausw&auml;hlst, dann hast Du die M&ouml;glichkeit, Dein eigenes Bild upzuloaden. <strong>Das Dateiformat muss entweder JPG der PNG sein und es muss 800px breit sein.</strong>
+<p>Wenn Du  "Benutzerdefiniert..." in der Bilderliste ausw&auml;hlst, dann hast Du die M&ouml;glichkeit, Dein eigenes Bild upzuloaden. <strong>Das Dateiformat muss entweder JPG der PNG sein und es muss 800px breit sein.</strong></p>
 
 <p>Wenn Du ein JPG-Bild uploadest, dann wird automatisch ein Rahmen um das Bild gesetzt. Dies geschieht nicht bei der Verwendung eines PNG-Bildes und die Transparenz wird ebenfalls beibehalten.</p>
Index: locales/en/main.po
===================================================================
--- locales/en/main.po	(revision 1256)
+++ locales/en/main.po	(revision 1364)
@@ -2790,2 +2790,5 @@
 msgid "The following error was encountered while trying to read the database:"
 msgstr ""
+
+msgid "(No cat)"
+msgstr "(none)"
Index: locales/eo/help/blowupConfig.html
===================================================================
--- locales/eo/help/blowupConfig.html	(revision 0)
+++ locales/eo/help/blowupConfig.html	(revision 1264)
@@ -35,5 +35,5 @@
 <p>You can choose a header image among the list to use in place of the default one.</p>
 
-<p>When you choose "Custom..." in the image list, you will be able to upload your own image. <strong>The image file must be in JPG or PNG format and must be precisely 800px wide.</strong>
+<p>When you choose "Custom..." in the image list, you will be able to upload your own image. <strong>The image file must be in JPG or PNG format and must be precisely 800px wide.</strong></p>
 
 <p>If you upload a JPG image, a border will be added to the image, which is not the case with PNG images (the transparency of which will also be kept).</p>
Index: locales/es-ar/help/blowupConfig.html
===================================================================
--- locales/es-ar/help/blowupConfig.html	(revision 0)
+++ locales/es-ar/help/blowupConfig.html	(revision 1264)
@@ -35,5 +35,5 @@
 <p>You can choose a header image among the list to use in place of the default one.</p>
 
-<p>When you choose "Custom..." in the image list, you will be able to upload your own image. <strong>The image file must be in JPG or PNG format and must be precisely 800px wide.</strong>
+<p>When you choose "Custom..." in the image list, you will be able to upload your own image. <strong>The image file must be in JPG or PNG format and must be precisely 800px wide.</strong></p>
 
 <p>If you upload a JPG image, a border will be added to the image, which is not the case with PNG images (the transparency of which will also be kept).</p>
Index: locales/es/help/blowupConfig.html
===================================================================
--- locales/es/help/blowupConfig.html	(revision 0)
+++ locales/es/help/blowupConfig.html	(revision 1264)
@@ -35,5 +35,5 @@
 <p>You can choose a header image among the list to use in place of the default one.</p>
 
-<p>When you choose "Custom..." in the image list, you will be able to upload your own image. <strong>The image file must be in JPG or PNG format and must be precisely 800px wide.</strong>
+<p>When you choose "Custom..." in the image list, you will be able to upload your own image. <strong>The image file must be in JPG or PNG format and must be precisely 800px wide.</strong></p>
 
 <p>If you upload a JPG image, a border will be added to the image, which is not the case with PNG images (the transparency of which will also be kept).</p>
Index: locales/eu/help/blowupConfig.html
===================================================================
--- locales/eu/help/blowupConfig.html	(revision 0)
+++ locales/eu/help/blowupConfig.html	(revision 1264)
@@ -35,5 +35,5 @@
 <p>You can choose a header image among the list to use in place of the default one.</p>
 
-<p>When you choose "Custom..." in the image list, you will be able to upload your own image. <strong>The image file must be in JPG or PNG format and must be precisely 800px wide.</strong>
+<p>When you choose "Custom..." in the image list, you will be able to upload your own image. <strong>The image file must be in JPG or PNG format and must be precisely 800px wide.</strong></p>
 
 <p>If you upload a JPG image, a border will be added to the image, which is not the case with PNG images (the transparency of which will also be kept).</p>
Index: locales/fr/help/blowupConfig.html
===================================================================
--- locales/fr/help/blowupConfig.html	(revision 0)
+++ locales/fr/help/blowupConfig.html	(revision 1264)
@@ -44,5 +44,5 @@
 <p>En choisissant "Personnalisé..." parmi la liste d'images, vous pourrez
 déposer votre propre image. <strong>Celle-ci doit être au format JPG ou PNG et
-avoir une largeur exacte de 800 pixels.</strong>
+avoir une largeur exacte de 800 pixels.</strong></p>
 
 <p>Si vous déposez une image au format JPG, un cadre sera ajouté autours de
Index: locales/fr/main.po
===================================================================
--- locales/fr/main.po	(revision 1256)
+++ locales/fr/main.po	(revision 1397)
@@ -1579,4 +1579,7 @@
 msgstr "Modifier le billet"
 
+msgid "Edit entry &ldquo;%s&rdquo;"
+msgstr "Modifier le billet &ldquo;%s&rdquo;"
+
 msgid "next entry"
 msgstr "billet suivant"
@@ -2207,5 +2210,5 @@
 
 msgid "Users with posts cannot be deleted."
-msgstr "Les utilisateurs ayant écrit des billets ne peuvent être effacées."
+msgstr "Les utilisateurs ayant écrit des billets ne peuvent être supprimés."
 
 #, php-format
@@ -2937,2 +2940,23 @@
 msgid "Invalid publication date"
 msgstr "Date de publication invalide"
+
+msgid "(No cat)"
+msgstr "(aucune)"
+
+msgid "Password strength: %s"
+msgstr "Force du mot de passe : %s"
+
+msgid "very weak"
+msgstr "très faible"
+
+msgid "weak"
+msgstr "faible"
+
+msgid "mediocre"
+msgstr "moyen"
+
+msgid "strong"
+msgstr "fort"
+
+msgid "very strong"
+msgstr "très fort"
Index: locales/fr/plugins.po
===================================================================
--- locales/fr/plugins.po	(revision 1226)
+++ locales/fr/plugins.po	(revision 1445)
@@ -1017,8 +1017,8 @@
 "différente. Vous pouvez assigner plusieurs catégories à un seul poste dans "
 "WordPress. Dans le monde Dotclear, nous le voyons davantage comme « une "
-"catégorie, plusieurs mot-clés ». Par conséquent Dotclear peut seulement "
+"catégorie, plusieurs mots-clés ». Par conséquent Dotclear peut seulement "
 "importer une catégorie par billet et il choisira celui de plus petit numéro. "
 "Si vous voulez conserver une trace de chaque catégorie, vous pouvez les "
-"importer sous forme de mot-clés, avec un préfixe optionnel."
+"importer sous forme de mots-clés, avec un préfixe optionnel."
 
 msgid ""
@@ -1031,5 +1031,5 @@
 "D'autre part, dans WordPress, un billet ne peut pas être sans catégorie, et "
 "une installation par défaut possède systématiquement une première catégorie "
-"nommée <i>« sans catégorie »</ i>. Si vous n'avez pas changé cette "
+"nommée <i>« sans catégorie »</i>. Si vous n'avez pas changé cette "
 "catégorie, vous pouvez simplement l'ignorer lors de l'importation sur votre "
 "blog, puisque Dotclear vous permet réellement de conserver votre message "
@@ -1043,8 +1043,8 @@
 
 msgid "Import all categories as tags:"
-msgstr "Importer toutes les catégories comme des mot-clés :"
+msgstr "Importer toutes les catégories comme des mots-clés :"
 
 msgid "Prefix such tags with:"
-msgstr "Préfixer les mot-clés avec :"
+msgstr "Préfixer les mots-clés avec :"
 
 msgid "Content filters"
@@ -1166,4 +1166,10 @@
 msgstr "Pages"
 
+msgid "My first page"
+msgstr "Ma première page"
+
+msgid "This is your first page. When you\'re ready to blog, log in to edit or delete it."
+msgstr "Ceci est votre première page. Quand vous serez prêt à bloguer, connectez-vous pour l'éditer ou la supprimer."
+
 #, php-format
 msgid "%d page"
@@ -1325,5 +1331,5 @@
 
 msgid "All tags"
-msgstr "Tous les mot-clés"
+msgstr "Tous les mots-clés"
 
 msgid "Home"
@@ -1337,5 +1343,5 @@
 
 msgid "Tags"
-msgstr "Mot-clés"
+msgstr "Mots-clés"
 
 msgid "User defined"
@@ -1445,5 +1451,5 @@
 
 msgid "Tags:"
-msgstr "Mot-clés :"
+msgstr "Mots-clés :"
 
 #, php-format
@@ -1474,20 +1480,20 @@
 
 msgid "Enter tags separated by coma"
-msgstr "Entrez les mot-clés séparés par des virgules"
+msgstr "Entrez les mots-clés séparés par des virgules"
 
 msgid "Add tags"
-msgstr "Ajouter des mot-clés"
+msgstr "Ajouter des mots-clés"
 
 msgid "Remove tags"
-msgstr "Retirer des mot-clés"
+msgstr "Retirer des mots-clés"
 
 msgid "Add tags to entries"
-msgstr "Ajouter des mot-clés à des billets"
+msgstr "Ajouter des mots-clés à des billets"
 
 msgid "Tags to add:"
-msgstr "Mot-clés à ajouter :"
+msgstr "Mots-clés à ajouter :"
 
 msgid "Remove selected tags from entries"
-msgstr "Retirer les mot-clés sélectionnés des billets"
+msgstr "Retirer les mots-clés sélectionnés des billets"
 
 msgid "No tags for selected entries"
@@ -1495,5 +1501,5 @@
 
 msgid "Following tags have been found in selected entries:"
-msgstr "Les mot-clés suivants ont été trouvés pour les billets sélectionnés :"
+msgstr "Les mots-clés suivants ont été trouvés pour les billets sélectionnés :"
 
 msgid "short"
@@ -1504,5 +1510,5 @@
 
 msgid "Tags list format:"
-msgstr "Format de la liste des mot-clés :"
+msgstr "Format de la liste des mots-clés :"
 
 msgid "Tags for posts"
@@ -1525,5 +1531,5 @@
 
 msgid "Link to all tags:"
-msgstr "Lien vers tous les mot-clés :"
+msgstr "Lien vers tous les mots-clés :"
 
 msgid "Edit tag"
@@ -1534,5 +1540,5 @@
 
 msgid "Back to tags list"
-msgstr "Retour à la liste des mot-clés"
+msgstr "Retour à la liste des mots-clés"
 
 msgid "Actions for this tag"
Index: locales/hu/help/blowupConfig.html
===================================================================
--- locales/hu/help/blowupConfig.html	(revision 0)
+++ locales/hu/help/blowupConfig.html	(revision 1264)
@@ -35,5 +35,5 @@
 <p>You can choose a header image among the list to use in place of the default one.</p>
 
-<p>When you choose "Custom..." in the image list, you will be able to upload your own image. <strong>The image file must be in JPG or PNG format and must be precisely 800px wide.</strong>
+<p>When you choose "Custom..." in the image list, you will be able to upload your own image. <strong>The image file must be in JPG or PNG format and must be precisely 800px wide.</strong></p>
 
 <p>If you upload a JPG image, a border will be added to the image, which is not the case with PNG images (the transparency of which will also be kept).</p>
Index: locales/it/help/blowupConfig.html
===================================================================
--- locales/it/help/blowupConfig.html	(revision 0)
+++ locales/it/help/blowupConfig.html	(revision 1264)
@@ -35,5 +35,5 @@
 <p>You can choose a header image among the list to use in place of the default one.</p>
 
-<p>When you choose "Custom..." in the image list, you will be able to upload your own image. <strong>The image file must be in JPG or PNG format and must be precisely 800px wide.</strong>
+<p>When you choose "Custom..." in the image list, you will be able to upload your own image. <strong>The image file must be in JPG or PNG format and must be precisely 800px wide.</strong></p>
 
 <p>If you upload a JPG image, a border will be added to the image, which is not the case with PNG images (the transparency of which will also be kept).</p>
Index: locales/ja/help/blowupConfig.html
===================================================================
--- locales/ja/help/blowupConfig.html	(revision 0)
+++ locales/ja/help/blowupConfig.html	(revision 1264)
@@ -35,5 +35,5 @@
 <p>デフォルトで指定されているものの代わりに、リストからヘッダ画像を選ぶことができます。</p>
 
-<p>画像リストで「カスタム...」を選んだ場合、独自の画像をアップロードすることができます。 <strong>画像ファイルは JPG または PNG フォーマットで、横幅が正確に800ピクセルである必要があります。</strong>
+<p>画像リストで「カスタム...」を選んだ場合、独自の画像をアップロードすることができます。 <strong>画像ファイルは JPG または PNG フォーマットで、横幅が正確に800ピクセルである必要があります。</strong></p>
 
 <p>JPG画像がアップロードされた場合、画像に境界線が付加されます。 PNG画像の場合には付加されず、透過性も維持されます。</p>
Index: locales/ko/help/blowupConfig.html
===================================================================
--- locales/ko/help/blowupConfig.html	(revision 0)
+++ locales/ko/help/blowupConfig.html	(revision 1264)
@@ -34,5 +34,5 @@
 <p>기본이미지 대신, 목록에 있는 머리글 이미지를 쓰실 수 있습니다.</p>
 
-<p>이미지 목록에서 "개성에 맞게..."를 선택하시면, 당신 자신이 보유한 이미지를 올릴 수 있습니다. <strong>이미지 파일은 JPG나 PNG 포맷이어야하고 폭은 정확히 800px 이어야 합니다.</strong>
+<p>이미지 목록에서 "개성에 맞게..."를 선택하시면, 당신 자신이 보유한 이미지를 올릴 수 있습니다. <strong>이미지 파일은 JPG나 PNG 포맷이어야하고 폭은 정확히 800px 이어야 합니다.</strong></p>
 
 <p>JPG 이미지를 올리실 때는, 윤곽선이 추가됩니다. PNG 이미지의 경우는 해당되지 않습니다. (PNG 이미지의 투명도도 또한 유지됩니다.)</p>
Index: locales/lt/help/blowupConfig.html
===================================================================
--- locales/lt/help/blowupConfig.html	(revision 813)
+++ locales/lt/help/blowupConfig.html	(revision 1264)
@@ -35,5 +35,5 @@
 <p>Du kannst ein Bild Deiner Wahl statt des Standardbildes einsetzen.</p>
 
-<p>Wenn Du  "Benutzerdefiniert..." in der Bilderliste ausw&auml;hlst, dann hast Du die M&ouml;glichkeit, Dein eigenes Bild upzuloaden. <strong>Das Dateiformat muss entweder JPG der PNG sein und es muss 800px breit sein.</strong>
+<p>Wenn Du  "Benutzerdefiniert..." in der Bilderliste ausw&auml;hlst, dann hast Du die M&ouml;glichkeit, Dein eigenes Bild upzuloaden. <strong>Das Dateiformat muss entweder JPG der PNG sein und es muss 800px breit sein.</strong></p>
 
 <p>Wenn Du ein JPG-Bild uploadest, dann wird automatisch ein Rahmen um das Bild gesetzt. Dies geschieht nicht bei der Verwendung eines PNG-Bildes und die Transparenz wird ebenfalls beibehalten.</p>
Index: locales/nl/help/blowupConfig.html
===================================================================
--- locales/nl/help/blowupConfig.html	(revision 0)
+++ locales/nl/help/blowupConfig.html	(revision 1264)
@@ -35,5 +35,5 @@
 <p>You can choose a header image among the list to use in place of the default one.</p>
 
-<p>When you choose "Custom..." in the image list, you will be able to upload your own image. <strong>The image file must be in JPG or PNG format and must be precisely 800px wide.</strong>
+<p>When you choose "Custom..." in the image list, you will be able to upload your own image. <strong>The image file must be in JPG or PNG format and must be precisely 800px wide.</strong></p>
 
 <p>If you upload a JPG image, a border will be added to the image, which is not the case with PNG images (the transparency of which will also be kept).</p>
Index: locales/oc/help/blowupConfig.html
===================================================================
--- locales/oc/help/blowupConfig.html	(revision 0)
+++ locales/oc/help/blowupConfig.html	(revision 1264)
@@ -35,5 +35,5 @@
 <p>You can choose a header image among the list to use in place of the default one.</p>
 
-<p>When you choose "Custom..." in the image list, you will be able to upload your own image. <strong>The image file must be in JPG or PNG format and must be precisely 800px wide.</strong>
+<p>When you choose "Custom..." in the image list, you will be able to upload your own image. <strong>The image file must be in JPG or PNG format and must be precisely 800px wide.</strong></p>
 
 <p>If you upload a JPG image, a border will be added to the image, which is not the case with PNG images (the transparency of which will also be kept).</p>
Index: locales/pl/help/blowupConfig.html
===================================================================
--- locales/pl/help/blowupConfig.html	(revision 0)
+++ locales/pl/help/blowupConfig.html	(revision 1264)
@@ -35,5 +35,5 @@
 <p>You can choose a header image among the list to use in place of the default one.</p>
 
-<p>When you choose "Custom..." in the image list, you will be able to upload your own image. <strong>The image file must be in JPG or PNG format and must be precisely 800px wide.</strong>
+<p>When you choose "Custom..." in the image list, you will be able to upload your own image. <strong>The image file must be in JPG or PNG format and must be precisely 800px wide.</strong></p>
 
 <p>If you upload a JPG image, a border will be added to the image, which is not the case with PNG images (the transparency of which will also be kept).</p>
Index: locales/pt-br/help/blowupConfig.html
===================================================================
--- locales/pt-br/help/blowupConfig.html	(revision 0)
+++ locales/pt-br/help/blowupConfig.html	(revision 1264)
@@ -35,5 +35,5 @@
 <p>You can choose a header image among the list to use in place of the default one.</p>
 
-<p>When you choose "Custom..." in the image list, you will be able to upload your own image. <strong>The image file must be in JPG or PNG format and must be precisely 800px wide.</strong>
+<p>When you choose "Custom..." in the image list, you will be able to upload your own image. <strong>The image file must be in JPG or PNG format and must be precisely 800px wide.</strong></p>
 
 <p>If you upload a JPG image, a border will be added to the image, which is not the case with PNG images (the transparency of which will also be kept).</p>
Index: locales/pt/help/blowupConfig.html
===================================================================
--- locales/pt/help/blowupConfig.html	(revision 0)
+++ locales/pt/help/blowupConfig.html	(revision 1264)
@@ -51,5 +51,5 @@
 <br />
 
-<em>NOTA: Uma bordura aparecera a volta da imagem o formato JPG, isto não acontece com as imagem em PNG -é a transparência dos PNGs fica efectiva-</em>
+<em>NOTA: Uma bordura aparecera a volta da imagem o formato JPG, isto não acontece com as imagem em PNG -é a transparência dos PNGs fica efectiva-</em></p>
 
 <h4>Estilos pré-definidos</h4>
Index: locales/ro/help/blowupConfig.html
===================================================================
--- locales/ro/help/blowupConfig.html	(revision 0)
+++ locales/ro/help/blowupConfig.html	(revision 1264)
@@ -35,5 +35,5 @@
 <p>You can choose a header image among the list to use in place of the default one.</p>
 
-<p>When you choose "Custom..." in the image list, you will be able to upload your own image. <strong>The image file must be in JPG or PNG format and must be precisely 800px wide.</strong>
+<p>When you choose "Custom..." in the image list, you will be able to upload your own image. <strong>The image file must be in JPG or PNG format and must be precisely 800px wide.</strong></p>
 
 <p>If you upload a JPG image, a border will be added to the image, which is not the case with PNG images (the transparency of which will also be kept).</p>
Index: locales/sr/help/blowupConfig.html
===================================================================
--- locales/sr/help/blowupConfig.html	(revision 0)
+++ locales/sr/help/blowupConfig.html	(revision 1264)
@@ -35,5 +35,5 @@
 <p>You can choose a header image among the list to use in place of the default one.</p>
 
-<p>When you choose "Custom..." in the image list, you will be able to upload your own image. <strong>The image file must be in JPG or PNG format and must be precisely 800px wide.</strong>
+<p>When you choose "Custom..." in the image list, you will be able to upload your own image. <strong>The image file must be in JPG or PNG format and must be precisely 800px wide.</strong></p>
 
 <p>If you upload a JPG image, a border will be added to the image, which is not the case with PNG images (the transparency of which will also be kept).</p>
Index: locales/sv/help/blowupConfig.html
===================================================================
--- locales/sv/help/blowupConfig.html	(revision 0)
+++ locales/sv/help/blowupConfig.html	(revision 1264)
@@ -35,5 +35,5 @@
 <p>You can choose a header image among the list to use in place of the default one.</p>
 
-<p>When you choose "Custom..." in the image list, you will be able to upload your own image. <strong>The image file must be in JPG or PNG format and must be precisely 800px wide.</strong>
+<p>When you choose "Custom..." in the image list, you will be able to upload your own image. <strong>The image file must be in JPG or PNG format and must be precisely 800px wide.</strong></p>
 
 <p>If you upload a JPG image, a border will be added to the image, which is not the case with PNG images (the transparency of which will also be kept).</p>
Index: locales/te/help/blowupConfig.html
===================================================================
--- locales/te/help/blowupConfig.html	(revision 0)
+++ locales/te/help/blowupConfig.html	(revision 1264)
@@ -35,5 +35,5 @@
 <p>You can choose a header image among the list to use in place of the default one.</p>
 
-<p>When you choose "Custom..." in the image list, you will be able to upload your own image. <strong>The image file must be in JPG or PNG format and must be precisely 800px wide.</strong>
+<p>When you choose "Custom..." in the image list, you will be able to upload your own image. <strong>The image file must be in JPG or PNG format and must be precisely 800px wide.</strong></p>
 
 <p>If you upload a JPG image, a border will be added to the image, which is not the case with PNG images (the transparency of which will also be kept).</p>
Index: locales/tr/help/blowupConfig.html
===================================================================
--- locales/tr/help/blowupConfig.html	(revision 0)
+++ locales/tr/help/blowupConfig.html	(revision 1264)
@@ -35,5 +35,5 @@
 <p>You can choose a header image among the list to use in place of the default one.</p>
 
-<p>When you choose "Custom..." in the image list, you will be able to upload your own image. <strong>The image file must be in JPG or PNG format and must be precisely 800px wide.</strong>
+<p>When you choose "Custom..." in the image list, you will be able to upload your own image. <strong>The image file must be in JPG or PNG format and must be precisely 800px wide.</strong></p>
 
 <p>If you upload a JPG image, a border will be added to the image, which is not the case with PNG images (the transparency of which will also be kept).</p>
Index: locales/zh-cn/help/blowupConfig.html
===================================================================
--- locales/zh-cn/help/blowupConfig.html	(revision 253)
+++ locales/zh-cn/help/blowupConfig.html	(revision 1264)
@@ -35,5 +35,5 @@
 <p>您可以从列表中选择一个头部图片来取代默认的。</p>
 
-<p>当您在图片列表中选择“定制...”，您将可以上传自己的图片。<strong>图片必须是 JPG 或者 PNG 格式并且必须精确等于 800 像素宽。</strong>
+<p>当您在图片列表中选择“定制...”，您将可以上传自己的图片。<strong>图片必须是 JPG 或者 PNG 格式并且必须精确等于 800 像素宽。</strong></p>
 
 <p>如果您上传一个 JPG 图片，一个边框将会被添加。而 PNG 图片不会如此(透明特性也会被保留)。</p>
Index: plugins/aboutConfig/index.php
===================================================================
--- plugins/aboutConfig/index.php	(revision 1179)
+++ plugins/aboutConfig/index.php	(revision 1274)
@@ -86,5 +86,5 @@
 	return
 	'<tr>'.
-	'<td scope="raw"><label for="s_'.$id.'">'.sprintf($slabel,html::escapeHTML($id)).'</label></td>'.
+	'<td scope="row"><label for="s_'.$id.'">'.sprintf($slabel,html::escapeHTML($id)).'</label></td>'.
 	'<td>'.$field.'</td>'.
 	'<td>'.$s['type'].'</td>'.
Index: plugins/antispam/filters/class.dc.filter.iplookup.php
===================================================================
--- plugins/antispam/filters/class.dc.filter.iplookup.php	(revision 1179)
+++ plugins/antispam/filters/class.dc.filter.iplookup.php	(revision 1361)
@@ -44,19 +44,13 @@
 		}
 
-		$match = array();
-
 		$bls = $this->getServers();
 		$bls = preg_split('/\s*,\s*/',$bls);
 
-		foreach ($bls as $bl)
-		{
+		foreach ($bls as $bl) {
 			if ($this->dnsblLookup($ip,$bl)) {
-				$match[] = $bl;
+				// Pass by reference $status to contain matching DNSBL
+				$status = $bl;
+				return true;
 			}
-		}
-
-		if (!empty($match)) {
-			$status = substr(implode(', ',$match),0,128);
-			return true;
 		}
 	}
Index: plugins/antispam/filters/class.dc.filter.linkslookup.php
===================================================================
--- plugins/antispam/filters/class.dc.filter.linkslookup.php	(revision 1179)
+++ plugins/antispam/filters/class.dc.filter.linkslookup.php	(revision 1366)
@@ -64,18 +64,8 @@
 	private function getLinks($text)
 	{
-		$res = array();
-		
-		# href attribute on "a" tags
-		if (preg_match_all('/<a ([^>]+)>/ms', $text, $match, PREG_SET_ORDER))
-		{
-			for ($i = 0; $i<count($match); $i++)
-			{
-				if (preg_match('/href="(http:\/\/[^"]+)"/ms', $match[$i][1], $matches)) {
-					$res[] = $matches[1];
-				}
-			}
-		}
-		
-		return $res;
+		// href attribute on "a" tags is second match
+		preg_match_all('|<a.*?href="(http.*?)"|', $text, $parts);
+
+		return $parts[1];
 	}
 }
Index: plugins/antispam/index.php
===================================================================
--- plugins/antispam/index.php	(revision 1207)
+++ plugins/antispam/index.php	(revision 1274)
@@ -204,5 +204,5 @@
 		'<td class="nowrap">'.form::checkbox(array('filters_active[]'),$fid,$f->active, '', '', false, 'title="'.__('Active').'"').'</td>'.
 		'<td class="nowrap">'.form::checkbox(array('filters_auto_del[]'),$fid,$f->auto_delete, '', '', false, 'title="'.__('Auto Del.').'"').'</td>'.
-		'<td class="nowrap" scope="raw">'.$f->name.'</td>'.
+		'<td class="nowrap" scope="row">'.$f->name.'</td>'.
 		'<td class="maximal">'.$f->description.'</td>'.
 		'<td class="status">'.$gui_link.'</td>'.
Index: plugins/attachments/_public.php
===================================================================
--- plugins/attachments/_public.php	(revision 1221)
+++ plugins/attachments/_public.php	(revision 1266)
@@ -40,5 +40,5 @@
 		"<?php\n".
 		'if ($_ctx->posts !== null && $core->media) {'."\n".
-		'$_ctx->attachments = staticRecord::newFromArray($core->media->getPostMedia($_ctx->posts->post_id));'."\n".
+		'$_ctx->attachments = $core->media->getPostMedia($_ctx->posts->post_id, null, true);'."\n".
 		"?>\n".
 		
@@ -46,5 +46,5 @@
 		'<?php while ($_ctx->attachments->fetch()) : ?>'.
 		
-		'<?php $GLOBALS[\'attach_i\'] = $attach_i; $attach_f = $_ctx->attachments->row(); $GLOBALS[\'attach_f\'] = $attach_f;'. // LEGACY
+		'<?php $GLOBALS[\'attach_i\'] = $attach_i; $attach_f = $_ctx->attachments; $GLOBALS[\'attach_f\'] = $attach_f;'. // LEGACY
 		'$_ctx->file_url = $attach_f->file_url; ?>'. // LEGACY
 		$content.
Index: plugins/maintenance/locales/fr/help/maintenance.html
===================================================================
--- plugins/maintenance/locales/fr/help/maintenance.html	(revision 207)
+++ plugins/maintenance/locales/fr/help/maintenance.html	(revision 1272)
@@ -10,8 +10,8 @@
 <dl>
   <dt>Optimiser l'espace de la base de données</dt>
-  <dd>Au fur at à mesure des suppressions ou modifications dans vos billets, les tables de la 
+  <dd>Au fur et à mesure des suppressions ou modifications dans vos billets, les tables de la 
   base de données se fragmentent. L'opération d'optimisation permet de compacter celles-ci.<br />
   Cette opération n'a aucun impact sur l'intégrité de vos données.<br />
-  Il est fortement conseillé d'optimiser la base de données avant tout export de blog</dd>
+  Il est fortement conseillé d'optimiser la base de données avant tout export de blog.</dd>
   
   <dt>Compteurs</dt>
Index: plugins/pages/_install.php
===================================================================
--- plugins/pages/_install.php	(revision 1442)
+++ plugins/pages/_install.php	(revision 1445)
@@ -39,8 +39,8 @@
 	$cur->post_format = 'xhtml';
 	$cur->post_lang = $core->blog->settings->system->lang;
-	$cur->post_title = __('Page de démonstration');
-	$cur->post_content = __('<h3>Créer une nouvelle page</h3><p>Cliquez sur le lien <strong>Pages</strong> situé sur le <strong>Tableau de bord</strong> ou dans la section <strong>Blog</strong> du menu latéral. La liste des pages s\'affiche. Cliquez sur le bouton <strong>Nouvelle page</strong> en haut de la page pour créer une page. vous retrouvez alors la même interface que pour éditer les <a href="http://fr.dotclear.org/documentation/2.0/usage/entries" class="wikilink1" title="2.0:usage:entries">billets</a> mais sans catégorie ni tags.</p>');
+	$cur->post_title = __('My first page');
+	$cur->post_content = __('<p>'.__('This is your first page. When you\'re ready to blog, log in to edit or delete it.').'</p>');
 	$cur->post_content_xhtml = $cur->post_content;
-	$cur->post_excerpt = __('<p>Les pages sont des contenus indépendants des billets. Elles servent par exemple à créer des pages <em>À propos</em> ou <em>Mentions légales</em> qui ont vocation à être toujours accessibles, contrairement aux billets progressivement remplacés par les nouveaux billets.</p>');
+	$cur->post_excerpt = '';
 	$cur->post_excerpt_xhtml = $cur->post_excerpt;
 	$cur->post_status = 1;
@@ -53,2 +53,3 @@
 $core->setVersion('pages',$version);
 return true;
+?>
Index: plugins/simpleMenu/index.php
===================================================================
--- plugins/simpleMenu/index.php	(revision 1179)
+++ plugins/simpleMenu/index.php	(revision 1273)
@@ -389,5 +389,5 @@
 		case 1:
 			// Selection du type d'item
-			echo '<form id="additem" action="'.$p_url.'&add=2" method="post">';
+			echo '<form id="additem" action="'.$p_url.'&amp;add=2" method="post">';
 			echo '<fieldset><legend>'.__('Select type').'</legend>';
 			echo '<p class="field"><label for="item_type" class="classic">'.__('Type of item menu:').'</label>'.form::combo('item_type',$items_combo,'').'</p>';
@@ -399,5 +399,5 @@
 			if ($items[$item_type][1]) {
 				// Choix à faire
-				echo '<form id="additem" action="'.$p_url.'&add=3" method="post">';
+				echo '<form id="additem" action="'.$p_url.'&amp;add=3" method="post">';
 				echo '<fieldset><legend>'.$item_type_label.'</legend>';
 				switch ($item_type) {
@@ -436,5 +436,5 @@
 		case 3:
 			// Libellé et description
-			echo '<form id="additem" action="'.$p_url.'&add=4" method="post">';
+			echo '<form id="additem" action="'.$p_url.'&amp;add=4" method="post">';
 			echo '<fieldset><legend>'.$item_type_label.($item_select_label != '' ? ' ('.$item_select_label.')' : '').'</legend>';
 			echo '<p class="field"><label for="item_label" class="classic required"><abbr title="'.__('Required field').'">*</abbr> '.
@@ -458,5 +458,5 @@
 
 if (!$step) {
-	echo '<form id="menuitemsappend" action="'.$p_url.'&add=1" method="post">';
+	echo '<form id="menuitemsappend" action="'.$p_url.'&amp;add=1" method="post">';
 	echo '<p>'.$core->formNonce().'<input class="add" type="submit" name="appendaction" value="'.__('Add an item').'" /></p>';
 	echo '</form>';
Index: plugins/tags/tag_posts.php
===================================================================
--- plugins/tags/tag_posts.php	(revision 1179)
+++ plugins/tags/tag_posts.php	(revision 1288)
@@ -130,15 +130,15 @@
 		'<input type="submit" value="'.__('Rename').'" />'.
 		$core->formNonce().
-		'</form>';
+		'</p></form>';
 		# Remove tag
 		if (!$posts->isEmpty() && $core->auth->check('contentadmin',$core->blog->id)) {
 			echo
 			'<form id="tag_delete" action="'.$this_url.'" method="post">'.
-			'<p class="no-margin">'.__('Delete this tag:').'</p>'.
-			'<input type="submit" class="delete" name="delete" value="'.__('Delete').'" />'.
+			'<p class="no-margin">'.__('Delete this tag:').
+			'</p><p><input type="submit" class="delete" name="delete" value="'.__('Delete').'" />'.
 			$core->formNonce().
-			'</form>';
+			'</p></form>';
 		}
-		echo '</p></div>';
+		echo '</div>';
 	}
 	
Index: plugins/userPref/index.php
===================================================================
--- plugins/userPref/index.php	(revision 1179)
+++ plugins/userPref/index.php	(revision 1274)
@@ -82,5 +82,5 @@
 	return
 	'<tr>'.
-	'<td scope="raw"><label for="s_'.$id.'">'.sprintf($slabel,html::escapeHTML($id)).'</label></td>'.
+	'<td scope="row"><label for="s_'.$id.'">'.sprintf($slabel,html::escapeHTML($id)).'</label></td>'.
 	'<td>'.$field.'</td>'.
 	'<td>'.$s['type'].'</td>'.
