Index: .hgignore
===================================================================
--- .hgignore	(revision 1171)
+++ .hgignore	(revision 2931)
@@ -3,2 +3,3 @@
 \.htaccess
 public
+behat.yml
Index: Makefile
===================================================================
--- Makefile	(revision 2801)
+++ Makefile	(revision 2931)
@@ -19,7 +19,8 @@
 
 	## Remove tests directories and test stuff
-	rm -fr ./$(DC)/inc/libs/clearbricks/tests ./$(DC)/inc/libs/clearbricks/composer.* \
-	       ./$(DC)/inc/libs/clearbricks/.atoum.* ./$(DC)/inc/libs/clearbricks/vendor \
-	       ./$(DC)/inc/libs/clearbricks/bin ./$(DC)/inc/libs/clearbricks/_dist
+	rm -fr ./$(DC)/inc/libs/clearbricks/tests ./$(DC)/inc/libs/clearbricks/composer.*	\
+	       ./$(DC)/inc/libs/clearbricks/.atoum.* ./$(DC)/inc/libs/clearbricks/vendor	\
+	       ./$(DC)/inc/libs/clearbricks/bin ./$(DC)/inc/libs/clearbricks/_dist		\
+	       ./$(DC)/features ./$(DC)/travis ./$(DC)/behat.yml.dist ./$(DC)/composer.*
 
 	## Create cache, db, plugins and public folders
@@ -67,4 +68,5 @@
 	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/preferences.php
===================================================================
--- admin/preferences.php	(revision 2853)
+++ admin/preferences.php	(revision 2899)
@@ -352,26 +352,4 @@
 );
 
