Index: Makefile
===================================================================
--- Makefile	(revision 2896)
+++ Makefile	(revision 2801)
@@ -67,5 +67,4 @@
 	find ./$(DIST)/ -type d -name '.git' | xargs -r rm -rf
 	find ./$(DIST)/ -type f -name '.*ignore' | xargs -r rm -rf
-	find ./$(DIST)/ -type f -name '.flow' | xargs -r rm -rf
 
 	## Create digest
Index: admin/blog_pref.php
===================================================================
--- admin/blog_pref.php	(revision 2858)
+++ admin/blog_pref.php	(revision 2921)
@@ -685,5 +685,5 @@
 	{
 		if ($core->auth->isSuperAdmin()) {
-			$user_url_p = '<a href="'.$core->adminurl->get("admin.user",array('id' => '%1$s')).'">%1$s</a>';
+			$user_url_p = '<a href="'.$core->adminurl->get("admin.user",array('id' => '%1$s'),'&amp;',true).'">%1$s</a>';
 		} else {
 			$user_url_p = '%1$s';
Index: admin/index.php
===================================================================
--- admin/index.php	(revision 2854)
+++ admin/index.php	(revision 2929)
@@ -338,5 +338,5 @@
 		echo
 		'<div id="quick">'.
-		'<h3>'.__('Quick entry').'</h3>'.
+		'<h3>'.__('Quick entry').sprintf(' &rsaquo; %s',$core->auth->getOption('post_format')).'</h3>'.
 		'<form id="quick-entry" action="'.$core->adminurl->get('admin.post').'" method="post" class="fieldset">'.
 		'<h4>'.__('New entry').'</h4>'.
Index: admin/js/_index.js
===================================================================
--- admin/js/_index.js	(revision 2860)
+++ admin/js/_index.js	(revision 2929)
@@ -57,4 +57,5 @@
 					$('#post_title',f).val('');
 					$('#post_content',f).val('');
+					$('#post_content',f).change();
 					if ($.isFunction('jsToolBar') &&  (contentTb.getMode() == 'wysiwyg')) {
 						contentTb.syncContents('textarea');
Index: admin/post.php
===================================================================
--- admin/post.php	(revision 2907)
+++ admin/post.php	(revision 2926)
@@ -590,5 +590,6 @@
 	$core->callBehavior('adminPostFormItems',$main_items,$sidebar_items, isset($post) ? $post : null);
 
-	echo '<div class="multi-part" title="'.($post_id ? __('Edit entry') : __('New entry')).'" id="edit-entry">';
+	echo '<div class="multi-part" title="'.($post_id ? __('Edit entry') : __('New entry')).
+		sprintf(' &rsaquo; %s',$post_format).'" id="edit-entry">';
 	echo '<form action="'.$core->adminurl->get('admin.post').'" method="post" id="entry-form">';
 	echo '<div id="entry-wrapper">';
Index: admin/preferences.php
===================================================================
--- admin/preferences.php	(revision 2899)
+++ admin/preferences.php	(revision 2853)
@@ -352,4 +352,26 @@
 );
 
+if (!empty($_GET['upd'])) {
+	dcPage::success(__('Personal information has been successfully updated.'));
+}
+if (!empty($_GET['updated'])) {
+	dcPage::success(__('Personal options has been successfully updated.'));
+}
+if (!empty($_GET['db-updated'])) {
+	dcPage::success(__('Dashboard options has been successfully updated.'));
+}
+if (!empty($_GET['append'])) {
+	dcPage::success(__('Favorites have been successfully added.'));
+}
+if (!empty($_GET['neworder'])) {
+	dcPage::success(__('Favorites have been successfully updated.'));
+}
+if (!empty($_GET['removed'])) {
+	dcPage::success(__('Favorites have been successfully removed.'));
+}
+if (!empty($_GET['replaced'])) {
+	dcPage::success(__('Default favorites have been successfully updated.'));
+}
+
 # User profile
 echo '<div class="multi-part" id="user-profile" title="'.__('My profile').'">';
Index: inc/admin/lib.dc.adminurl.php
===================================================================
--- inc/admin/lib.dc.adminurl.php	(revision 2873)
+++ inc/admin/lib.dc.adminurl.php	(revision 2921)
@@ -87,6 +87,9 @@
 			$u .= '?'.http_build_query($p,'',$separator);
 		}
-		// Dirty hack to get back %s instead of %25s in URLs used with (s)printf(), as http_build_query urlencode() its result.
-		return $parametric ? str_replace('%25s','%s',$u) : $u;
+		if ($parametric) {
+			// Dirty hack to get back %[n$]s instead of %25[{0..9}%24]s in URLs used with (s)printf(), as http_build_query urlencode() its result.
+			$u = preg_replace('/\%25(([0-9])+?\%24)*?s/','%$2s',$u);
+		}
+		return $u;
 	}
 
Index: inc/core/class.dc.modules.php
===================================================================
--- inc/core/class.dc.modules.php	(revision 2918)
+++ inc/core/class.dc.modules.php	(revision 2708)
@@ -114,7 +114,7 @@
 		uasort($this->modules,array($this,'sortModules'));
 
+		# Load translation, _prepend and ns_file
 		foreach ($this->modules as $id => $m)
 		{
-			# Load translation and _prepend
 			if (file_exists($m['root'].'/_prepend.php'))
 			{
@@ -133,8 +133,4 @@
 				$this->core->adminurl->register('admin.plugin.'.$id,'plugin.php',array('p'=>$id));
 			}
-		}
-		foreach ($this->modules as $id => $m)
-		{
-			# Load ns_file
 			$this->loadNsFile($id,$ns);
 		}
Index: inc/prepend.php
===================================================================
--- inc/prepend.php	(revision 2903)
+++ inc/prepend.php	(revision 2884)
@@ -140,5 +140,5 @@
 # Constants
 define('DC_ROOT',path::real(dirname(__FILE__).'/..'));
-define('DC_VERSION','2.8-dev');
+define('DC_VERSION','2.7.3');
 define('DC_DIGESTS',dirname(__FILE__).'/digests');
 define('DC_L10N_ROOT',dirname(__FILE__).'/../locales');
Index: inc/public/lib.urlhandlers.php
===================================================================
--- inc/public/lib.urlhandlers.php	(revision 2915)
+++ inc/public/lib.urlhandlers.php	(revision 2919)
@@ -110,11 +110,12 @@
 
 		header('Content-Type: '.$_ctx->content_type.'; charset=UTF-8');
