Index: admin/blog_pref.php
===================================================================
--- admin/blog_pref.php	(revision 1615)
+++ admin/blog_pref.php	(revision 1620)
@@ -111,8 +111,12 @@
 # Image default size combo
 $img_default_size_combo = array();
-$media = new dcMedia($core);
-$img_default_size_combo[__('original')] = 'o';
-foreach ($media->thumb_sizes as $code => $size) {
-	$img_default_size_combo[__($size[2])] = $code;
+try {
+	$media = new dcMedia($core);
+	$img_default_size_combo[__('original')] = 'o';
+	foreach ($media->thumb_sizes as $code => $size) {
+		$img_default_size_combo[__($size[2])] = $code;
+	}
+} catch (Exception $e) {
+	$core->error->add($e->getMessage());
 }
 
Index: admin/index.php
===================================================================
--- admin/index.php	(revision 1558)
+++ admin/index.php	(revision 1620)
@@ -247,4 +247,26 @@
 }
 
+$err = array();
+
+# Check cache directory
+if (!is_dir(DC_TPL_CACHE)) {
+	$err[] = '<p>'.sprintf(__('Cache directory %s does not exist.'),DC_TPL_CACHE).'</p>';
+} else if (!is_writable(DC_TPL_CACHE)) {
+	$err[] = '<p>'.sprintf(__('Cache directory %s is not writable.'),DC_TPL_CACHE).'</p>';
+}
+
+# Check public directory
+if (!is_dir($core->blog->public_path)) {
+	$err[] = '<p>'.sprintf(__('Directory %s does not exist.'),$core->blog->public_path).'</p>';
+} else if (!is_writable($core->blog->public_path)) {
+	$err[] = '<p>'.sprintf(__('Directory %s is not writable.'),$core->blog->public_path).'</p>';
+}
+
+# Error list
+if (count($err) > 0) {
+	echo '<div class="error"><p><strong>Erreur&nbsp;:</strong></p>'.
+	'<ul><li>'.implode("</li><li>",$err).'</li></ul></div>';
+}
+
 # Plugins install messages
 if (!empty($plugins_install['success']))
@@ -267,4 +289,21 @@
 # Dashboard columns (processed first, as we need to know the result before displaying the icons.)
 $dashboardItems = '';
+
+# Dotclear updates notifications
+if ($core->auth->isSuperAdmin() && is_readable(DC_DIGESTS))
+{
+	$updater = new dcUpdate(DC_UPDATE_URL,'dotclear',DC_UPDATE_VERSION,DC_TPL_CACHE.'/versions');
+	$new_v = $updater->check(DC_VERSION);
+	$version_info = $new_v ? $updater->getInfoURL() : '';
+	
+	if ($updater->getNotify() && $new_v) {
+		$dashboardItems .=
+		'<div id="upg-notify" class="static-msg"><p>'.sprintf(__('Dotclear %s is available!'),$new_v).'</p> '.
+		'<ul><li><strong><a href="update.php">'.sprintf(__('Upgrade now'),$new_v).'</a></strong>'.
+		'</li><li><a href="update.php?hide_msg=1">'.__('Remind me later').'</a>'.
+		($version_info ? ' </li><li>'.sprintf(__('<a href=\"%s\">Information about this version</a>.'),$version_info) : '').
+		'</li></ul></div>';
+	}
+}
 
 # Errors modules notifications
Index: admin/install/index.php
===================================================================
--- admin/install/index.php	(revision 1553)
+++ admin/install/index.php	(revision 1620)
@@ -267,4 +267,5 @@
 
   <script type="text/javascript" src="../js/jquery/jquery.js"></script>
+  <?php echo dcPage::jsLoad('../js/jquery/jquery.pwstrength.js'); ?>
   <script type="text/javascript">
   //<![CDATA[
@@ -278,4 +279,11 @@
       $(this).val(this.value.replace(login_re,''));
     });
+    
+	<?php echo "\$('#u_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"; ?>
     
     $('#u_login').parent().after($('<input type="hidden" name="u_date" value="' + Date().toLocaleString() + '" />'));
@@ -329,10 +337,18 @@
 	
 	'<fieldset><legend>'.__('Username and password').'</legend>'.
-	'<p><label for="u_login" class="required"><abbr title="'.__('Required field').'">*</abbr> '.__('Username:').'</label> '.
-	form::field('u_login',30,32,html::escapeHTML($u_login)).'</p>'.
-	'<p><label for="u_pwd" class="required"><abbr title="'.__('Required field').'">*</abbr> '.__('Password:').'</label> '.
-	form::password('u_pwd',30,255).'</p>'.
-	'<p><label for="u_pwd2" class="required"><abbr title="'.__('Required field').'">*</abbr> '.__('Confirm password:').'</label> '.
-	form::password('u_pwd2',30,255).'</p>'.
+	'<p><label for="u_login" class="required"><abbr title="'.__('Required field').'">*</abbr> '.__('Username:').' '.
+	form::field('u_login',30,32,html::escapeHTML($u_login)).'</label></p>'.
+	'<div class="pw-table">'.
+		'<p class="pw-cell">'.
+			'<label for="u_pwd" class="required"><abbr title="'.__('Required field').'">*</abbr> '.__('New password:').'</label>'.
+			form::password('u_pwd',30,255,'','','',false,' data-indicator="pwindicator" ').
+		'</p>'.
+		'<div id="pwindicator">'.
+		'    <div class="bar"></div>'.
+		'    <p class="label no-margin"></p>'.
+		'</div>'.
+	'</div>'.
+	'<p><label for="u_pwd2" class="required"><abbr title="'.__('Required field').'">*</abbr> '.__('Confirm password:').' '.
+	form::password('u_pwd2',30,255).'</label></p>'.
 	'</fieldset>'.
 	