-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: behat.yml.dist
===================================================================
--- behat.yml.dist	(revision 2931)
+++ behat.yml.dist	(revision 2931)
@@ -0,0 +1,25 @@
+default:
+  context:
+    parameters:
+      base_url: http://localhost:1080
+
+      config_file: inc/config.php
+      sql_init_file: features/sql/db_init.sql
+      sql_cleanup_file: features/sql/db_cleanup.sql
+
+  extensions:
+    Behat\MinkExtension\Extension:
+      base_url: http://localhost:1080
+      goutte: ~
+
+  paths:
+    features:  features
+    bootstrap: features/bootstrap
+
+annotations:
+  paths:
+    features: features/annotations
+
+closures:
+  paths:
+    features: features/closures
Index: bin/atoum
===================================================================
--- bin/atoum	(revision 2931)
+++ bin/atoum	(revision 2931)
@@ -0,0 +1,1 @@
+../vendor/atoum/atoum/bin/atoum
Index: bin/behat
===================================================================
--- bin/behat	(revision 2931)
+++ bin/behat	(revision 2931)
@@ -0,0 +1,1 @@
+../vendor/behat/behat/bin/behat
Index: build-tools/setup.php
===================================================================
--- build-tools/setup.php	(revision 2933)
+++ build-tools/setup.php	(revision 2933)
@@ -0,0 +1,33 @@
+<?php
+$license_block = <<<EOF
+# -- BEGIN LICENSE BLOCK ---------------------------------------
+#
+# This file is part of Dotclear 2.
+#
+# Copyright (c) 2003-2015 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 -----------------------------------------
+EOF;
+
+$dc_base = dirname(__FILE__).'/..';
+$php_exec = $_SERVER['_'];
+
+$opts = array(
+	'http' => array()
+);
+if (getenv('http_proxy') !== false) {
+	$opts['http']['proxy'] = 'tcp://'.getenv('http_proxy');
+}
+$context = stream_context_create($opts);
+
+if (!file_exists($dc_base.'/composer.phar')) {
+	echo "Downloading composer.phar\n";
+	$composer_installer = file_get_contents('https://getcomposer.org/composer.phar',false,$context);
+	file_put_contents($dc_base.'/composer.phar',$composer_installer);
+}
+chdir($dc_base);
+echo 'Running '.$php_exec.' composer.phar install'."\n";
+passthru ($php_exec.' composer.phar install');
Index: composer.json
===================================================================
--- composer.json	(revision 2931)
+++ composer.json	(revision 2931)
@@ -0,0 +1,32 @@
+{
+	"name": "dotclear/dotclear",
+	"description": "Dotclear is an open-source web publishing software.",
+	"license": "GPL-V2",
+	"authors": [
+		{
+			"name": "Dotclear Team",
+			"email": "dev@dotclear.org"
+		}
+	],
+	"minimum-stability": "dev",
+	"require": {
+		"php": ">5.3.0"
+	},
+	"require-dev": {
+		"atoum/atoum": "dev-master",
+		"fzaninotto/faker": "dev-master",
+		"behat/behat": "<3",
+		"behat/common-contexts": "1.2.*",
+		"behat/mink": ">=1.4,<1.5-dev",
+		"symfony/dom-crawler": ">=2.0,<2.4-dev",
+		"symfony/translation": "<2.3.0",
+		"behat/mink-extension": "1.3.*",
+		"behat/mink-goutte-driver": "1.*"
+	},
+	"config": {
+		"bin-dir": "bin/"
+	},
+	"autoload": {
+		"psr-0": { "": "" }
+	}
+}
Index: composer.lock
===================================================================
--- composer.lock	(revision 2931)
+++ composer.lock	(revision 2931)
@@ -0,0 +1,2348 @@
+{
+    "_readme": [
+        "This file locks the dependencies of your project to a known state",
+        "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
+        "This file is @generated automatically"
+    ],
+    "hash": "bc439eb42a30bc88c556bd61b674de78",
+    "packages": [],
+    "packages-dev": [
+        {
+            "name": "atoum/atoum",
+            "version": "dev-master",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/atoum/atoum.git",
+                "reference": "cb723f92f3ed7b95c158f224035f403a559ed366"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/atoum/atoum/zipball/cb723f92f3ed7b95c158f224035f403a559ed366",
+                "reference": "cb723f92f3ed7b95c158f224035f403a559ed366",
+                "shasum": ""
+            },
+            "require": {
+                "ext-hash": "*",
+                "ext-json": "*",
+                "ext-session": "*",
+                "ext-tokenizer": "*",
+                "ext-xml": "*",
+                "php": ">=5.3.3"
+            },
+            "replace": {
+                "mageekguy/atoum": "*"
+            },
+            "suggest": {
+                "ext-mbstring": "Provides support for UTF-8 strings"
+            },
+            "bin": [
+                "bin/atoum"
+            ],
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.x-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "classes/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD"
+            ],
+            "authors": [
+                {
+                    "name": "Frédéric Hardy",
+                    "email": "frederic.hardy@atoum.org",
+                    "homepage": "http://blog.mageekbox.net"
+                },
+                {
+                    "name": "François Dussert",
+                    "email": "francois.dussert@atoum.org"
+                },
+                {
+                    "name": "Gérald Croes",
+                    "email": "gerald.croes@atoum.org"
+                },
+                {
+                    "name": "Julien Bianchi",
+                    "email": "julien.bianchi@atoum.org"
+                },
+                {
+                    "name": "Ludovic Fleury",
+                    "email": "ludovic.fleury@atoum.org"
+                }
+            ],
+            "description": "Simple modern and intuitive unit testing framework for PHP 5.3+",
+            "homepage": "http://www.atoum.org",
+            "keywords": [
+                "TDD",
+                "atoum",
+                "test",
+                "unit testing"
+            ],
+            "time": "2015-01-19 13:03:03"
+        },
+        {
+            "name": "behat/behat",
+            "version": "2.5.x-dev",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/Behat/Behat.git",
+                "reference": "51d9a2fb1c802a681c2717e48b4b8d184595bd18"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/Behat/Behat/zipball/51d9a2fb1c802a681c2717e48b4b8d184595bd18",
+                "reference": "51d9a2fb1c802a681c2717e48b4b8d184595bd18",
+                "shasum": ""
+            },
+            "require": {
+                "behat/gherkin": "~2.3.0",
+                "php": ">=5.3.1",
+                "symfony/config": "~2.0",
+                "symfony/console": "~2.0",
+                "symfony/dependency-injection": "~2.0",
+                "symfony/event-dispatcher": "~2.0",
+                "symfony/finder": "~2.0",
+                "symfony/translation": "~2.0",
+                "symfony/yaml": "~2.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~3.7.19"
+            },
+            "suggest": {
+                "behat/mink-extension": "for integration with Mink testing framework",
+                "behat/symfony2-extension": "for integration with Symfony2 web framework",
+                "behat/yii-extension": "for integration with Yii web framework"
+            },
+            "bin": [
+                "bin/behat"
+            ],
+            "type": "library",
+            "autoload": {
+                "psr-0": {
+                    "Behat\\Behat": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Konstantin Kudryashov",
+                    "email": "ever.zet@gmail.com",
+                    "homepage": "http://everzet.com"
+                }
+            ],
+            "description": "Scenario-oriented BDD framework for PHP 5.3",
+            "homepage": "http://behat.org/",
+            "keywords": [
+                "BDD",
+                "Behat",
+                "Symfony2"
+            ],
+            "time": "2015-01-23 22:15:44"
+        },
+        {
+            "name": "behat/common-contexts",
+            "version": "dev-master",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/Behat/CommonContexts.git",
+                "reference": "570fb7b5abae498c21c2e39cad9c557b7c8ce7e0"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/Behat/CommonContexts/zipball/570fb7b5abae498c21c2e39cad9c557b7c8ce7e0",
+                "reference": "570fb7b5abae498c21c2e39cad9c557b7c8ce7e0",
+                "shasum": ""
+            },
+            "require": {
+                "behat/behat": "~2.2",
+                "php": ">=5.3.1",
+                "phpunit/phpunit": "~4.0"
+            },
+            "suggest": {
+                "behat/mink-extension": "*",
+                "behat/symfony2-extension": "*",
+                "doctrine/data-fixtures": "*",
+                "doctrine/doctrine-bundle": "*",
+                "kriswallsmith/buzz": "~0.5"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.2.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "Behat\\CommonContexts": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Johannes Schmitt",
+                    "email": "schmittjoh@gmail.com",
+                    "homepage": "https://github.com/schmittjoh",
+                    "role": "Developer of wrapped JMSSerializerBundle"
+                },
+                {
+                    "name": "Konstantin Kudryashov",
+                    "email": "ever.zet@gmail.com",
+                    "homepage": "http://everzet.com"
+                },
+                {
+                    "name": "Jakub Zalas",
+                    "email": "jakub@zalas.pl",
+                    "homepage": "http://www.zalas.eu/"
+                },
+                {
+                    "name": "Geoffrey Bachelet",
+                    "email": "geoffrey.bachelet@gmail.com",
+                    "homepage": "https://github.com/ubermuda"
+                }
+            ],
+            "description": "Commonly used contexts for Behat",
+            "homepage": "http://behat.org/",
+            "keywords": [
+                "BDD",
+                "Behat",
+                "Context",
+                "Symfony2"
+            ],
+            "time": "2014-05-07 08:29:47"
+        },
+        {
+            "name": "behat/gherkin",
+            "version": "2.3.x-dev",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/Behat/Gherkin.git",
+                "reference": "c32e15d92e1a2ce399a1a1c5be7afd965176e86c"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/Behat/Gherkin/zipball/c32e15d92e1a2ce399a1a1c5be7afd965176e86c",
+                "reference": "c32e15d92e1a2ce399a1a1c5be7afd965176e86c",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.1",
+                "symfony/finder": "~2.0"
+            },
+            "require-dev": {
+                "symfony/config": "~2.0",
+                "symfony/translation": "~2.0",
+                "symfony/yaml": "~2.0"
+            },
+            "suggest": {
+                "symfony/config": "If you want to use Config component to manage resources",
+                "symfony/translation": "If you want to use Symfony2 translations adapter",
+                "symfony/yaml": "If you want to parse features, represented in YAML files"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-develop": "2.2-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "Behat\\Gherkin": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Konstantin Kudryashov",
+                    "email": "ever.zet@gmail.com",
+                    "homepage": "http://everzet.com"
+                }
+            ],
+            "description": "Gherkin DSL parser for PHP 5.3",
+            "homepage": "http://behat.org/",
+            "keywords": [
+                "BDD",
+                "Behat",
+                "DSL",
+                "Symfony2",
+                "parser"
+            ],
+            "time": "2014-06-06 00:48:18"
+        },
+        {
+            "name": "behat/mink",
+            "version": "v1.4.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/minkphp/Mink.git",
+                "reference": "0817070a6e2ec9f475fad9bfb81a962c462eb934"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/minkphp/Mink/zipball/0817070a6e2ec9f475fad9bfb81a962c462eb934",
+                "reference": "0817070a6e2ec9f475fad9bfb81a962c462eb934",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.1",
+                "symfony/css-selector": ">=2.0,<2.4-dev"
+            },
+            "suggest": {
+                "behat/mink-browserkit-driver": "extremely fast headless driver for Symfony\\Kernel-based apps (Sf2, Silex)",
+                "behat/mink-goutte-driver": "fast headless driver for any app without JS emulation",
+                "behat/mink-selenium2-driver": "slow, but JS-enabled driver for any app (requires Selenium2)",
+                "behat/mink-zombie-driver": "fast and JS-enabled headless driver for any app (requires node.js)"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-develop": "1.4.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "Behat\\Mink": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Konstantin Kudryashov",
+                    "email": "ever.zet@gmail.com",
+                    "homepage": "http://everzet.com"
+                }
+            ],
+            "description": "Web acceptance testing framework for PHP 5.3",
+            "homepage": "http://mink.behat.org/",
+            "keywords": [
+                "browser",
+                "testing",
+                "web"
+            ],
+            "time": "2013-03-02 15:53:18"
+        },
+        {
+            "name": "behat/mink-browserkit-driver",
+            "version": "v1.0.5",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/minkphp/MinkBrowserKitDriver.git",
+                "reference": "f2771b5fc4dbc233859addf37a7d150852f78418"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/minkphp/MinkBrowserKitDriver/zipball/f2771b5fc4dbc233859addf37a7d150852f78418",
+                "reference": "f2771b5fc4dbc233859addf37a7d150852f78418",
+                "shasum": ""
+            },
+            "require": {
+                "behat/mink": "~1.4.3",
+                "php": ">=5.3.1",
+                "symfony/browser-kit": "~2.0",
+                "symfony/dom-crawler": "~2.0"
+            },
+            "require-dev": {
+                "silex/silex": "@dev"
+            },
+            "type": "mink-driver",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "Behat\\Mink\\Driver": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Konstantin Kudryashov",
+                    "email": "ever.zet@gmail.com",
+                    "homepage": "http://everzet.com"
+                }
+            ],
+            "description": "Symfony2 BrowserKit driver for Mink framework",
+            "homepage": "http://mink.behat.org/",
+            "keywords": [
+                "Mink",
+                "Symfony2",
+                "browser",
+                "testing"
+            ],
+            "time": "2013-04-13 12:17:15"
+        },
+        {
+            "name": "behat/mink-extension",
+            "version": "v1.3.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/Behat/MinkExtension.git",
+                "reference": "0642b680b613fdd6cb774debacf65a0d0d1f08e8"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/Behat/MinkExtension/zipball/0642b680b613fdd6cb774debacf65a0d0d1f08e8",
+                "reference": "0642b680b613fdd6cb774debacf65a0d0d1f08e8",
+                "shasum": ""
+            },
+            "require": {
+                "behat/behat": "~2.5.0",
+                "behat/mink": ">=1.4.3,<1.6-dev",
+                "php": ">=5.3.2",
+                "symfony/config": "~2.2"
+            },
+            "require-dev": {
+                "behat/mink-goutte-driver": "~1.0"
+            },
+            "type": "behat-extension",
+            "autoload": {
+                "psr-0": {
+                    "Behat\\MinkExtension": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Konstantin Kudryashov",
+                    "email": "ever.zet@gmail.com",
+                    "homepage": "http://everzet.com"
+                }
+            ],
+            "description": "Mink extension for Behat",
+            "homepage": "http://mink.behat.org",
+            "keywords": [
+                "browser",
+                "gui",
+                "test",
+                "web"
+            ],
+            "time": "2014-04-27 11:55:27"
+        },
+        {
+            "name": "behat/mink-goutte-driver",
+            "version": "v1.0.9",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/minkphp/MinkGoutteDriver.git",
+                "reference": "fa1b073b48761464feb0b05e6825da44b20118d8"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/minkphp/MinkGoutteDriver/zipball/fa1b073b48761464feb0b05e6825da44b20118d8",
+                "reference": "fa1b073b48761464feb0b05e6825da44b20118d8",
+                "shasum": ""
+            },
+            "require": {
+                "behat/mink-browserkit-driver": ">=1.0.5,<1.2.0",
+                "fabpot/goutte": "~1.0.1",
+                "php": ">=5.3.1"
+            },
+            "type": "mink-driver",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "Behat\\Mink\\Driver": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Konstantin Kudryashov",
+                    "email": "ever.zet@gmail.com",
+                    "homepage": "http://everzet.com"
+                }
+            ],
+            "description": "Goutte driver for Mink framework",
+            "homepage": "http://mink.behat.org/",
+            "keywords": [
+                "browser",
+                "goutte",
+                "headless",
+                "testing"
+            ],
+            "time": "2013-07-03 18:43:54"
+        },
+        {
+            "name": "doctrine/instantiator",
+            "version": "dev-master",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/doctrine/instantiator.git",
+                "reference": "3d9669e597439e8d205baf315efb757038fb4dea"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/doctrine/instantiator/zipball/3d9669e597439e8d205baf315efb757038fb4dea",
+                "reference": "3d9669e597439e8d205baf315efb757038fb4dea",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3,<8.0-DEV"
+            },
+            "require-dev": {
+                "athletic/athletic": "~0.1.8",
+                "ext-pdo": "*",
+                "ext-phar": "*",
+                "phpunit/phpunit": "~4.0",
+                "squizlabs/php_codesniffer": "~2.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Marco Pivetta",
+                    "email": "ocramius@gmail.com",
+                    "homepage": "http://ocramius.github.com/"
+                }
+            ],
+            "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
+            "homepage": "https://github.com/doctrine/instantiator",
+            "keywords": [
+                "constructor",
+                "instantiate"
+            ],
+            "time": "2015-01-16 19:29:51"
+        },
+        {
+            "name": "fabpot/goutte",
+            "version": "1.0.x-dev",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/FriendsOfPHP/Goutte.git",
+                "reference": "794b196e76bdd37b5155cdecbad311f0a3b07625"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/FriendsOfPHP/Goutte/zipball/794b196e76bdd37b5155cdecbad311f0a3b07625",
+                "reference": "794b196e76bdd37b5155cdecbad311f0a3b07625",
+                "shasum": ""
+            },
+            "require": {
+                "ext-curl": "*",
+                "guzzle/http": "~3.1",
+                "php": ">=5.3.0",
+                "symfony/browser-kit": "~2.1",
+                "symfony/css-selector": "~2.1",
+                "symfony/dom-crawler": "~2.1",
+                "symfony/finder": "~2.1",
+                "symfony/process": "~2.1"
+            },
+            "require-dev": {
+                "guzzle/plugin-history": "~3.1",
+                "guzzle/plugin-mock": "~3.1"
+            },
+            "type": "application",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "Goutte": "."
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                }
+            ],
+            "description": "A simple PHP Web Scraper",
+            "homepage": "https://github.com/fabpot/Goutte",
+            "keywords": [
+                "scraper"
+            ],
+            "time": "2014-10-09 15:52:51"
+        },
+        {
+            "name": "fzaninotto/faker",
+            "version": "dev-master",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/fzaninotto/Faker.git",
+                "reference": "9b9ec8d3d3d1f05df2fddb49a6257bbc235d32ea"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/fzaninotto/Faker/zipball/9b9ec8d3d3d1f05df2fddb49a6257bbc235d32ea",
+                "reference": "9b9ec8d3d3d1f05df2fddb49a6257bbc235d32ea",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~4.0",
+                "squizlabs/php_codesniffer": "~1.5"
+            },
+            "suggest": {
+                "ext-intl": "*"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.5.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Faker\\": "src/Faker/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "François Zaninotto"
+                }
+            ],
+            "description": "Faker is a PHP library that generates fake data for you.",
+            "keywords": [
+                "data",
+                "faker",
+                "fixtures"
+            ],
+            "time": "2015-01-26 15:14:28"
+        },
+        {
+            "name": "guzzle/common",
+            "version": "v3.9.2",
+            "target-dir": "Guzzle/Common",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/guzzle/common.git",
+                "reference": "2e36af7cf2ce3ea1f2d7c2831843b883a8e7b7dc"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/guzzle/common/zipball/2e36af7cf2ce3ea1f2d7c2831843b883a8e7b7dc",
+                "reference": "2e36af7cf2ce3ea1f2d7c2831843b883a8e7b7dc",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.2",
+                "symfony/event-dispatcher": ">=2.1"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.7-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "Guzzle\\Common": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "description": "Common libraries used by Guzzle",
+            "homepage": "http://guzzlephp.org/",
+            "keywords": [
+                "collection",
+                "common",
+                "event",
+                "exception"
+            ],
+            "time": "2014-08-11 04:32:36"
+        },
+        {
+            "name": "guzzle/http",
+            "version": "v3.9.2",
+            "target-dir": "Guzzle/Http",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/guzzle/http.git",
+                "reference": "1e8dd1e2ba9dc42332396f39fbfab950b2301dc5"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/guzzle/http/zipball/1e8dd1e2ba9dc42332396f39fbfab950b2301dc5",
+                "reference": "1e8dd1e2ba9dc42332396f39fbfab950b2301dc5",
+                "shasum": ""
+            },
+            "require": {
+                "guzzle/common": "self.version",
+                "guzzle/parser": "self.version",
+                "guzzle/stream": "self.version",
+                "php": ">=5.3.2"
+            },
+            "suggest": {
+                "ext-curl": "*"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.7-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "Guzzle\\Http": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Michael Dowling",
+                    "email": "mtdowling@gmail.com",
+                    "homepage": "https://github.com/mtdowling"
+                }
+            ],
+            "description": "HTTP libraries used by Guzzle",
+            "homepage": "http://guzzlephp.org/",
+            "keywords": [
+                "Guzzle",
+                "client",
+                "curl",
+                "http",
+                "http client"
+            ],
+            "time": "2014-08-11 04:32:36"
+        },
+        {
+            "name": "guzzle/parser",
+            "version": "v3.9.2",
+            "target-dir": "Guzzle/Parser",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/guzzle/parser.git",
+                "reference": "6874d171318a8e93eb6d224cf85e4678490b625c"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/guzzle/parser/zipball/6874d171318a8e93eb6d224cf85e4678490b625c",
+                "reference": "6874d171318a8e93eb6d224cf85e4678490b625c",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.2"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.7-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "Guzzle\\Parser": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "description": "Interchangeable parsers used by Guzzle",
+            "homepage": "http://guzzlephp.org/",
+            "keywords": [
+                "URI Template",
+                "cookie",
+                "http",
+                "message",
+                "url"
+            ],
+            "time": "2014-02-05 18:29:46"
+        },
+        {
+            "name": "guzzle/stream",
+            "version": "v3.9.2",
+            "target-dir": "Guzzle/Stream",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/guzzle/stream.git",
+                "reference": "60c7fed02e98d2c518dae8f97874c8f4622100f0"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/guzzle/stream/zipball/60c7fed02e98d2c518dae8f97874c8f4622100f0",
+                "reference": "60c7fed02e98d2c518dae8f97874c8f4622100f0",
+                "shasum": ""
+            },
+            "require": {
+                "guzzle/common": "self.version",
+                "php": ">=5.3.2"
+            },
+            "suggest": {
+                "guzzle/http": "To convert Guzzle request objects to PHP streams"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.7-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "Guzzle\\Stream": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Michael Dowling",
+                    "email": "mtdowling@gmail.com",
+                    "homepage": "https://github.com/mtdowling"
+                }
+            ],
+            "description": "Guzzle stream wrapper component",
+            "homepage": "http://guzzlephp.org/",
+            "keywords": [
+                "Guzzle",
+                "component",
+                "stream"
+            ],
+            "time": "2014-05-01 21:36:02"
+        },
+        {
+            "name": "phpdocumentor/reflection-docblock",
+            "version": "dev-master",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
+                "reference": "fd0ac2007401505fb596fdfb859ec4e103d69e55"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/fd0ac2007401505fb596fdfb859ec4e103d69e55",
+                "reference": "fd0ac2007401505fb596fdfb859ec4e103d69e55",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~4.0"
+            },
+            "suggest": {
+                "dflydev/markdown": "~1.0",
+                "erusev/parsedown": "~1.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "phpDocumentor": [
+                        "src/"
+                    ]
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Mike van Riel",
+                    "email": "mike.vanriel@naenius.com"
+                }
+            ],
+            "time": "2014-09-02 14:26:20"
+        },
+        {
+            "name": "phpspec/prophecy",
+            "version": "dev-master",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/phpspec/prophecy.git",
+                "reference": "d647e27524f9f7edc37baf63a114b52f5975808f"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/phpspec/prophecy/zipball/d647e27524f9f7edc37baf63a114b52f5975808f",
+                "reference": "d647e27524f9f7edc37baf63a114b52f5975808f",
+                "shasum": ""
+            },
+            "require": {
+                "doctrine/instantiator": "^1.0.2",
+                "phpdocumentor/reflection-docblock": "~2.0",
+                "sebastian/comparator": "~1.1"
+            },
+            "require-dev": {
+                "phpspec/phpspec": "~2.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.3.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "Prophecy\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Konstantin Kudryashov",
+                    "email": "ever.zet@gmail.com",
+                    "homepage": "http://everzet.com"
+                },
+                {
+                    "name": "Marcello Duarte",
+                    "email": "marcello.duarte@gmail.com"
+                }
+            ],
+            "description": "Highly opinionated mocking framework for PHP 5.3+",
+            "homepage": "https://github.com/phpspec/prophecy",
+            "keywords": [
+                "Double",
+                "Dummy",
+                "fake",
+                "mock",
+                "spy",
+                "stub"
+            ],
+            "time": "2015-01-26 10:50:16"
+        },
+        {
+            "name": "phpunit/php-code-coverage",
+            "version": "dev-master",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
+                "reference": "34cc484af1ca149188d0d9e91412191e398e0b67"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/34cc484af1ca149188d0d9e91412191e398e0b67",
+                "reference": "34cc484af1ca149188d0d9e91412191e398e0b67",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3",
+                "phpunit/php-file-iterator": "~1.3",
+                "phpunit/php-text-template": "~1.2",
+                "phpunit/php-token-stream": "~1.3",
+                "sebastian/environment": "~1.0",
+                "sebastian/version": "~1.0"
+            },
+            "require-dev": {
+                "ext-xdebug": ">=2.1.4",
+                "phpunit/phpunit": "~4"
+            },
+            "suggest": {
+                "ext-dom": "*",
+                "ext-xdebug": ">=2.2.1",
+                "ext-xmlwriter": "*"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.0.x-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sb@sebastian-bergmann.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
+            "homepage": "https://github.com/sebastianbergmann/php-code-coverage",
+            "keywords": [
+                "coverage",
+                "testing",
+                "xunit"
+            ],
+            "time": "2015-01-24 10:06:35"
+        },
+        {
+            "name": "phpunit/php-file-iterator",
+            "version": "1.3.4",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
+                "reference": "acd690379117b042d1c8af1fafd61bde001bf6bb"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/acd690379117b042d1c8af1fafd61bde001bf6bb",
+                "reference": "acd690379117b042d1c8af1fafd61bde001bf6bb",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "type": "library",
+            "autoload": {
+                "classmap": [
+                    "File/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "include-path": [
+                ""
+            ],
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sb@sebastian-bergmann.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "FilterIterator implementation that filters files based on a list of suffixes.",
+            "homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
+            "keywords": [
+                "filesystem",
+                "iterator"
+            ],
+            "time": "2013-10-10 15:34:57"
+        },
+        {
+            "name": "phpunit/php-text-template",
+            "version": "1.2.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/php-text-template.git",
+                "reference": "206dfefc0ffe9cebf65c413e3d0e809c82fbf00a"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/206dfefc0ffe9cebf65c413e3d0e809c82fbf00a",
+                "reference": "206dfefc0ffe9cebf65c413e3d0e809c82fbf00a",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "type": "library",
+            "autoload": {
+                "classmap": [
+                    "Text/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "include-path": [
+                ""
+            ],
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sb@sebastian-bergmann.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "Simple template engine.",
+            "homepage": "https://github.com/sebastianbergmann/php-text-template/",
+            "keywords": [
+                "template"
+            ],
+            "time": "2014-01-30 17:20:04"
+        },
+        {
+            "name": "phpunit/php-timer",
+            "version": "1.0.5",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/php-timer.git",
+                "reference": "19689d4354b295ee3d8c54b4f42c3efb69cbc17c"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/19689d4354b295ee3d8c54b4f42c3efb69cbc17c",
+                "reference": "19689d4354b295ee3d8c54b4f42c3efb69cbc17c",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "type": "library",
+            "autoload": {
+                "classmap": [
+                    "PHP/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "include-path": [
+                ""
+            ],
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sb@sebastian-bergmann.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "Utility class for timing",
+            "homepage": "https://github.com/sebastianbergmann/php-timer/",
+            "keywords": [
+                "timer"
+            ],
+            "time": "2013-08-02 07:42:54"
+        },
+        {
+            "name": "phpunit/php-token-stream",
+            "version": "dev-master",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/php-token-stream.git",
+                "reference": "db32c18eba00b121c145575fcbcd4d4d24e6db74"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/db32c18eba00b121c145575fcbcd4d4d24e6db74",
+                "reference": "db32c18eba00b121c145575fcbcd4d4d24e6db74",
+                "shasum": ""
+            },
+            "require": {
+                "ext-tokenizer": "*",
+                "php": ">=5.3.3"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~4.2"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.4-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de"
+                }
+            ],
+            "description": "Wrapper around PHP's tokenizer extension.",
+            "homepage": "https://github.com/sebastianbergmann/php-token-stream/",
+            "keywords": [
+                "tokenizer"
+            ],
+            "time": "2015-01-17 09:51:32"
+        },
+        {
+            "name": "phpunit/phpunit",
+            "version": "dev-master",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/phpunit.git",
+                "reference": "3d6600da7eb6cb37d25143eea3fd09875c3ede49"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/3d6600da7eb6cb37d25143eea3fd09875c3ede49",
+                "reference": "3d6600da7eb6cb37d25143eea3fd09875c3ede49",
+                "shasum": ""
+            },
+            "require": {
+                "ext-dom": "*",
+                "ext-json": "*",
+                "ext-pcre": "*",
+                "ext-reflection": "*",
+                "ext-spl": "*",
+                "php": ">=5.3.3",
+                "phpspec/prophecy": "~1.3.1",
+                "phpunit/php-code-coverage": "~2.0",
+                "phpunit/php-file-iterator": "~1.3",
+                "phpunit/php-text-template": "~1.2",
+                "phpunit/php-timer": "~1.0",
+                "phpunit/phpunit-mock-objects": "~2.3",
+                "sebastian/comparator": "~1.1",
+                "sebastian/diff": "~1.2",
+                "sebastian/environment": "~1.2",
+                "sebastian/exporter": "~1.0",
+                "sebastian/global-state": "~1.0",
+                "sebastian/version": "~1.0",
+                "symfony/yaml": "~2.1|~3.0"
+            },
+            "suggest": {
+                "phpunit/php-invoker": "~1.1"
+            },
+            "bin": [
+                "phpunit"
+            ],
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "4.6.x-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "The PHP Unit Testing framework.",
+            "homepage": "https://phpunit.de/",
+            "keywords": [
+                "phpunit",
+                "testing",
+                "xunit"
+            ],
+            "time": "2015-01-24 14:25:39"
+        },
+        {
+            "name": "phpunit/phpunit-mock-objects",
+            "version": "dev-master",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git",
+                "reference": "b752b41e3fead4feee99f3a2f2972cef517abb8b"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/b752b41e3fead4feee99f3a2f2972cef517abb8b",
+                "reference": "b752b41e3fead4feee99f3a2f2972cef517abb8b",
+                "shasum": ""
+            },
+            "require": {
+                "doctrine/instantiator": "~1.0,>=1.0.2",
+                "php": ">=5.3.3",
+                "phpunit/php-text-template": "~1.2"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "4.4.*@dev"
+            },
+            "suggest": {
+                "ext-soap": "*"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.4.x-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sb@sebastian-bergmann.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "Mock Object library for PHPUnit",
+            "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/",
+            "keywords": [
+                "mock",
+                "xunit"
+            ],
+            "time": "2015-01-18 10:44:19"
+        },
+        {
+            "name": "sebastian/comparator",
+            "version": "dev-master",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/comparator.git",
+                "reference": "6a1e846331bb3cc1a305168125d047fb86260e3d"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/6a1e846331bb3cc1a305168125d047fb86260e3d",
+                "reference": "6a1e846331bb3cc1a305168125d047fb86260e3d",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3",
+                "sebastian/diff": "~1.1",
+                "sebastian/exporter": "~1.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~4.1"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.1.x-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Jeff Welch",
+                    "email": "whatthejeff@gmail.com"
+                },
+                {
+                    "name": "Volker Dusch",
+                    "email": "github@wallbash.com"
+                },
+                {
+                    "name": "Bernhard Schussek",
+                    "email": "bschussek@2bepublished.at"
+                },
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de"
+                }
+            ],
+            "description": "Provides the functionality to compare PHP values for equality",
+            "homepage": "http://www.github.com/sebastianbergmann/comparator",
+            "keywords": [
+                "comparator",
+                "compare",
+                "equality"
+            ],
+            "time": "2015-01-05 16:29:00"
+        },
+        {
+            "name": "sebastian/diff",
+            "version": "dev-master",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/diff.git",
+                "reference": "6dc90302a4cdf8486c221a0ad3a4da53859fcfa5"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/6dc90302a4cdf8486c221a0ad3a4da53859fcfa5",
+                "reference": "6dc90302a4cdf8486c221a0ad3a4da53859fcfa5",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~4.2"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.2-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Kore Nordmann",
+                    "email": "mail@kore-nordmann.de"
+                },
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de"
+                }
+            ],
+            "description": "Diff implementation",
+            "homepage": "http://www.github.com/sebastianbergmann/diff",
+            "keywords": [
+                "diff"
+            ],
+            "time": "2015-01-01 09:20:29"
+        },
+        {
+            "name": "sebastian/environment",
+            "version": "dev-master",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/environment.git",
+                "reference": "5a8c7d31914337b69923db26c4221b81ff5a196e"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/5a8c7d31914337b69923db26c4221b81ff5a196e",
+                "reference": "5a8c7d31914337b69923db26c4221b81ff5a196e",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~4.4"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.3.x-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de"
+                }
+            ],
+            "description": "Provides functionality to handle HHVM/PHP environments",
+            "homepage": "http://www.github.com/sebastianbergmann/environment",
+            "keywords": [
+                "Xdebug",
+                "environment",
+                "hhvm"
+            ],
+            "time": "2015-01-01 10:01:08"
+        },
+        {
+            "name": "sebastian/exporter",
+            "version": "dev-master",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/exporter.git",
+                "reference": "35ab8d385eef068186c83e23ae83c96b0288b3ee"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/35ab8d385eef068186c83e23ae83c96b0288b3ee",
+                "reference": "35ab8d385eef068186c83e23ae83c96b0288b3ee",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3",
+                "sebastian/recursion-context": "~1.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~4.4"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.1.x-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Jeff Welch",
+                    "email": "whatthejeff@gmail.com"
+                },
+                {
+                    "name": "Volker Dusch",
+                    "email": "github@wallbash.com"
+                },
+                {
+                    "name": "Bernhard Schussek",
+                    "email": "bschussek@2bepublished.at"
+                },
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de"
+                },
+                {
+                    "name": "Adam Harvey",
+                    "email": "aharvey@php.net"
+                }
+            ],
+            "description": "Provides the functionality to export PHP variables for visualization",
+            "homepage": "http://www.github.com/sebastianbergmann/exporter",
+            "keywords": [
+                "export",
+                "exporter"
+            ],
+            "time": "2015-01-24 09:57:24"
+        },
+        {
+            "name": "sebastian/global-state",
+            "version": "dev-master",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/global-state.git",
+                "reference": "007c441df427cf0e175372fcbb9d196bce7eb743"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/007c441df427cf0e175372fcbb9d196bce7eb743",
+                "reference": "007c441df427cf0e175372fcbb9d196bce7eb743",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~4.2"
+            },
+            "suggest": {
+                "ext-uopz": "*"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de"
+                }
+            ],
+            "description": "Snapshotting of global state",
+            "homepage": "http://www.github.com/sebastianbergmann/global-state",
+            "keywords": [
+                "global state"
+            ],
+            "time": "2015-01-20 04:09:31"
+        },
+        {
+            "name": "sebastian/recursion-context",
+            "version": "dev-master",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/recursion-context.git",
+                "reference": "3989662bbb30a29d20d9faa04a846af79b276252"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/3989662bbb30a29d20d9faa04a846af79b276252",
+                "reference": "3989662bbb30a29d20d9faa04a846af79b276252",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~4.4"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0.x-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Jeff Welch",
+                    "email": "whatthejeff@gmail.com"
+                },
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de"
+                },
+                {
+                    "name": "Adam Harvey",
+                    "email": "aharvey@php.net"
+                }
+            ],
+            "description": "Provides functionality to recursively process PHP variables",
+            "homepage": "http://www.github.com/sebastianbergmann/recursion-context",
+            "time": "2015-01-24 09:48:32"
+        },
+        {
+            "name": "sebastian/version",
+            "version": "1.0.4",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/version.git",
+                "reference": "a77d9123f8e809db3fbdea15038c27a95da4058b"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/a77d9123f8e809db3fbdea15038c27a95da4058b",
+                "reference": "a77d9123f8e809db3fbdea15038c27a95da4058b",
+                "shasum": ""
+            },
+            "type": "library",
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "Library that helps with managing the version number of Git-hosted PHP projects",
+            "homepage": "https://github.com/sebastianbergmann/version",
+            "time": "2014-12-15 14:25:24"
+        },
+        {
+            "name": "symfony/browser-kit",
+            "version": "2.7.x-dev",
+            "target-dir": "Symfony/Component/BrowserKit",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/BrowserKit.git",
+                "reference": "432c0593d5367b1bb8aa893cb2272172934ad371"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/BrowserKit/zipball/432c0593d5367b1bb8aa893cb2272172934ad371",
+                "reference": "432c0593d5367b1bb8aa893cb2272172934ad371",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.9",
+                "symfony/dom-crawler": "~2.0,>=2.0.5|~3.0.0"
+            },
+            "require-dev": {
+                "symfony/css-selector": "~2.0,>=2.0.5|~3.0.0",
+                "symfony/process": "~2.0,>=2.0.5|~3.0.0"
+            },
+            "suggest": {
+                "symfony/process": ""
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.7-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "Symfony\\Component\\BrowserKit\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Symfony Community",
+                    "homepage": "http://symfony.com/contributors"
+                },
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                }
+            ],
+            "description": "Symfony BrowserKit Component",
+            "homepage": "http://symfony.com",
+            "time": "2015-01-09 06:51:41"
+        },
+        {
+            "name": "symfony/config",
+            "version": "2.7.x-dev",
+            "target-dir": "Symfony/Component/Config",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/Config.git",
+                "reference": "1624dd47e1f4dc89ae4e7ca4a0476325042f8e82"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/Config/zipball/1624dd47e1f4dc89ae4e7ca4a0476325042f8e82",
+                "reference": "1624dd47e1f4dc89ae4e7ca4a0476325042f8e82",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.9",
+                "symfony/filesystem": "~2.3|~3.0.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.7-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "Symfony\\Component\\Config\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Symfony Community",
+                    "homepage": "http://symfony.com/contributors"
+                },
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                }
+            ],
+            "description": "Symfony Config Component",
+            "homepage": "http://symfony.com",
+            "time": "2015-01-25 04:39:35"
+        },
+        {
+            "name": "symfony/console",
+            "version": "2.7.x-dev",
+            "target-dir": "Symfony/Component/Console",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/Console.git",
+                "reference": "9f041fb5735b0d25d117e77ab8597a8376c74fbd"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/Console/zipball/9f041fb5735b0d25d117e77ab8597a8376c74fbd",
+                "reference": "9f041fb5735b0d25d117e77ab8597a8376c74fbd",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.9"
+            },
+            "require-dev": {
+                "psr/log": "~1.0",
+                "symfony/event-dispatcher": "~2.1|~3.0.0",
+                "symfony/process": "~2.1|~3.0.0"
+            },
+            "suggest": {
+                "psr/log": "For using the console logger",
+                "symfony/event-dispatcher": "",
+                "symfony/process": ""
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.7-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "Symfony\\Component\\Console\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Symfony Community",
+                    "homepage": "http://symfony.com/contributors"
+                },
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                }
+            ],
+            "description": "Symfony Console Component",
+            "homepage": "http://symfony.com",
+            "time": "2015-01-25 05:59:26"
+        },
+        {
+            "name": "symfony/css-selector",
+            "version": "2.3.x-dev",
+            "target-dir": "Symfony/Component/CssSelector",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/CssSelector.git",
+                "reference": "202ff2f0ba271d1a77f937b3ae177887da9241d7"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/CssSelector/zipball/202ff2f0ba271d1a77f937b3ae177887da9241d7",
+                "reference": "202ff2f0ba271d1a77f937b3ae177887da9241d7",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.3-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "Symfony\\Component\\CssSelector\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Symfony Community",
+                    "homepage": "http://symfony.com/contributors"
+                },
+                {
+                    "name": "Jean-François Simon",
+                    "email": "jeanfrancois.simon@sensiolabs.com"
+                },
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                }
+            ],
+            "description": "Symfony CssSelector Component",
+            "homepage": "http://symfony.com",
+            "time": "2015-01-01 12:56:52"
+        },
+        {
+            "name": "symfony/dependency-injection",
+            "version": "2.7.x-dev",
+            "target-dir": "Symfony/Component/DependencyInjection",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/DependencyInjection.git",
+                "reference": "acf2e8e27c53b8af7963ca00809ccde1d1e977f4"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/DependencyInjection/zipball/acf2e8e27c53b8af7963ca00809ccde1d1e977f4",
+                "reference": "acf2e8e27c53b8af7963ca00809ccde1d1e977f4",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.9"
+            },
+            "conflict": {
+                "symfony/expression-language": "<2.6"
+            },
+            "require-dev": {
+                "symfony/config": "~2.2|~3.0.0",
+                "symfony/expression-language": "~2.6|~3.0.0",
+                "symfony/yaml": "~2.1|~3.0.0"
+            },
+            "suggest": {
+                "symfony/config": "",
+                "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them",
+                "symfony/yaml": ""
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.7-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "Symfony\\Component\\DependencyInjection\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Symfony Community",
+                    "homepage": "http://symfony.com/contributors"
+                },
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                }
+            ],
+            "description": "Symfony DependencyInjection Component",
+            "homepage": "http://symfony.com",
+            "time": "2015-01-25 04:39:35"
+        },
+        {
+            "name": "symfony/dom-crawler",
+            "version": "2.3.x-dev",
+            "target-dir": "Symfony/Component/DomCrawler",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/DomCrawler.git",
+                "reference": "3702395bfcd327a92d620337208f69b92dde0c4a"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/DomCrawler/zipball/3702395bfcd327a92d620337208f69b92dde0c4a",
+                "reference": "3702395bfcd327a92d620337208f69b92dde0c4a",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "require-dev": {
+                "symfony/css-selector": "~2.0,>=2.0.5"
+            },
+            "suggest": {
+                "symfony/css-selector": ""
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.3-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "Symfony\\Component\\DomCrawler\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Symfony Community",
+                    "homepage": "http://symfony.com/contributors"
+                },
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                }
+            ],
+            "description": "Symfony DomCrawler Component",
+            "homepage": "http://symfony.com",
+            "time": "2015-01-03 13:14:51"
+        },
+        {
+            "name": "symfony/event-dispatcher",
+            "version": "2.7.x-dev",
+            "target-dir": "Symfony/Component/EventDispatcher",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/EventDispatcher.git",
+                "reference": "7a26717d431dfb092198d7c55f06788b2de5aaf7"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/EventDispatcher/zipball/7a26717d431dfb092198d7c55f06788b2de5aaf7",
+                "reference": "7a26717d431dfb092198d7c55f06788b2de5aaf7",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.9"
+            },
+            "require-dev": {
+                "psr/log": "~1.0",
+                "symfony/config": "~2.0,>=2.0.5|~3.0.0",
+                "symfony/dependency-injection": "~2.6|~3.0.0",
+                "symfony/expression-language": "~2.6|~3.0.0",
+                "symfony/stopwatch": "~2.3|~3.0.0"
+            },
+            "suggest": {
+                "symfony/dependency-injection": "",
+                "symfony/http-kernel": ""
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.7-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "Symfony\\Component\\EventDispatcher\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Symfony Community",
+                    "homepage": "http://symfony.com/contributors"
+                },
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                }
+            ],
+            "description": "Symfony EventDispatcher Component",
+            "homepage": "http://symfony.com",
+            "time": "2015-01-16 15:11:56"
+        },
+        {
+            "name": "symfony/filesystem",
+            "version": "dev-master",
+            "target-dir": "Symfony/Component/Filesystem",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/Filesystem.git",
+                "reference": "9e98e082d75e36d704f83c741443a526a41a3cfa"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/Filesystem/zipball/9e98e082d75e36d704f83c741443a526a41a3cfa",
+                "reference": "9e98e082d75e36d704f83c741443a526a41a3cfa",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.5.9"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.0-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "Symfony\\Component\\Filesystem\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Symfony Community",
+                    "homepage": "http://symfony.com/contributors"
+                },
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                }
+            ],
+            "description": "Symfony Filesystem Component",
+            "homepage": "http://symfony.com",
+            "time": "2015-01-04 10:51:22"
+        },
+        {
+            "name": "symfony/finder",
+            "version": "2.7.x-dev",
+            "target-dir": "Symfony/Component/Finder",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/Finder.git",
+                "reference": "0c737de96a94d14a51738d285ad426a102baac0e"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/Finder/zipball/0c737de96a94d14a51738d285ad426a102baac0e",
+                "reference": "0c737de96a94d14a51738d285ad426a102baac0e",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.9"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.7-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "Symfony\\Component\\Finder\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Symfony Community",
+                    "homepage": "http://symfony.com/contributors"
+                },
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                }
+            ],
+            "description": "Symfony Finder Component",
+            "homepage": "http://symfony.com",
+            "time": "2015-01-09 06:51:41"
+        },
+        {
+            "name": "symfony/process",
+            "version": "2.7.x-dev",
+            "target-dir": "Symfony/Component/Process",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/Process.git",
+                "reference": "f3ab493718070b936e21b202422466db35c1c298"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/Process/zipball/f3ab493718070b936e21b202422466db35c1c298",
+                "reference": "f3ab493718070b936e21b202422466db35c1c298",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.9"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.7-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "Symfony\\Component\\Process\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Symfony Community",
+                    "homepage": "http://symfony.com/contributors"
+                },
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                }
+            ],
+            "description": "Symfony Process Component",
+            "homepage": "http://symfony.com",
+            "time": "2015-01-25 04:39:35"
+        },
+        {
+            "name": "symfony/translation",
+            "version": "2.2.x-dev",
+            "target-dir": "Symfony/Component/Translation",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/Translation.git",
+                "reference": "e27b46e4f051541b78cd47bab4829056390f19de"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/Translation/zipball/e27b46e4f051541b78cd47bab4829056390f19de",
+                "reference": "e27b46e4f051541b78cd47bab4829056390f19de",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "require-dev": {
+                "symfony/config": ">=2.0,<2.3-dev",
+                "symfony/yaml": "~2.2"
+            },
+            "suggest": {
+                "symfony/config": "2.2.*",
+                "symfony/yaml": "2.2.*"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.2-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "Symfony\\Component\\Translation\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com",
+                    "homepage": "http://fabien.potencier.org",
+                    "role": "Lead Developer"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "http://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony Translation Component",
+            "homepage": "http://symfony.com",
+            "time": "2013-11-25 08:44:14"
+        },
+        {
+            "name": "symfony/yaml",
+            "version": "2.7.x-dev",
+            "target-dir": "Symfony/Component/Yaml",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/Yaml.git",
+                "reference": "02ba3dc638c5d3f0ab3b47ddb74f98c11dcc0c60"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/Yaml/zipball/02ba3dc638c5d3f0ab3b47ddb74f98c11dcc0c60",
+                "reference": "02ba3dc638c5d3f0ab3b47ddb74f98c11dcc0c60",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.9"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.7-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "Symfony\\Component\\Yaml\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Symfony Community",
+                    "homepage": "http://symfony.com/contributors"
+                },
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                }
+            ],
+            "description": "Symfony Yaml Component",
+            "homepage": "http://symfony.com",
+            "time": "2015-01-25 04:39:35"
+        }
+    ],
+    "aliases": [],
+    "minimum-stability": "dev",
+    "stability-flags": {
+        "atoum/atoum": 20,
+        "fzaninotto/faker": 20
+    },
+    "prefer-stable": false,
+    "prefer-lowest": false,
+    "platform": {
+        "php": ">5.3.0"
+    },
+    "platform-dev": []
+}
Index: features/admin/session.feature
===================================================================
--- features/admin/session.feature	(revision 2931)
+++ features/admin/session.feature	(revision 2931)
@@ -0,0 +1,29 @@
+Feature: Manage content
+  In order to manage my blog
+  As an administrator
+  I need to be able to connect to administration area
+
+  Background: init
+    Given a user:
+      | username | password | status |
+      | user1    | pass1    | normal |
+
+  Scenario: Login
+    Given I am on "/admin/"
+    And I am logged in as "user1" with password "pass1"
+    Then I should see "Dashboard"
+    And I should see "My preferences"
+
+  Scenario: Logout
+    Given I am on "/admin/"
+    And I am logged in as "user1" with password "pass1"
+    When I follow "My preferences"
+    When I follow "Logout"
+    Then I should not see "My preferences"
+
+  Scenario: Remember me
+    Given I am on "/admin/"
+    And I am logged in as "user1" with password "pass1" with remember me
+    Then I should see "My preferences"
+    When I restart my browser
+    Then I should see "My preferences"
Index: features/bootstrap/DbContext.php
===================================================================
--- features/bootstrap/DbContext.php	(revision 2931)
+++ features/bootstrap/DbContext.php	(revision 2931)
@@ -0,0 +1,121 @@
+<?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 -----------------------------------------
+
+use Behat\MinkExtension\Context\RawMinkContext;
+use Behat\Behat\Event\SuiteEvent;
+use Behat\Behat\Event\ScenarioEvent;
+use Behat\Gherkin\Node\TableNode;
+
+include_once __DIR__.'/autoload.php';
+
+class DbContext extends RawMinkContext
+{
+    private static $conf_loaded = false;
+    private static $con = null;
+    public static $prefix = 'dc_';
+
+    public function __construct($parameters) {
+        $this->parameters = $parameters;
+    }
+
+    /**
+     * @Given /^a user:$/
+     */
+    public function aUser(TableNode $table) {
+        foreach ($table->getHash() as $user) {
+            $this->last_id = self::addUser($user);
+        }
+    }
+
+    /*
+    /* ORM methods
+    **/
+    /**
+     * @BeforeSuite
+     */
+    public static function prepareDB(SuiteEvent $event) {
+        $parameters = $event->getContextParameters();
+
+        if (empty($parameters['config_file']) || !is_readable($parameters['config_file'])) {
+            throw new Exception(sprintf('Config file %s does not exist or not readable', $parameters['config_file']));
+        }
+        if (empty($parameters['sql_init_file'])  || !is_readable($parameters['sql_init_file'])) {
+            throw new Exception(sprintf('sql init file %s does not exist or not readable', $parameters['sql_init_file']));
+        }
+        self::getConnection($parameters);
+        self::executeSqlFile($parameters['sql_init_file']);
+    }
+
+    /**
+     * @AfterScenario
+     */
+    public static function cleanDB(ScenarioEvent $event) {
+        $parameters = $event->getContext()->parameters;
+
+        if (empty($parameters['config_file']) || !is_readable($parameters['config_file'])) {
+            throw new Exception(sprintf('Config file %s does not exist or not readable', $parameters['config_file']));
+        }
+        self::getConnection($parameters);
+
+        if (empty($parameters['sql_cleanup_file']) && !is_readable($parameters['sql_cleanup_file'])) {
+            throw new Exception(sprintf('sql cleanup file %s does not exist or not readable', $parameters['sql_cleanup_file']));
+        }
+        self::executeSqlFile($parameters['sql_cleanup_file']);
+   }
+
+    private function addUser(array $params) {
+        self::getConnection($this->parameters);
+        if (empty($params['username']) || empty($params['password'])) {
+            throw new Exception('Username and Password for user are mandatory'."\n");
+        }
+        $strReq = 'SELECT count(1) FROM '.self::$prefix.'user';
+        $strReq .= ' WHERE user_id = \''.self::$con->escape($params['username']).'\'';
+        if ((int) self::$con->select($strReq)->f(0)==0) {
+            $user = self::$con->openCursor(self::$prefix . 'user');
+            $user->user_id = $params['username'];
+			$user->user_pwd = \crypt::hmac(DC_MASTER_KEY,$params['password']);
+            $user->user_super = 1;
+            $user->insert();
+        }
+    }
+
+    /**
+     *  Create a database connexion if none exists
+     */
+    private static function getConnection($parameters) {
+        if (!self::$conf_loaded) {
+            // @TODO : find a better way to include conf without define DC_RC_PATH
+            define('DC_RC_PATH', $parameters['config_file']);
+
+            include($parameters['config_file']);
+            self::$conf_loaded = true;
+            self::$prefix = DC_DBPREFIX;
+
+            self::$con = \dbLayer::init(DC_DBDRIVER,DC_DBHOST,DC_DBNAME,DC_DBUSER,DC_DBPASSWORD,DC_DBPERSIST);
+        }
+    }
+
+    private static function executeSqlFile($file) {
+        $queries = file($file);
+        if (!empty($queries)) {
+            try {
+                foreach ($queries as $query) {
+                    if (!empty($query)) {
+                        self::$con->execute($query);
+                    }
+                }
+            } catch (\Exception $e) {
+                // @TODO : make something ; exception thrown "database schema has changed (17)" ???
+            }
+        }
+    }
+}
Index: features/bootstrap/FeatureContext.php
===================================================================
--- features/bootstrap/FeatureContext.php	(revision 2931)
+++ features/bootstrap/FeatureContext.php	(revision 2931)
@@ -0,0 +1,61 @@
+<?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 -----------------------------------------
+
+use Behat\MinkExtension\Context\MinkContext;
+use Behat\Behat\Exception\PendingException;
+use Behat\Gherkin\Node\TableNode;
+
+/**
+ * Features context.
+ */
+class FeatureContext extends MinkContext
+{
+    /**
+     * Initializes context.
+     * Every scenario gets its own context object.
+     *
+     * @param array $parameters context parameters (set them up through behat.yml)
+     */
+    public function __construct(array $parameters) {
+        $this->parameters = $parameters;
+
+        $this->useContext('db', new DbContext($parameters));
+    }
+
+    /**
+     * @Given /^I am logged in as "([^"]*)" with password "([^"]*)"$/
+     */
+    public function iAmLoggedInAsWithPassword($username, $password, $remember=false) {
+        $this->fillField('Username', $username);
+        $this->fillField('Password', $password);
+        if ($remember) {
+            $this->checkOption('user_remember');
+        }
+        $this->pressButton('log in');
+    }
+
+    /**
+     * @Given /^I am logged in as "([^"]*)" with password "([^"]*)" with remember me$/
+     */
+    public function iAmLoggedInAsWithPasswordWithRememberMe($username, $password) {
+        $this->iAmLoggedInAsWithPassword($username, $password, true);
+        $this->getMink()->assertSession()->cookieExists('dcxd'); // @TODO : retrieve cookie name from config
+        $this->getMink()->assertSession()->cookieExists('dc_admin');
+    }
+
+    /**
+     * @When /^I restart my browser$/
+     */
+    public function iRestartMyBrowser() {
+        $this->getMink()->assertSession()->cookieExists('dcxd');
+    }
+}
Index: features/bootstrap/autoload.php
===================================================================
--- features/bootstrap/autoload.php	(revision 2931)
+++ features/bootstrap/autoload.php	(revision 2931)
@@ -0,0 +1,34 @@
+<?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 -----------------------------------------
+
+define('CLEARBRICKS_PATH',__DIR__.'/../../inc/libs/clearbricks');
+
+require_once __DIR__.'/../../vendor/autoload.php';
+
+include_once '/var/projets/common/Log.php';
+
+$__autoload = array();
+$__autoload['dbStruct'] = CLEARBRICKS_PATH.'/dbschema/class.dbstruct.php';
+$__autoload['dbSchema'] = CLEARBRICKS_PATH.'/dbschema/class.dbschema.php';
+$__autoload['pgsqlSchema'] = CLEARBRICKS_PATH.'/dbschema/class.pgsql.dbschema.php';
+$__autoload['mysqlSchema'] = CLEARBRICKS_PATH.'/dbschema/class.mysql.dbschema.php';
+$__autoload['mysqliSchema'] = CLEARBRICKS_PATH.'/dbschema/class.mysqli.dbschema.php';
+$__autoload['dbLayer'] = CLEARBRICKS_PATH.'/dblayer/dblayer.php';
+$__autoload['mysqlConnection'] = CLEARBRICKS_PATH.'/dblayer/class.mysql.php';
+$__autoload['mysqliConnection'] = CLEARBRICKS_PATH.'/dblayer/class.mysqli.php';
+$__autoload['pgsqlConnection'] = CLEARBRICKS_PATH.'/dblayer/class.pgsql.php';
+$__autoload['crypt'] = CLEARBRICKS_PATH.'/common/lib.crypt.php';
+
+
+$loader = new \Composer\Autoload\ClassLoader();
+$loader->addClassMap($__autoload);
+$loader->register();
Index: features/public/home.feature
===================================================================
--- features/public/home.feature	(revision 2931)
+++ features/public/home.feature	(revision 2931)
@@ -0,0 +1,8 @@
+Feature: See content
+  In order to see posts
+  As a site visitor
+  I need to be able to see the website
+
+  Scenario: I'm on a dotclear blog
+    Given I am on homepage
+    Then I should see "Powered by dotclear"
Index: features/sql/db_cleanup.sql
===================================================================
--- features/sql/db_cleanup.sql	(revision 2931)
+++ features/sql/db_cleanup.sql	(revision 2931)
@@ -0,0 +1,1 @@
+DELETE FROM dc_user;
Index: features/sql/db_init.sql
===================================================================
--- features/sql/db_init.sql	(revision 2931)
+++ features/sql/db_init.sql	(revision 2931)
@@ -0,0 +1,1 @@
+UPDATE dc_user SET user_lang = 'en';
Index: inc/core/class.dc.modules.php
===================================================================
--- inc/core/class.dc.modules.php	(revision 2708)
+++ inc/core/class.dc.modules.php	(revision 2918)
@@ -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,4 +133,8 @@
 				$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 2934)