-
-		if ($_ctx->exists('xframeoption')) {
-			$url = parse_url($_ctx->xframeoption);
-			header(sprintf('X-Frame-Options: %s', is_array($url)?("ALLOW-FROM ".$url['scheme'].'://'.$url['host']):'SAMEORIGIN'));
-		} elseif ($core->blog->settings->system->prevents_clickjacking) {
-			// Prevents Clickjacking as far as possible
-			header('X-Frame-Options: SAMEORIGIN'); // FF 3.6.9+ Chrome 4.1+ IE 8+ Safari 4+ Opera 10.5+
+		if ($core->blog->settings->system->prevents_clickjacking) {
+			if ($_ctx->exists('xframeoption')) {
+				$url = parse_url($_ctx->xframeoption);
+				header(sprintf('X-Frame-Options: %s', is_array($url)?("ALLOW-FROM ".$url['scheme'].'://'.$url['host']):'SAMEORIGIN'));
+			} else {
+				// Prevents Clickjacking as far as possible
+				header('X-Frame-Options: SAMEORIGIN'); // FF 3.6.9+ Chrome 4.1+ IE 8+ Safari 4+ Opera 10.5+
+			}
 		}
 
Index: locales/fr/help/core_blog_pref.html
===================================================================
--- locales/fr/help/core_blog_pref.html	(revision 2798)
+++ locales/fr/help/core_blog_pref.html	(revision 2925)
@@ -79,6 +79,9 @@
   sont possibles sur un billet après sa publication. Laisser ce champ vide pour ne fixer aucune limite.</dd>
 
-  <dt>Syntaxe wiki pour les commentaires</dt>
+  <dt>Autoriser la syntaxe wiki pour les commentaires</dt>
   <dd>Autoriser quelques éléments de la syntaxe wiki dans les commentaires.</dd>
+
+  <dt>Rendre optionnelle la prévisualisation des commentaires</dt>
+  <dd>Permet de rendre optionnelle la prévisualisation des commentaires avant leur envoi définitif. Le bouton "Envoyer" sera dans ce cas affiché en permanence.</dd>
 
   <dt>Accepter les rétroliens</dt>
Index: locales/fr/main.po
===================================================================
--- locales/fr/main.po	(revision 2806)
+++ locales/fr/main.po	(revision 2927)
@@ -366,8 +366,8 @@
 
 msgid "Wiki syntax for comments"
-msgstr "Syntaxe wiki pour les commentaires"
+msgstr "Autoriser la syntaxe wiki pour les commentaires"
 
 msgid "Preview of comment before submit is not mandatory"
-msgstr "La prévisualisation des commentaires est optionnelle avant leur envoi"
+msgstr "Rendre optionnelle la prévisualisation des commentaires"
 
 msgid "Accept trackbacks"
@@ -467,8 +467,8 @@
 
 msgid "jQuery javascript library"
-msgstr "Librairie javascript jQuery"
+msgstr "Bibliothèque javascript jQuery"
 
 msgid "jQuery version to be loaded for this blog:"
-msgstr "Version de la librairie jQuery à charger pour ce blog :"
+msgstr "Version de la bibliothèque jQuery à charger pour ce blog :"
 
 msgid "Blog security"
Index: locales/fr/plugins.po
===================================================================
--- locales/fr/plugins.po	(revision 2928)
+++ locales/fr/plugins.po	(revision 2922)
@@ -847,5 +847,5 @@
 
 msgid "Link to an entry"
-msgstr "Lien vers une entrée :"
+msgstr "Lien vers une entrée"
 
 msgid "Link"
@@ -1883,19 +1883,4 @@
 msgid "No menu items so far."
 msgstr "Aucun item de menu pour l'instant."
-
-msgid "Item description"
-msgstr "Description des items de menu"
-
-msgid "Displayed in link"
-msgstr "Affichée dans le lien"
-
-msgid "Used as link title"
-msgstr "Utilisée comme titre du lien"
-
-msgid "Displayed in link and used as title"
-msgstr "Affichée dans le lien et utilisée comme titre"
-
-msgid "Not displayed nor used"
-msgstr "Ignorée"
 
 msgid "Add tags"
Index: plugins/pages/_public.php
===================================================================
--- plugins/pages/_public.php	(revision 2778)
+++ plugins/pages/_public.php	(revision 2920)
@@ -230,4 +230,8 @@
 			{
 				$_ctx->preview = true;
+				if (defined ("DC_ADMIN_URL")) {
+					$_ctx->xframeoption=DC_ADMIN_URL;
+				}
+
 				self::pages($post_url);
 			}
Index: plugins/pages/page.php
===================================================================
--- plugins/pages/page.php	(revision 2909)
+++ plugins/pages/page.php	(revision 2926)
@@ -516,5 +516,6 @@
 	$core->callBehavior('adminPageFormItems',$main_items,$sidebar_items, isset($post) ? $post : null);
 
-	echo '<div class="multi-part" title="'.($post_id ? __('Edit page') : __('New page')).'" id="edit-entry">';
+	echo '<div class="multi-part" title="'.($post_id ? __('Edit page') : __('New page')).
+		sprintf(' &rsaquo; %s',$post_format).'" id="edit-entry">';
 	echo '<form action="'.html::escapeURL($redir_url).'" method="post" id="entry-form">';
 
Index: plugins/simpleMenu/_public.php
===================================================================
--- plugins/simpleMenu/_public.php	(revision 2928)
+++ plugins/simpleMenu/_public.php	(revision 2912)
@@ -31,5 +31,5 @@
 		$description = isset($attr['description']) ? trim($attr['description']) : '';
 
-		if (!preg_match('#^(title|span|both|none)$#',$description)) {
+		if (!preg_match('#^(title|span)$#',$description)) {
 			$description = '';
 		}
@@ -47,6 +47,4 @@
 		global $core, $_ctx;
 
-		$descr_type = array(0 => 'span',1 => 'title',2 => 'both',3 => 'none');
-
 		if (!(boolean) $core->blog->settings->system->simpleMenu_active)
 			return;
@@ -60,9 +58,5 @@
 		}
 
-		$description = 'title';
-		if (isset($descr_type[$w->description])) {
-			$description = $descr_type[$w->description];
-		}
-		$menu = tplSimpleMenu::displayMenu('','',$description);
+		$menu = tplSimpleMenu::displayMenu('','','title');
 		if ($menu == '') {
 			return;
@@ -113,8 +107,7 @@
 				$title = $span = '';
 				if ($m['descr']) {
-					if ($description == 'title' || $description == 'both') {
+					if ($description == 'title') {
 						$title = ' title="'.html::escapeHTML(__($m['descr'])).'"';
-					}
-					if ($description == 'span' || $description == 'both') {
+					} else {
 						$span = ' <span>'.html::escapeHTML(__($m['descr'])).'</span>';
 					}
Index: plugins/simpleMenu/_widgets.php
===================================================================
--- plugins/simpleMenu/_widgets.php	(revision 2928)
+++ plugins/simpleMenu/_widgets.php	(revision 2778)
@@ -20,12 +20,4 @@
 		$w->create('simplemenu',__('Simple menu'),array('tplSimpleMenu','simpleMenuWidget'),null,'List of simple menu items');
 		$w->simplemenu->setting('title',__('Title (optional)').' :',__('Menu'));
-		$w->simplemenu->setting('description',__('Item description'),0,'combo',
-			array(
-				__('Displayed in link') => 0,					// span
-				__('Used as link title') => 1,					// title
-				__('Displayed in link and used as title') => 2,	// both
-				__('Not displayed nor used') => 3 				// none
-				)
-			);
 		$w->simplemenu->setting('homeonly',__('Display on:'),0,'combo',
 			array(
@@ -34,5 +26,5 @@
 				__('Except on home page') => 2
 				)
-			);
+		);
 		$w->simplemenu->setting('content_only',__('Content only'),0,'check');
 		$w->simplemenu->setting('class',__('CSS class:'),'');
Index: plugins/tags/_admin.php
===================================================================
--- plugins/tags/_admin.php	(revision 2924)
+++ plugins/tags/_admin.php	(revision 2849)
@@ -10,5 +10,4 @@
 #
 # -- END LICENSE BLOCK -----------------------------------------
-
 if (!defined('DC_CONTEXT_ADMIN')) { return; }
 
@@ -37,8 +36,350 @@
 $core->addBehavior('adminBeforeUserUpdate',array('tagsBehaviors','setTagListFormat'));
 
+$core->addBehavior('coreInitWikiPost',array('tagsBehaviors','coreInitWikiPost'));
+
 $core->addBehavior('adminDashboardFavorites',array('tagsBehaviors','dashboardFavorites'));
 
 $core->addBehavior('adminPageHelpBlock', array('tagsBehaviors', 'adminPageHelpBlock'));
 
-$core->addBehavior('adminPostEditor', array('tagsBehaviors','adminPostEditor'));
 $core->addBehavior('ckeditorExtraPlugins', array('tagsBehaviors', 'ckeditorExtraPlugins'));
+
+# BEHAVIORS
+class tagsBehaviors
+{
+    public static function ckeditorExtraPlugins(ArrayObject $extraPlugins, $context)
+    {
+        global $core;
+
+        if ($context!='post') {
+            return;
+        }
+        $extraPlugins[] = array(
+            'name' => 'dctags',
+            'button' => 'dcTags',
+            'url' => DC_ADMIN_URL.'index.php?pf=tags/js/ckeditor-tags-plugin.js'
+        );
+    }
+
+	public static function adminPageHelpBlock($blocks)
+	{
+		$found = false;
+		foreach($blocks as $block) {
+			if ($block == 'core_post') {
+				$found = true;
+				break;
+			}
+		}
+		if (!$found) {
+			return null;
+		}
+		$blocks[] = 'tag_post';
+	}
+
+	public static function dashboardFavorites($core,$favs)
+	{
+		$favs->register('tags', array(
+			'title' => __('Tags'),
+			'url' => $core->adminurl->get('admin.plugin.tags',array('m' => 'tags')),
+			'small-icon' => dcPage::getPF('tags/icon.png'),
+			'large-icon' => dcPage::getPF('tags/icon-big.png'),
+			'permissions' => 'usage,contentadmin'
+		));
+	}
+
+	public static function coreInitWikiPost($wiki2xhtml)
+	{
+		$wiki2xhtml->registerFunction('url:tag',array('tagsBehaviors','wiki2xhtmlTag'));
+	}
+
+	public static function wiki2xhtmlTag($url,$content)
+	{
+		$url = substr($url,4);
+		if (strpos($content,'tag:') === 0) {
+			$content = substr($content,4);
+		}
+
+
+		$tag_url = html::stripHostURL($GLOBALS['core']->blog->url.$GLOBALS['core']->url->getURLFor('tag'));
+		$res['url'] = $tag_url.'/'.rawurlencode(dcMeta::sanitizeMetaID($url));
+		$res['content'] = $content;
+
+		return $res;
+	}
+
+	public static function tagsField($main,$sidebar,$post)
+	{
+		$meta =& $GLOBALS['core']->meta;
+
+		if (!empty($_POST['post_tags'])) {
+			$value = $_POST['post_tags'];
+		} else {
+			$value = ($post) ? $meta->getMetaStr($post->post_meta,'tag') : '';
+		}
+		$sidebar['metas-box']['items']['post_tags']=
+		'<h5><label class="s-tags" for="post_tags">'.__('Tags').'</label></h5>'.
+		'<div class="p s-tags" id="tags-edit">'.form::textarea('post_tags',20,3,$value,'maximal').'</div>';
+	}
+
+	public static function setTags($cur,$post_id)
+	{
+		$post_id = (integer) $post_id;
+
+		if (isset($_POST['post_tags'])) {
+			$tags = $_POST['post_tags'];
+			$meta =& $GLOBALS['core']->meta;
+			$meta->delPostMeta($post_id,'tag');
+
+			foreach ($meta->splitMetaValues($tags) as $tag) {
+				$meta->setPostMeta($post_id,'tag',$tag);
+			}
+		}
+	}
+
+
+	public static function adminPostsActionsPage($core,$ap)
+	{
+		$ap->addAction(
+			array(__('Tags') => array(__('Add tags') => 'tags')),
+			array('tagsBehaviors','adminAddTags')
+		);
+
+		if ($core->auth->check('delete,contentadmin',$core->blog->id)) {
+			$ap->addAction(
+				array(__('Tags') => array(__('Remove tags') => 'tags_remove')),
+				array('tagsBehaviors','adminRemoveTags')
+			);
+		}
+	}
+
+	public static function adminAddTags($core, dcPostsActionsPage $ap, $post)
+	{
+		if (!empty($post['new_tags']))
+		{
+			$meta =& $core->meta;
+			$tags = $meta->splitMetaValues($post['new_tags']);
+			$posts = $ap->getRS();
+			while ($posts->fetch())
+			{
+				# Get tags for post
+				$post_meta = $meta->getMetadata(array(
+					'meta_type' => 'tag',
+					'post_id' => $posts->post_id));
+				$pm = array();
+				while ($post_meta->fetch()) {
+					$pm[] = $post_meta->meta_id;
+				}
+				foreach ($tags as $t) {
+					if (!in_array($t,$pm)) {
+						$meta->setPostMeta($posts->post_id,'tag',$t);
+					}
+				}
+			}
+			dcPage::addSuccessNotice(sprintf(
+				__(
+					'Tag has been successfully added to selected entries',
+					'Tags have been successfully added to selected entries',
+					count($tags))
+				)
+			);
+			$ap->redirect(true);
+		}
+		else
+		{
+			$tag_url = $core->blog->url.$core->url->getURLFor('tag');
+
+			$opts = $core->auth->getOptions();
+			$type = isset($opts['tag_list_format']) ? $opts['tag_list_format'] : 'more';
+
+
+			$ap->beginPage(
+				dcPage::breadcrumb(
+					array(
+						html::escapeHTML($core->blog->name) => '',
+						__('Entries') => $ap->getRedirection(true),
+						__('Add tags to this selection') => ''
+				)),
+				dcPage::jsLoad('js/jquery/jquery.autocomplete.js').
+				dcPage::jsMetaEditor().
+				'<script type="text/javascript">'."\n".
+				"//<![CDATA[\n".
+				"var editor_tags_options = {\n".
+					"meta_url : 'plugin.php?p=tags&m=tag_posts&amp;tag=',\n".
+					"list_type : '".html::escapeJS($type)."',\n".
+					"text_confirm_remove : '".html::escapeJS(__('Are you sure you want to remove this tag?'))."',\n".
+					"text_add_meta : '".html::escapeJS(__('Add a tag to this entry'))."',\n".
+					"text_choose : '".html::escapeJS(__('Choose from list'))."',\n".
+					"text_all : '".html::escapeJS(__('all'))."',\n".
+					"text_separation : '".html::escapeJS(__('Enter tags separated by coma'))."',\n".
+				"};\n".
+				"\n//]]>\n".
+				"</script>\n".
+				'<script type="text/javascript" src="index.php?pf=tags/js/jquery.autocomplete.js"></script>'.
+				'<script type="text/javascript" src="index.php?pf=tags/js/posts_actions.js"></script>'.
+				'<script type="text/javascript">'."\n".
+				"//<![CDATA[\n".
+				"dotclear.msg.tags_autocomplete = '".html::escapeJS(__('used in %e - frequency %p%'))."';\n".
+				"dotclear.msg.entry = '".html::escapeJS(__('entry'))."';\n".
+				"dotclear.msg.entries = '".html::escapeJS(__('entries'))."';\n".
+				"\n//]]>\n".
+				"</script>\n".
+				'<link rel="stylesheet" type="text/css" href="index.php?pf=tags/style.css" />'
+			);
+			echo
+				'<form action="'.$ap->getURI().'" method="post">'.
+				$ap->getCheckboxes().
+				'<div><label for="new_tags" class="area">'.__('Tags to add:').'</label> '.
+				form::textarea('new_tags',60,3).
+				'</div>'.
+				$core->formNonce().$ap->getHiddenFields().
+				form::hidden(array('action'),'tags').
+				'<p><input type="submit" value="'.__('Save').'" '.
+				'name="save_tags" /></p>'.
+				'</form>';
+			$ap->endPage();
+		}
+	}
+	public static function adminRemoveTags($core, dcPostsActionsPage $ap, $post)
+	{
+		if (!empty($post['meta_id']) &&
+			$core->auth->check('delete,contentadmin',$core->blog->id))
+		{
+			$meta =& $core->meta;
+			$posts = $ap->getRS();
+			while ($posts->fetch())
+			{
+				foreach ($_POST['meta_id'] as $v)
+				{
+					$meta->delPostMeta($posts->post_id,'tag',$v);
+				}
+			}
+			dcPage::addSuccessNotice(sprintf(
+				__(
+					'Tag has been successfully removed from selected entries',
+					'Tags have been successfully removed from selected entries',
+					count($_POST['meta_id']))
+				)
+			);
+			$ap->redirect(true);
+		}
+		else
+		{
+			$meta =& $core->meta;
+			$tags = array();
+
+			foreach ($ap->getIDS() as $id) {
+				$post_tags = $meta->getMetadata(array(
+					'meta_type' => 'tag',
+					'post_id' => (integer) $id))->toStatic()->rows();
+				foreach ($post_tags as $v) {
+					if (isset($tags[$v['meta_id']])) {
+						$tags[$v['meta_id']]++;
+					} else {
+						$tags[$v['meta_id']] = 1;
+					}
+				}
+			}
+			if (empty($tags)) {
+				throw new Exception(__('No tags for selected entries'));
+			}
+			$ap->beginPage(
+				dcPage::breadcrumb(
+						array(
+							html::escapeHTML($core->blog->name) => '',
+							__('Entries') => 'posts.php',
+							__('Remove selected tags from this selection') => ''
+			)));
+			$posts_count = count($_POST['entries']);
+
+			echo
+			'<form action="'.$ap->getURI().'" method="post">'.
+			$ap->getCheckboxes().
+			'<div><p>'.__('Following tags have been found in selected entries:').'</p>';
+
+			foreach ($tags as $k => $n) {
+				$label = '<label class="classic">%s %s</label>';
+				if ($posts_count == $n) {
+					$label = sprintf($label,'%s','<strong>%s</strong>');
+				}
+				echo '<p>'.sprintf($label,
+						form::checkbox(array('meta_id[]'),html::escapeHTML($k)),
+						html::escapeHTML($k)).
+					'</p>';
+			}
+
+			echo
+			'<p><input type="submit" value="'.__('ok').'" />'.
+
+			$core->formNonce().$ap->getHiddenFields().
+			form::hidden(array('action'),'tags_remove').
+			'</p></div></form>';
+			$ap->endPage();
+		}
+
+	}
+
+	public static function postHeaders()
+	{
+		$tag_url = $GLOBALS['core']->blog->url.$GLOBALS['core']->url->getURLFor('tag');
+
+		$opts = $GLOBALS['core']->auth->getOptions();
+		$type = isset($opts['tag_list_format']) ? $opts['tag_list_format'] : 'more';
+
+		return
+		'<script type="text/javascript">'."\n".
+		"//<![CDATA[\n".
+		"var editor_tags_options = {\n".
+			"meta_url : 'plugin.php?p=tags&m=tag_posts&amp;tag=',\n".
+			"list_type : '".html::escapeJS($type)."',\n".
+			"text_confirm_remove : '".html::escapeJS(__('Are you sure you want to remove this tag?'))."',\n".
+			"text_add_meta : '".html::escapeJS(__('Add a tag to this entry'))."',\n".
+			"text_choose : '".html::escapeJS(__('Choose from list'))."',\n".
+			"text_all : '".html::escapeJS(__('all'))."',\n".
+			"text_separation : '".html::escapeJS(__('Enter tags separated by coma'))."',\n".
+		"};\n".
+		"\n//]]>\n".
+		"</script>\n".
+		'<script type="text/javascript" src="index.php?pf=tags/js/jquery.autocomplete.js"></script>'.
+		'<script type="text/javascript" src="index.php?pf=tags/js/post.js"></script>'.
+		'<script type="text/javascript">'."\n".
+		"//<![CDATA[\n".
+		"jsToolBar.prototype.elements.tag.title = '".html::escapeJS(__('Tag'))."';\n".
+		"jsToolBar.prototype.elements.tag.url = '".html::escapeJS($tag_url)."';\n".
+		"dotclear.msg.tags_autocomplete = '".html::escapeJS(__('used in %e - frequency %p%'))."';\n".
+		"dotclear.msg.entry = '".html::escapeJS(__('entry'))."';\n".
+		"dotclear.msg.entries = '".html::escapeJS(__('entries'))."';\n".
+		"\n//]]>\n".
+		"</script>\n".
+		'<link rel="stylesheet" type="text/css" href="index.php?pf=tags/style.css" />';
+	}
+
+	public static function adminUserForm($args)
+	{
+		if ($args instanceof dcCore) {
+			$opts = $args->auth->getOptions();
+		}
+		elseif ($args instanceof record) {
+			$opts = $args->options();
+		}
+		else {
+			$opts = array();
+		}
+
+		$combo = array();
+		$combo[__('Short')] = 'more';
+		$combo[__('Extended')] = 'all';
+
+		$value = array_key_exists('tag_list_format',$opts) ? $opts['tag_list_format'] : 'more';
+
+		echo
+		'<p><label for="user_tag_list_format" class="classic">'.__('Tags list format:').'</label> '.
+		form::combo('user_tag_list_format',$combo,$value).
+		'</p>';
+	}
+
+	public static function setTagListFormat($cur,$user_id = null)
+	{
+		if (!is_null($user_id)) {
+			$cur->user_options['tag_list_format'] = $_POST['user_tag_list_format'];
+		}
+	}
+}
Index: plugins/tags/_define.php
===================================================================
--- plugins/tags/_define.php	(revision 2924)
+++ plugins/tags/_define.php	(revision 2662)
@@ -16,8 +16,8 @@
 	/* Description*/		"Tags for posts",
 	/* Author */			"Olivier Meunier",
-	/* Version */			'1.4',
+	/* Version */			'1.3',
 	array(
 		'permissions' =>	'usage,contentadmin',
-		'priority' =>		1001,	// Must be higher than dcLegacyEditor/dcCKEditor priority (ie 1000)
+		'priority' =>		998,
 		'type'		=>		'plugin'
 	)
Index: plugins/tags/_prepend.php
===================================================================
--- plugins/tags/_prepend.php	(revision 2924)
+++ plugins/tags/_prepend.php	(revision 2095)
@@ -10,5 +10,4 @@
 #
 # -- END LICENSE BLOCK -----------------------------------------
-
 if (!defined('DC_RC_PATH')) { return; }
 
@@ -16,6 +15,2 @@
 $core->url->register('tags', 'tags', '^tags$', array('urlTags', 'tags'));
 $core->url->register('tag_feed', 'feed/tag', '^feed/tag/(.+)$', array('urlTags', 'tagFeed'));
-
-$__autoload['tagsBehaviors'] = dirname(__FILE__).'/inc/tags.behaviors.php';
-
-$core->addBehavior('coreInitWikiPost',array('tagsBehaviors','coreInitWikiPost'));
Index: lugins/tags/inc/tags.behaviors.php
===================================================================
--- plugins/tags/inc/tags.behaviors.php	(revision 2924)
+++ 	(revision )
@@ -1,366 +1,0 @@
-<?php
-# -- BEGIN LICENSE BLOCK ---------------------------------------
-#
-# This file is part of Dotclear 2.
-#
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
-# Licensed under the GPL version 2.0 license.
-# See LICENSE file or
-# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
-#
-# -- END LICENSE BLOCK -----------------------------------------
-
-# BEHAVIORS
-class tagsBehaviors
-{
-	public static function adminPostEditor($editor='',$context='',array $tags=array())
-	{
-		if ($editor != 'dcLegacyEditor' || $context != 'post') return;
-
-		$tag_url = $GLOBALS['core']->blog->url.$GLOBALS['core']->url->getURLFor('tag');
-
-		return
-		'<script type="text/javascript" src="index.php?pf=tags/js/legacy-post.js"></script>'.
-		'<script type="text/javascript">'."\n".
-		"//<![CDATA[\n".
-		"jsToolBar.prototype.elements.tag.title = '".html::escapeJS(__('Tag'))."';\n".
-		"jsToolBar.prototype.elements.tag.url = '".html::escapeJS($tag_url)."';\n".
-		"\n//]]>\n".
-		"</script>\n";
-	}
-
-    public static function ckeditorExtraPlugins(ArrayObject $extraPlugins, $context)
-    {
-        global $core;
-
-        if ($context!='post') {
-            return;
-        }
-        $extraPlugins[] = array(
-            'name' => 'dctags',
-            'button' => 'dcTags',
-            'url' => DC_ADMIN_URL.'index.php?pf=tags/js/ckeditor-tags-plugin.js'
-        );
-    }
-
-	public static function adminPageHelpBlock($blocks)
-	{
-		$found = false;
-		foreach($blocks as $block) {
-			if ($block == 'core_post') {
-				$found = true;
-				break;
-			}
-		}
-		if (!$found) {
-			return null;
-		}
-		$blocks[] = 'tag_post';
-	}
-
-	public static function dashboardFavorites($core,$favs)
-	{
-		$favs->register('tags', array(
-			'title' => __('Tags'),
-			'url' => $core->adminurl->get('admin.plugin.tags',array('m' => 'tags')),
-			'small-icon' => dcPage::getPF('tags/icon.png'),
-			'large-icon' => dcPage::getPF('tags/icon-big.png'),
-			'permissions' => 'usage,contentadmin'
-		));
-	}
-
-	public static function coreInitWikiPost($wiki2xhtml)
-	{
-		$wiki2xhtml->registerFunction('url:tag',array('tagsBehaviors','wiki2xhtmlTag'));
-	}
-
-	public static function wiki2xhtmlTag($url,$content)
-	{
-		$url = substr($url,4);
-		if (strpos($content,'tag:') === 0) {
-			$content = substr($content,4);
-		}
-
-
-		$tag_url = html::stripHostURL($GLOBALS['core']->blog->url.$GLOBALS['core']->url->getURLFor('tag'));
-		$res['url'] = $tag_url.'/'.rawurlencode(dcMeta::sanitizeMetaID($url));
-		$res['content'] = $content;
-
-		return $res;
-	}
-
-	public static function tagsField($main,$sidebar,$post)
-	{
-		$meta =& $GLOBALS['core']->meta;
-
-		if (!empty($_POST['post_tags'])) {
-			$value = $_POST['post_tags'];
-		} else {
-			$value = ($post) ? $meta->getMetaStr($post->post_meta,'tag') : '';
-		}
-		$sidebar['metas-box']['items']['post_tags']=
-		'<h5><label class="s-tags" for="post_tags">'.__('Tags').'</label></h5>'.
-		'<div class="p s-tags" id="tags-edit">'.form::textarea('post_tags',20,3,$value,'maximal').'</div>';
-	}
-
-	public static function setTags($cur,$post_id)
-	{
-		$post_id = (integer) $post_id;
-
-		if (isset($_POST['post_tags'])) {
-			$tags = $_POST['post_tags'];
-			$meta =& $GLOBALS['core']->meta;
-			$meta->delPostMeta($post_id,'tag');
-
-			foreach ($meta->splitMetaValues($tags) as $tag) {
-				$meta->setPostMeta($post_id,'tag',$tag);
-			}
-		}
-	}
-
-
-	public static function adminPostsActionsPage($core,$ap)
-	{
-		$ap->addAction(
-			array(__('Tags') => array(__('Add tags') => 'tags')),
-			array('tagsBehaviors','adminAddTags')
-		);
-
-		if ($core->auth->check('delete,contentadmin',$core->blog->id)) {
-			$ap->addAction(
-				array(__('Tags') => array(__('Remove tags') => 'tags_remove')),
-				array('tagsBehaviors','adminRemoveTags')
-			);
-		}
-	}
-
-	public static function adminAddTags($core, dcPostsActionsPage $ap, $post)
-	{
-		if (!empty($post['new_tags']))
-		{
-			$meta =& $core->meta;
-			$tags = $meta->splitMetaValues($post['new_tags']);
-			$posts = $ap->getRS();
-			while ($posts->fetch())
-			{
-				# Get tags for post
-				$post_meta = $meta->getMetadata(array(
-					'meta_type' => 'tag',
-					'post_id' => $posts->post_id));
-				$pm = array();
-				while ($post_meta->fetch()) {
-					$pm[] = $post_meta->meta_id;
-				}
-				foreach ($tags as $t) {
-					if (!in_array($t,$pm)) {
-						$meta->setPostMeta($posts->post_id,'tag',$t);
-					}
-				}
-			}
-			dcPage::addSuccessNotice(sprintf(
-				__(
-					'Tag has been successfully added to selected entries',
-					'Tags have been successfully added to selected entries',
-					count($tags))
-				)
-			);
-			$ap->redirect(true);
-		}
-		else
-		{
-			$tag_url = $core->blog->url.$core->url->getURLFor('tag');
-
-			$opts = $core->auth->getOptions();
-			$type = isset($opts['tag_list_format']) ? $opts['tag_list_format'] : 'more';
-
-
-			$ap->beginPage(
-				dcPage::breadcrumb(
-					array(
-						html::escapeHTML($core->blog->name) => '',
-						__('Entries') => $ap->getRedirection(true),
-						__('Add tags to this selection') => ''
-				)),
-				dcPage::jsLoad('js/jquery/jquery.autocomplete.js').
-				dcPage::jsMetaEditor().
-				'<script type="text/javascript">'."\n".
-				"//<![CDATA[\n".
-				"var editor_tags_options = {\n".
-					"meta_url : 'plugin.php?p=tags&m=tag_posts&amp;tag=',\n".
-					"list_type : '".html::escapeJS($type)."',\n".
-					"text_confirm_remove : '".html::escapeJS(__('Are you sure you want to remove this tag?'))."',\n".
-					"text_add_meta : '".html::escapeJS(__('Add a tag to this entry'))."',\n".
-					"text_choose : '".html::escapeJS(__('Choose from list'))."',\n".
-					"text_all : '".html::escapeJS(__('all'))."',\n".
-					"text_separation : '".html::escapeJS(__('Enter tags separated by coma'))."',\n".
-				"};\n".
-				"\n//]]>\n".
-				"</script>\n".
-				'<script type="text/javascript" src="index.php?pf=tags/js/jquery.autocomplete.js"></script>'.
-				'<script type="text/javascript" src="index.php?pf=tags/js/posts_actions.js"></script>'.
-				'<script type="text/javascript">'."\n".
-				"//<![CDATA[\n".
-				"dotclear.msg.tags_autocomplete = '".html::escapeJS(__('used in %e - frequency %p%'))."';\n".
-				"dotclear.msg.entry = '".html::escapeJS(__('entry'))."';\n".
-				"dotclear.msg.entries = '".html::escapeJS(__('entries'))."';\n".
-				"\n//]]>\n".
-				"</script>\n".
-				'<link rel="stylesheet" type="text/css" href="index.php?pf=tags/style.css" />'
-			);
-			echo
-				'<form action="'.$ap->getURI().'" method="post">'.
-				$ap->getCheckboxes().
-				'<div><label for="new_tags" class="area">'.__('Tags to add:').'</label> '.
-				form::textarea('new_tags',60,3).
-				'</div>'.
-				$core->formNonce().$ap->getHiddenFields().
-				form::hidden(array('action'),'tags').
-				'<p><input type="submit" value="'.__('Save').'" '.
-				'name="save_tags" /></p>'.
-				'</form>';
-			$ap->endPage();
-		}
-	}
-	public static function adminRemoveTags($core, dcPostsActionsPage $ap, $post)
-	{
-		if (!empty($post['meta_id']) &&
-			$core->auth->check('delete,contentadmin',$core->blog->id))
-		{
-			$meta =& $core->meta;
-			$posts = $ap->getRS();
-			while ($posts->fetch())
-			{
-				foreach ($_POST['meta_id'] as $v)
-				{
-					$meta->delPostMeta($posts->post_id,'tag',$v);
-				}
-			}
-			dcPage::addSuccessNotice(sprintf(
-				__(
-					'Tag has been successfully removed from selected entries',
-					'Tags have been successfully removed from selected entries',
-					count($_POST['meta_id']))
-				)
-			);
-			$ap->redirect(true);
-		}
-		else
-		{
-			$meta =& $core->meta;
-			$tags = array();
-
-			foreach ($ap->getIDS() as $id) {
-				$post_tags = $meta->getMetadata(array(
-					'meta_type' => 'tag',
-					'post_id' => (integer) $id))->toStatic()->rows();
-				foreach ($post_tags as $v) {
-					if (isset($tags[$v['meta_id']])) {
-						$tags[$v['meta_id']]++;
-					} else {
-						$tags[$v['meta_id']] = 1;
-					}
-				}
-			}
-			if (empty($tags)) {
-				throw new Exception(__('No tags for selected entries'));
-			}
-			$ap->beginPage(
-				dcPage::breadcrumb(
-						array(
-							html::escapeHTML($core->blog->name) => '',
-							__('Entries') => 'posts.php',
-							__('Remove selected tags from this selection') => ''
-			)));
-			$posts_count = count($_POST['entries']);
-
-			echo
-			'<form action="'.$ap->getURI().'" method="post">'.
-			$ap->getCheckboxes().
-			'<div><p>'.__('Following tags have been found in selected entries:').'</p>';
-
-			foreach ($tags as $k => $n) {
-				$label = '<label class="classic">%s %s</label>';
-				if ($posts_count == $n) {
-					$label = sprintf($label,'%s','<strong>%s</strong>');
-				}
-				echo '<p>'.sprintf($label,
-						form::checkbox(array('meta_id[]'),html::escapeHTML($k)),
-						html::escapeHTML($k)).
-					'</p>';
-			}
-
-			echo
-			'<p><input type="submit" value="'.__('ok').'" />'.
-
-			$core->formNonce().$ap->getHiddenFields().
-			form::hidden(array('action'),'tags_remove').
-			'</p></div></form>';
-			$ap->endPage();
-		}
-
-	}
-
-	public static function postHeaders()
-	{
-		$tag_url = $GLOBALS['core']->blog->url.$GLOBALS['core']->url->getURLFor('tag');
-
-		$opts = $GLOBALS['core']->auth->getOptions();
-		$type = isset($opts['tag_list_format']) ? $opts['tag_list_format'] : 'more';
-
-		return
-		'<script type="text/javascript">'."\n".
-		"//<![CDATA[\n".
-		"var editor_tags_options = {\n".
-			"meta_url : 'plugin.php?p=tags&m=tag_posts&amp;tag=',\n".
-			"list_type : '".html::escapeJS($type)."',\n".
-			"text_confirm_remove : '".html::escapeJS(__('Are you sure you want to remove this tag?'))."',\n".
-			"text_add_meta : '".html::escapeJS(__('Add a tag to this entry'))."',\n".
-			"text_choose : '".html::escapeJS(__('Choose from list'))."',\n".
-			"text_all : '".html::escapeJS(__('all'))."',\n".
-			"text_separation : '".html::escapeJS(__('Enter tags separated by coma'))."',\n".
-		"};\n".
-		"\n//]]>\n".
-		"</script>\n".
-		'<script type="text/javascript" src="index.php?pf=tags/js/jquery.autocomplete.js"></script>'.
-		'<script type="text/javascript" src="index.php?pf=tags/js/post.js"></script>'.
-		'<script type="text/javascript">'."\n".
-		"//<![CDATA[\n".
-		"dotclear.msg.tags_autocomplete = '".html::escapeJS(__('used in %e - frequency %p%'))."';\n".
-		"dotclear.msg.entry = '".html::escapeJS(__('entry'))."';\n".
-		"dotclear.msg.entries = '".html::escapeJS(__('entries'))."';\n".
-		"\n//]]>\n".
-		"</script>\n".
-		'<link rel="stylesheet" type="text/css" href="index.php?pf=tags/style.css" />';
-	}
-
-	public static function adminUserForm($args)
-	{
-		if ($args instanceof dcCore) {
-			$opts = $args->auth->getOptions();
-		}
-		elseif ($args instanceof record) {
-			$opts = $args->options();
-		}
-		else {
-			$opts = array();
-		}
-
-		$combo = array();
-		$combo[__('Short')] = 'more';
-		$combo[__('Extended')] = 'all';
-
-		$value = array_key_exists('tag_list_format',$opts) ? $opts['tag_list_format'] : 'more';
-
-		echo
-		'<p><label for="user_tag_list_format" class="classic">'.__('Tags list format:').'</label> '.
-		form::combo('user_tag_list_format',$combo,$value).
-		'</p>';
-	}
-
-	public static function setTagListFormat($cur,$user_id = null)
-	{
-		if (!is_null($user_id)) {
-			$cur->user_options['tag_list_format'] = $_POST['user_tag_list_format'];
-		}
-	}
-}
Index: lugins/tags/js/legacy-post.js
===================================================================
--- plugins/tags/js/legacy-post.js	(revision 2924)
+++ 	(revision )
@@ -1,62 +1,0 @@
-// Toolbar button for tags
-jsToolBar.prototype.elements.tagSpace = {
-	type: 'space',
-	format:{
-		wysiwyg:true,
-		wiki:true,
-		xhtml:true,
-		markdown:true
-	}
-};
-
-jsToolBar.prototype.elements.tag = {type: 'button', title: 'Keyword', fn:{} };
-jsToolBar.prototype.elements.tag.context = 'post';
-jsToolBar.prototype.elements.tag.icon = 'index.php?pf=tags/img/tag-add.png';
-jsToolBar.prototype.elements.tag.fn.wiki = function() {
-	this.encloseSelection('','',function(str) {
-		if (str == '') { window.alert(dotclear.msg.no_selection); return ''; }
-		if (str.indexOf(',') != -1) {
-			return str;
-		} else {
-			window.dc_tag_editor.addMeta(str);
-			return '['+str+'|tag:'+str+']';
-		}
-	});
-};
-jsToolBar.prototype.elements.tag.fn.markdown = function() {
-	var url = this.elements.tag.url;
-	this.encloseSelection('','',function(str) {
-		if (str == '') { window.alert(dotclear.msg.no_selection); return ''; }
-		if (str.indexOf(',') != -1) {
-			return str;
-		} else {
-			window.dc_tag_editor.addMeta(str);
-			return '['+str+']('+this.stripBaseURL(url+'/'+str)+')';
-		}
-	});
-};
-jsToolBar.prototype.elements.tag.fn.xhtml = function() {
-	var url = this.elements.tag.url;
-	this.encloseSelection('','',function(str) {
-		if (str == '') { window.alert(dotclear.msg.no_selection); return ''; }
-		if (str.indexOf(',') != -1) {
-			return str;
-		} else {
-			window.dc_tag_editor.addMeta(str);
-			return '<a href="'+this.stripBaseURL(url+'/'+str)+'">'+str+'</a>';
-		}
-	});
-};
-jsToolBar.prototype.elements.tag.fn.wysiwyg = function() {
-	var t = this.getSelectedText();
-
-	if (t == '') { window.alert(dotclear.msg.no_selection); return; }
-	if (t.indexOf(',') != -1) { return; }
-
-	var n = this.getSelectedNode();
-	var a = document.createElement('a');
-	a.href = this.stripBaseURL(this.elements.tag.url+'/'+t);
-	a.appendChild(n);
-	this.insertNode(a);
-	window.dc_tag_editor.addMeta(t);
-};
Index: plugins/tags/js/post.js
===================================================================
--- plugins/tags/js/post.js	(revision 2924)
+++ plugins/tags/js/post.js	(revision 2546)
@@ -66,2 +66,52 @@
 
 });
+
+// Toolbar button for tags
+jsToolBar.prototype.elements.tagSpace = {
+	type: 'space',
+	format:{
+		wysiwyg:true,
+		wiki:true,
+		xhtml:true
+	}
+};
+
+jsToolBar.prototype.elements.tag = {type: 'button', title: 'Keyword', fn:{} };
+jsToolBar.prototype.elements.tag.context = 'post';
+jsToolBar.prototype.elements.tag.icon = 'index.php?pf=tags/img/tag-add.png';
+jsToolBar.prototype.elements.tag.fn.wiki = function() {
+	this.encloseSelection('','',function(str) {
+		if (str == '') { window.alert(dotclear.msg.no_selection); return ''; }
+		if (str.indexOf(',') != -1) {
+			return str;
+		} else {
+			window.dc_tag_editor.addMeta(str);
+			return '['+str+'|tag:'+str+']';
+		}
+	});
+};
+jsToolBar.prototype.elements.tag.fn.xhtml = function() {
+	var url = this.elements.tag.url;
+	this.encloseSelection('','',function(str) {
+		if (str == '') { window.alert(dotclear.msg.no_selection); return ''; }
+		if (str.indexOf(',') != -1) {
+			return str;
+		} else {
+			window.dc_tag_editor.addMeta(str);
+			return '<a href="'+this.stripBaseURL(url+'/'+str)+'">'+str+'</a>';
+		}
+	});
+};
+jsToolBar.prototype.elements.tag.fn.wysiwyg = function() {
+	var t = this.getSelectedText();
+
+	if (t == '') { window.alert(dotclear.msg.no_selection); return; }
+	if (t.indexOf(',') != -1) { return; }
+
+	var n = this.getSelectedNode();
+	var a = document.createElement('a');
+	a.href = this.stripBaseURL(this.elements.tag.url+'/'+t);
+	a.appendChild(n);
+	this.insertNode(a);
+	window.dc_tag_editor.addMeta(t);
+};
Index: plugins/themeEditor/_define.php
===================================================================
--- plugins/themeEditor/_define.php	(revision 2890)
+++ plugins/themeEditor/_define.php	(revision 2663)
@@ -16,5 +16,5 @@
 	/* Description*/		"Theme Editor",
 	/* Author */			"Olivier Meunier",
-	/* Version */			'1.2',
+	/* Version */			'1.1',
 	array(
 		'type'		=>		'plugin'
Index: plugins/themeEditor/class.themeEditor.php
===================================================================
--- plugins/themeEditor/class.themeEditor.php	(revision 2890)
+++ plugins/themeEditor/class.themeEditor.php	(revision 2862)
@@ -20,5 +20,4 @@
 	protected $tplset_theme;
 
-	protected $parent_name;
 	protected $tplset_name;
 
@@ -39,5 +38,4 @@
 			if ($parent_theme) {
 				$this->parent_theme = path::real($this->core->blog->themes_path.'/'.$parent_theme);
-				$this->parent_name = $parent_theme;
 			}
 			$tplset = $this->core->themes->moduleInfo($this->core->blog->settings->system->theme,'tplset');
@@ -80,8 +78,6 @@
 			}
 			$list .= ($list_theme != '' ? sprintf('<li class="group-file">'.__('From theme:').'<ul>%s</ul></li>',$list_theme) : '');
-			$list .= ($list_parent != '' ? sprintf('<li class="group-file">'.__('From parent:').' %s<ul>%s</ul></li>',
-				$this->parent_name,$list_parent) : '');
-			$list .= ($list_tpl != '' ? sprintf('<li class="group-file">'.__('From template set:').' %s<ul>%s</ul></li>',
-				$this->tplset_name,$list_tpl) : '');
+			$list .= ($list_parent != '' ? sprintf('<li class="group-file">'.__('From parent:').'<ul>%s</ul></li>',$list_parent) : '');
+			$list .= ($list_tpl != '' ? sprintf('<li class="group-file">'.__('From template set:').'<ul>%s</ul></li>',$list_tpl) : '');
 		} else {
 			foreach ($files as $k => $v)