Index: admin/post.php
===================================================================
--- admin/post.php	(revision 1619)
+++ admin/post.php	(revision 1620)
@@ -147,5 +147,7 @@
 		try {
 			$core->media = new dcMedia($core);
-		} catch (Exception $e) {}
+		} catch (Exception $e) {
+			$core->error->add($e->getMessage());
+		}
 	}
 }
Index: admin/post_media.php
===================================================================
--- admin/post_media.php	(revision 1179)
+++ admin/post_media.php	(revision 1537)
@@ -26,12 +26,12 @@
 }
 
-if ($post_id && $media_id && !empty($_POST['attach']))
-{
-	$core->media = new dcMedia($core);
-	$core->media->addPostMedia($post_id,$media_id);
-	http::redirect($core->getPostAdminURL($rs->post_type,$post_id,false));
-}
+try {
+	if ($post_id && $media_id && !empty($_POST['attach']))
+	{
+		$core->media = new dcMedia($core);
+		$core->media->addPostMedia($post_id,$media_id);
+		http::redirect($core->getPostAdminURL($rs->post_type,$post_id,false));
+	}
 
-try {
 	$core->media = new dcMedia($core);
 	$f = $core->media->getPostMedia($post_id,$media_id);
Index: admin/services.php
===================================================================
--- admin/services.php	(revision 1500)
+++ admin/services.php	(revision 1538)
@@ -238,6 +238,8 @@
 		}
 		
-		$core->media = new dcMedia($core);
-		$file = $core->media->getFile($id);
+		try {
+			$core->media = new dcMedia($core);
+			$file = $core->media->getFile($id);
+		} catch (Exception $e) {}
 		
 		if ($file === null || $file->type != 'application/zip' || !$file->editable) {
Index: admin/style/install.css
===================================================================
--- admin/style/install.css	(revision 1330)
+++ admin/style/install.css	(revision 1620)
@@ -158,2 +158,43 @@
 	border: 1px solid #2C8FD1;
 }
+
+
+/* --------------------------------------------------------------- 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 1553)
+++ admin/update.php	(revision 1620)
@@ -249,5 +249,5 @@
 	'<p class="message">'.
 	__("Congratulations, you're one click away from the end of the update.").
-	' <strong><a href="index.php?logout=1">'.__('Finish the update').'</a>.</strong>'.
+	' <strong><a href="index.php?logout=1">'.__('Finish the update.').'</a></strong>'.
 	'</p>';
 }
Index: admin/user.php
===================================================================
--- admin/user.php	(revision 1609)
+++ admin/user.php	(revision 1620)
@@ -172,4 +172,17 @@
 dcPage::open($page_title,
 	dcPage::jsConfirmClose('user-form').
+	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".
 	
 	# --BEHAVIOR-- adminUserHeaders
@@ -211,9 +224,25 @@
 
 echo
-'<p><label for="new_pwd" '.($user_id != '' ? '' : 'class="required"').'>'.
-($user_id != '' ? '' : '<abbr title="'.__('Required field').'">*</abbr> ').
-($user_id != '' ? __('New password:') : __('Password:')).'</label> '.
-form::password('new_pwd',20,255).
-'</p>'.
+'<form action="user.php" method="post" id="user-form">'.
+'<fieldset><legend>'.__('User information').'</legend>'.
+'<div class="two-cols">'.
+'<div class="col">'.
+'<p><label for="user_id" class="required"><abbr title="'.__('Required field').'">*</abbr> '.__('Username:').' '.
+form::field('user_id',20,255,html::escapeHTML($user_id)).
+'</label></p>'.
+'<p class="form-note">'.__('At least 2 characters using letters, numbers or symbols.').'</p>'.
+
+'<div class="pw-table">'.
+	'<p class="pw-cell">'.
+		'<label for="new_pwd" '.($user_id != '' ? '' : 'class="required"').'>'.
+		($user_id != '' ? '' : '<abbr title="'.__('Required field').'">*</abbr> ').
+		($user_id != '' ? __('New password:') : __('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 class="form-note">'.__('Password must contain at least 6 characters.').'</p>'.
 
Index: admin/users_actions.php
===================================================================
--- admin/users_actions.php	(revision 1499)
+++ admin/users_actions.php	(revision 1620)