+++ inc/prepend.php	(revision 2937)
@@ -140,5 +140,5 @@
 # Constants
 define('DC_ROOT',path::real(dirname(__FILE__).'/..'));
-define('DC_VERSION','2.7.4');
+define('DC_VERSION','2.8-dev');
 define('DC_DIGESTS',dirname(__FILE__).'/digests');
 define('DC_L10N_ROOT',dirname(__FILE__).'/../locales');
Index: locales/fr/plugins.po
===================================================================
--- locales/fr/plugins.po	(revision 2922)
+++ locales/fr/plugins.po	(revision 2930)
@@ -1884,4 +1884,19 @@
 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"
 msgstr "Ajouter des mots-clés"
Index: plugins/simpleMenu/_public.php
===================================================================
--- plugins/simpleMenu/_public.php	(revision 2912)
+++ plugins/simpleMenu/_public.php	(revision 2928)
@@ -31,5 +31,5 @@
 		$description = isset($attr['description']) ? trim($attr['description']) : '';
 
-		if (!preg_match('#^(title|span)$#',$description)) {
+		if (!preg_match('#^(title|span|both|none)$#',$description)) {
 			$description = '';
 		}
@@ -47,4 +47,6 @@
 		global $core, $_ctx;
 
+		$descr_type = array(0 => 'span',1 => 'title',2 => 'both',3 => 'none');
+
 		if (!(boolean) $core->blog->settings->system->simpleMenu_active)
 			return;
@@ -58,5 +60,9 @@
 		}
 
-		$menu = tplSimpleMenu::displayMenu('','','title');
+		$description = 'title';
+		if (isset($descr_type[$w->description])) {
+			$description = $descr_type[$w->description];
+		}
+		$menu = tplSimpleMenu::displayMenu('','',$description);
 		if ($menu == '') {
 			return;
@@ -107,7 +113,8 @@
 				$title = $span = '';
 				if ($m['descr']) {
-					if ($description == 'title') {
+					if ($description == 'title' || $description == 'both') {
 						$title = ' title="'.html::escapeHTML(__($m['descr'])).'"';
-					} else {
+					}
+					if ($description == 'span' || $description == 'both') {
 						$span = ' <span>'.html::escapeHTML(__($m['descr'])).'</span>';
 					}
Index: plugins/simpleMenu/_widgets.php
===================================================================
--- plugins/simpleMenu/_widgets.php	(revision 2778)
+++ plugins/simpleMenu/_widgets.php	(revision 2928)
@@ -20,4 +20,12 @@
 		$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(
@@ -26,5 +34,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 2849)
+++ plugins/tags/_admin.php	(revision 2924)
@@ -10,4 +10,5 @@
 #
 # -- END LICENSE BLOCK -----------------------------------------
+
 if (!defined('DC_CONTEXT_ADMIN')) { return; }
 
@@ -36,350 +37,8 @@
 $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 2662)
+++ plugins/tags/_define.php	(revision 2924)
@@ -16,8 +16,8 @@
 	/* Description*/		"Tags for posts",
 	/* Author */			"Olivier Meunier",
-	/* Version */			'1.3',
+	/* Version */			'1.4',
 	array(
 		'permissions' =>	'usage,contentadmin',
-		'priority' =>		998,
+		'priority' =>		1001,	// Must be higher than dcLegacyEditor/dcCKEditor priority (ie 1000)
 		'type'		=>		'plugin'
 	)
Index: plugins/tags/_prepend.php
===================================================================
--- plugins/tags/_prepend.php	(revision 2095)
+++ plugins/tags/_prepend.php	(revision 2924)
@@ -10,4 +10,5 @@
 #
 # -- END LICENSE BLOCK -----------------------------------------
+
 if (!defined('DC_RC_PATH')) { return; }
 
@@ -15,2 +16,6 @@
 $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: plugins/tags/inc/tags.behaviors.php
===================================================================
--- plugins/tags/inc/tags.behaviors.php	(revision 2924)
+++ plugins/tags/inc/tags.behaviors.php	(revision 2924)
@@ -0,0 +1,366 @@
+<?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: plugins/tags/js/legacy-post.js
===================================================================
--- plugins/tags/js/legacy-post.js	(revision 2924)
+++ plugins/tags/js/legacy-post.js	(revision 2924)
@@ -0,0 +1,62 @@
+// 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 2546)
+++ plugins/tags/js/post.js	(revision 2924)
@@ -66,52 +66,2 @@
 
 });
-
-// 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 2663)
+++ plugins/themeEditor/_define.php	(revision 2890)
@@ -16,5 +16,5 @@
 	/* Description*/		"Theme Editor",
 	/* Author */			"Olivier Meunier",
-	/* Version */			'1.1',
+	/* Version */			'1.2',
 	array(
 		'type'		=>		'plugin'
Index: plugins/themeEditor/class.themeEditor.php
===================================================================
--- plugins/themeEditor/class.themeEditor.php	(revision 2862)
+++ plugins/themeEditor/class.themeEditor.php	(revision 2890)
@@ -20,4 +20,5 @@
 	protected $tplset_theme;
 
+	protected $parent_name;
 	protected $tplset_name;
 
@@ -38,4 +39,5 @@
 			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');
@@ -78,6 +80,8 @@
 			}
 			$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:').'<ul>%s</ul></li>',$list_parent) : '');
-			$list .= ($list_tpl != '' ? sprintf('<li class="group-file">'.__('From template set:').'<ul>%s</ul></li>',$list_tpl) : '');
+			$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) : '');
 		} else {
 			foreach ($files as $k => $v)
Index: travis/conf/config_mysql.php
===================================================================
--- travis/conf/config_mysql.php	(revision 2931)
+++ travis/conf/config_mysql.php	(revision 2931)
@@ -0,0 +1,66 @@
+<?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 -----------------------------------------
+//if (!defined('DC_RC_PATH')) { return; }
+
+// Database driver (mysql, mysqli, pgsql, sqlite)
+define('DC_DBDRIVER','mysql');
+
+// Database hostname (usually "localhost")
+define('DC_DBHOST','localhost');
+
+// Database user
+define('DC_DBUSER','travis');
+
+// Database password
+define('DC_DBPASSWORD','');
+
+// Database name
+define('DC_DBNAME','dotclear');
+
+// Tables' prefix
+define('DC_DBPREFIX','dc_');
+
+// Persistent database connection
+define('DC_DBPERSIST',false);
+
+// Crypt key (password storage)
+define('DC_MASTER_KEY','b0747226ecb65cfee65cccc8e051450f');
+
+// Admin URL. You need to set it for some features.
+define('DC_ADMIN_URL','http://locahost:1080/admin/');
+
+// Admin mail from address. For password recovery and such.
+define('DC_ADMIN_MAILFROM','dev@dotclear.org');
+
+// Cookie's name
+define('DC_SESSION_NAME','dcxd');
+
+// Plugins root
+define('DC_PLUGINS_ROOT',__DIR__.'/../../plugins');
+
+// Template cache directory
+define('DC_TPL_CACHE',__DIR__.'/../../cache');
+
+// If you have PATH_INFO issue, uncomment following lines
+//if (!isset($_SERVER['ORIG_PATH_INFO'])) {
+//	$_SERVER['ORIG_PATH_INFO'] = '';
+//}
+//$_SERVER['PATH_INFO'] = $_SERVER['ORIG_PATH_INFO'];
+
+
+// If you have mail problems, uncomment following lines and adapt it to your hosting configuration
+// For more information about this setting, please refer to http://doc.dotclear.net/2.0/admin/install/custom-sendmail
+//function _mail($to,$subject,$message,$headers)
+//{
+//	socketMail::$smtp_relay = 'my.smtp.relay.org';
+//	socketMail::mail($to,$subject,$message,$headers);
+//}
Index: travis/conf/config_pgsql.php
===================================================================
--- travis/conf/config_pgsql.php	(revision 2931)
+++ travis/conf/config_pgsql.php	(revision 2931)
@@ -0,0 +1,66 @@
+<?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 -----------------------------------------
+//if (!defined('DC_RC_PATH')) { return; }
+
+// Database driver (mysql, mysqli, pgsql, sqlite)
+define('DC_DBDRIVER','pgsql');
+
+// Database hostname (usually "localhost")
+define('DC_DBHOST','localhost');
+
+// Database user
+define('DC_DBUSER','postgres');
+
+// Database password
+define('DC_DBPASSWORD','');
+
+// Database name
+define('DC_DBNAME','dotclear');
+
+// Tables' prefix
+define('DC_DBPREFIX','dc_');
+
+// Persistent database connection
+define('DC_DBPERSIST',false);
+
+// Crypt key (password storage)
+define('DC_MASTER_KEY','03d1569bd9a2a9844020efa69b0ec68d');
+
+// Admin URL. You need to set it for some features.
+define('DC_ADMIN_URL','http://locahost:1080/admin/');
+
+// Admin mail from address. For password recovery and such.
+define('DC_ADMIN_MAILFROM','dev@dotclear.org');
+
+// Cookie's name
+define('DC_SESSION_NAME','dcxd');
+
+// Plugins root
+define('DC_PLUGINS_ROOT',__DIR__.'/../../plugins');
+
+// Template cache directory
+define('DC_TPL_CACHE',__DIR__.'/../../cache') ;
+
+// If you have PATH_INFO issue, uncomment following lines
+//if (!isset($_SERVER['ORIG_PATH_INFO'])) {
+//	$_SERVER['ORIG_PATH_INFO'] = '';
+//}
+//$_SERVER['PATH_INFO'] = $_SERVER['ORIG_PATH_INFO'];
+
+
+// If you have mail problems, uncomment following lines and adapt it to your hosting configuration
+// For more information about this setting, please refer to http://doc.dotclear.net/2.0/admin/install/custom-sendmail
+//function _mail($to,$subject,$message,$headers)
+//{
+//	socketMail::$smtp_relay = 'my.smtp.relay.org';
+//	socketMail::mail($to,$subject,$message,$headers);
+//}
Index: travis/conf/config_sqlite.php
===================================================================
--- travis/conf/config_sqlite.php	(revision 2931)
+++ travis/conf/config_sqlite.php	(revision 2931)
@@ -0,0 +1,67 @@
+<?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 -----------------------------------------
+//if (!defined('DC_RC_PATH')) { return; }
+
+// Database driver (mysql, mysqli, pgsql, sqlite)
+define('DC_DBDRIVER','sqlite');
+
+// Database hostname (usually "localhost")
+define('DC_DBHOST','');
+
+// Database user
+define('DC_DBUSER','');
+
+// Database password
+define('DC_DBPASSWORD','');
+
+// Database name
+define('DC_DBNAME',__DIR__.'/../../db/dotclear.db');
+
+// Tables' prefix
+define('DC_DBPREFIX','dc_');
+
+// Persistent database connection
+define('DC_DBPERSIST',false);
+
+// Crypt key (password storage)
+define('DC_MASTER_KEY','544b6b00ea451f39fc78e8ab154189a5');
+
+// Admin URL. You need to set it for some features.
+define('DC_ADMIN_URL','http://locahost:1080/admin/');
+
+// Admin mail from address. For password recovery and such.
+define('DC_ADMIN_MAILFROM','dev@dotclear.org');
+
+// Cookie's name
+define('DC_SESSION_NAME','dcxd');
+
+// Plugins root
+define('DC_PLUGINS_ROOT',__DIR__.'/../../plugins');
+
+// Template cache directory
+define('DC_TPL_CACHE',__DIR__.'/../../cache');
+
+
+// If you have PATH_INFO issue, uncomment following lines
+//if (!isset($_SERVER['ORIG_PATH_INFO'])) {
+//	$_SERVER['ORIG_PATH_INFO'] = '';
+//}
+//$_SERVER['PATH_INFO'] = $_SERVER['ORIG_PATH_INFO'];
+
+
+// If you have mail problems, uncomment following lines and adapt it to your hosting configuration
+// For more information about this setting, please refer to http://doc.dotclear.net/2.0/admin/install/custom-sendmail
+//function _mail($to,$subject,$message,$headers)
+//{
+//	socketMail::$smtp_relay = 'my.smtp.relay.org';
+//	socketMail::mail($to,$subject,$message,$headers);
+//}
Index: travis/install.php
===================================================================
--- travis/install.php	(revision 2931)
+++ travis/install.php	(revision 2931)
@@ -0,0 +1,26 @@
+<?php
+if (!empty($_SERVER['argv'][1]) && in_array($_SERVER['argv'][1], array('mysql','sqlite','pgsql'))
+   && is_readable(__DIR__.'/conf/config_'.$_SERVER['argv'][1].'.php')) {
+
+    $_SERVER['DC_RC_PATH'] = __DIR__.'/conf/config_'.$_SERVER['argv'][1].'.php';
+} else {
+    $_SERVER['DC_RC_PATH'] = __DIR__.'/../inc/config.php';
+}
+
+if (empty($_SERVER['DC_RC_PATH'])) {
+    die('You must define DC_RC_PATH');
+}
+$_SERVER['REQUEST_URI'] = 'http://localhost:1080';
+$_SERVER['HTTP_HOST'] = 'http';
+$_SERVER['SERVER_PORT'] = '1080';
+
+$tmp_pwd = md5(uniqid());  // don't care, user will be deleted
+$_POST = array(
+    'u_login' => 'admin',
+    'u_pwd' =>  $tmp_pwd,
+    'u_pwd2' => $tmp_pwd
+);
+
+ob_start();
+require_once(__DIR__.'/../admin/install/index.php');
+ob_end_clean();
Index: travis/router.php
===================================================================
--- travis/router.php	(revision 2931)
+++ travis/router.php	(revision 2931)
@@ -0,0 +1,4 @@
+<?php
+$_SERVER['DC_RC_PATH'] = __DIR__.'/../inc/config.php';
+$_SERVER['HTTP_ACCEPT_LANGUAGE'] = 'en';
+return false;
Index: travis/router_mysql.php
===================================================================
--- travis/router_mysql.php	(revision 2931)
+++ travis/router_mysql.php	(revision 2931)
@@ -0,0 +1,4 @@
+<?php
+$_SERVER['DC_RC_PATH'] = __DIR__.'/conf/config_mysql.php';
+$_SERVER['HTTP_ACCEPT_LANGUAGE'] = 'en';
+return false;
Index: travis/router_pgsql.php
===================================================================
--- travis/router_pgsql.php	(revision 2931)
+++ travis/router_pgsql.php	(revision 2931)
@@ -0,0 +1,4 @@
+<?php
+$_SERVER['DC_RC_PATH'] = __DIR__.'/conf/config_pgsql.php';
+$_SERVER['HTTP_ACCEPT_LANGUAGE'] = 'en';
+return false;
Index: travis/router_sqlite.php
===================================================================
--- travis/router_sqlite.php	(revision 2931)
+++ travis/router_sqlite.php	(revision 2931)
@@ -0,0 +1,4 @@
+<?php
+$_SERVER['DC_RC_PATH'] = __DIR__.'/conf/config_sqlite.php';
+$_SERVER['HTTP_ACCEPT_LANGUAGE'] = 'en';
+return false;
