diff --git a/CHANGELOG.md b/CHANGELOG.md
index 09ef08641c0cea7f862b7b2fc48443c1a4ae0207..40026e11d26d6d2ad07eade5d129ba5c25384a15 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -19,6 +19,7 @@
     - Amélioration : Le nom de l'auteur et la date d'expiration sont modifiables
     - Amélioration : Le nom de vote est modifiable
     - Amélioration : Affichage du comptage des "Si nécessaire" entre parenthèses
+    - Amélioration : Page d'installation
     - Fix : Purge en 2 étapes → 1. Verrouillage du sondage → 2. 60 jours plus tard suppression du sondage
     - Fix : Date d'expiration qui devient nulle quand on ajoute une colonne
     - Fix : clic/focus sur oui/non/si nécessaire → retour à gauche de la barre de scroll sur Chromium
diff --git a/INSTALL.md b/INSTALL.md
index 13c387f480ab7638b9e9225e1e1fa5421f7815ff..f82f3ac9068db118b8f73410c953413c88a4ca96 100644
--- a/INSTALL.md
+++ b/INSTALL.md
@@ -1,8 +1,4 @@
-# Paramètres
-
-Le fichier `app/inc/config.template.php` contient le paramétrage par défaut de
-l'application Framadate. Pour personnaliser votre installation, copiez
-ce fichier sous le nom `app/inc/config.php` et modifiez ce dernier.
+# Pré-installation
 
 ## Base de données
 
@@ -33,13 +29,17 @@ Les tables de l'applications sont décrites plus loin dans ce fichier dans la pa
     GRANT ALL PRIVILEGES ON `framadate_db`.* TO 'framadate_user'@'localhost';
 ```
 
-### Création des tables
+# Installation
+
+Pour installer l'application Framadate, rendez-vous sur la page http://monsite/admin/install.php et remplisez le formulaire.
+
+Une fois le formulaire rempli et envoyé, un script va générer le fichier `app/inc/config.php` puis vous rediriger vers la page de migration.
 
-Pour lancer la création des tables, rendez-vous sur la page `admin/` puis allez dans la partie `Migration`.
+La page de migration s'occupe :
+- D'installer toute la base de données (tables + données d'exemple)
+- De mettre à jour la base de données lors des mises à jour de l'applciation.
 
-Cette page est chargée :
-* soit de créer les tables si c'est votre première installation ;
-* soit de mettre à jour l'application si vous avez installé une nouvelle version.
+! Attention, le chargement de la page de migration peu prendre du temps étant donné qu'elle applique toutes les mises à jours requises !
 
 # Accès à la page administrateur
 
@@ -79,4 +79,4 @@ La base se compose de quatre tables :
 - `poll` : Le paramètrage des sondages;
 - `slot` : les choix disponibles pour chaque sondage;
 - `vote` : les votes effectués par les utilisateurs pour chaque sondage;
-- `comment` : les commentaires apportés à chaque sondage.
+- `comment` : les commentaires apportés à chaque sondage.
\ No newline at end of file
diff --git a/admin/install.php b/admin/install.php
new file mode 100644
index 0000000000000000000000000000000000000000..9240f14783465115666ecaf1aaf50ee85a4d8ec5
--- /dev/null
+++ b/admin/install.php
@@ -0,0 +1,48 @@
+<?php
+/**
+ * This software is governed by the CeCILL-B license. If a copy of this license
+ * is not distributed with this file, you can obtain one at
+ * http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt
+ *
+ * Authors of STUdS (initial project): Guilhem BORGHESI (borghesi@unistra.fr) and Raphaël DROZ
+ * Authors of Framadate/OpenSondate: Framasoft (https://github.com/framasoft)
+ *
+ * =============================
+ *
+ * Ce logiciel est régi par la licence CeCILL-B. Si une copie de cette licence
+ * ne se trouve pas avec ce fichier vous pouvez l'obtenir sur
+ * http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.txt
+ *
+ * Auteurs de STUdS (projet initial) : Guilhem BORGHESI (borghesi@unistra.fr) et Raphaël DROZ
+ * Auteurs de Framadate/OpenSondage : Framasoft (https://github.com/framasoft)
+ */
+
+use Framadate\Services\InstallService;
+use Framadate\Utils;
+
+require_once '../app/inc/init.php';
+
+if (is_file(CONF_FILENAME)) {
+    header(('Location: ' . Utils::get_server_name()));
+    exit;
+}
+
+$error = null;
+$installService = new InstallService();
+
+if (!empty($_POST)) {
+    $installService->updateFields($_POST);
+    $result = $installService->install($smarty);
+
+    if ($result['status'] === 'OK') {
+        header(('Location: ' . Utils::get_server_name() . 'admin/migration.php'));
+        exit;
+    } else {
+        $error = __('Error', $result['code']);
+    }
+}
+
+$smarty->assign('error', $error);
+$smarty->assign('title', __('Admin', 'Installation'));
+$smarty->assign('fields', $installService->getFields());
+$smarty->display('admin/install.tpl');
\ No newline at end of file
diff --git a/admin/migration.php b/admin/migration.php
index 978e6906fad5d5d1981c9bcb6fa748c2c49ee817..5ed3c7052e973e99ebe64e5816696381ee272cc4 100644
--- a/admin/migration.php
+++ b/admin/migration.php
@@ -24,7 +24,9 @@ use Framadate\Migration\AddColumn_uniqId_In_vote_For_0_9;
 use Framadate\Migration\AddColumn_hidden_In_poll_For_0_9;
 use Framadate\Migration\Alter_Comment_table_for_name_length;
 use Framadate\Migration\Alter_Comment_table_adding_date;
+use Framadate\Migration\Generate_uniqId_for_old_votes;
 use Framadate\Migration\Migration;
+use Framadate\Migration\RPadVotes_from_0_8;
 use Framadate\Utils;
 
 include_once __DIR__ . '/../app/inc/init.php';
@@ -38,8 +40,10 @@ $migrations = [
     new AddColumn_receiveNewComments_For_0_9(),
     new AddColumn_uniqId_In_vote_For_0_9(),
     new AddColumn_hidden_In_poll_For_0_9(),
+    new Generate_uniqId_for_old_votes(),
+    new RPadVotes_from_0_8(),
     new Alter_Comment_table_for_name_length(),
-    new Alter_Comment_table_adding_date(),
+    new Alter_Comment_table_adding_date()
 ];
 // ---------------------------------------
 
@@ -60,8 +64,8 @@ CREATE TABLE IF NOT EXISTS `' . $prefixedMigrationTable . '` (
   DEFAULT CHARSET = utf8;');
 }
 
-$selectStmt = $pdo->prepare('SELECT id FROM ' . $prefixedMigrationTable . ' WHERE name=?');
-$insertStmt = $pdo->prepare('INSERT INTO ' . $prefixedMigrationTable . ' (name) VALUES (?)');
+$selectStmt = $pdo->prepare('SELECT id FROM `' . $prefixedMigrationTable . '` WHERE name=?');
+$insertStmt = $pdo->prepare('INSERT INTO `' . $prefixedMigrationTable . '` (name) VALUES (?)');
 $countSucceeded = 0;
 $countFailed = 0;
 $countSkipped = 0;
diff --git a/adminstuds.php b/adminstuds.php
index d5f9cab4a8426c577b4aaaba3ea81e70489d93e9..3f30a418d5316ae72624dfa95e85e1d48cd3b567 100644
--- a/adminstuds.php
+++ b/adminstuds.php
@@ -67,7 +67,7 @@ function sendUpdateNotification($poll, $mailService, $type) {
 
     if ($poll->receiveNewVotes) {
 
-        $subject = '[' . NOMAPPLICATION . '] ' . __('Mail', 'Notification of poll') . ' : ' . $poll->title;
+        $subject = '[' . NOMAPPLICATION . '] ' . __f('Mail', 'Notification of poll: %s', $poll->title);
 
         $message = '';
         switch ($type) {
@@ -394,12 +394,12 @@ if (isset($_GET['add_slot'])) {
 if (isset($_POST['confirm_add_slot'])) {
     if ($poll->format === 'D') {
         $newdate = strip_tags($_POST['newdate']);
-        $newmoment = strip_tags($_POST['newmoment']);
+        $newmoment = str_replace(',', '-', strip_tags($_POST['newmoment']));
 
         $ex = explode('/', $newdate);
         $result = $adminPollService->addDateSlot($poll_id, mktime(0, 0, 0, $ex[1], $ex[0], $ex[2]), $newmoment);
     } else {
-        $newslot = strip_tags($_POST['choice']);
+        $newslot = str_replace(',', '-', strip_tags($_POST['choice']));
         $result = $adminPollService->addClassicSlot($poll_id, $newslot);
     }
 
@@ -431,6 +431,5 @@ $smarty->assign('editingVoteId', $editingVoteId);
 $smarty->assign('message', $message);
 $smarty->assign('admin', true);
 $smarty->assign('hidden', false);
-$smarty->assign('parameter_name_regex', NAME_REGEX);
 
-$smarty->display('studs.tpl');
\ No newline at end of file
+$smarty->display('studs.tpl');
diff --git a/app/classes/Framadate/Migration/From_0_8_to_0_9_Migration.php b/app/classes/Framadate/Migration/From_0_8_to_0_9_Migration.php
index bed4fe8a3ad1183c59943e963294c2dd8c69d0d6..4598449832b11f45835b9a6bfe6dcc00b6be70e3 100644
--- a/app/classes/Framadate/Migration/From_0_8_to_0_9_Migration.php
+++ b/app/classes/Framadate/Migration/From_0_8_to_0_9_Migration.php
@@ -166,7 +166,9 @@ CREATE TABLE IF NOT EXISTS `' . Utils::table('slot') . '` (
 
         foreach ($sujets as $sujet) {
             $newSlots = $this->transformSujetToSlot($sujet);
-            $slots = array_merge($slots, $newSlots);
+            foreach ($newSlots as $newSlot) {
+                $slots[] = $newSlot;
+            }
         }
 
         $prepared = $pdo->prepare('INSERT INTO ' . Utils::table('slot') . ' (`poll_id`, `title`, `moments`) VALUE (?,?,?)');
diff --git a/app/classes/Framadate/Migration/Generate_uniqId_for_old_votes.php b/app/classes/Framadate/Migration/Generate_uniqId_for_old_votes.php
new file mode 100644
index 0000000000000000000000000000000000000000..4814e9fbadcd2f65196ca5f8ed757aea49ade73c
--- /dev/null
+++ b/app/classes/Framadate/Migration/Generate_uniqId_for_old_votes.php
@@ -0,0 +1,83 @@
+<?php
+/**
+ * This software is governed by the CeCILL-B license. If a copy of this license
+ * is not distributed with this file, you can obtain one at
+ * http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt
+ *
+ * Authors of STUdS (initial project): Guilhem BORGHESI (borghesi@unistra.fr) and Raphaël DROZ
+ * Authors of Framadate/OpenSondate: Framasoft (https://github.com/framasoft)
+ *
+ * =============================
+ *
+ * Ce logiciel est régi par la licence CeCILL-B. Si une copie de cette licence
+ * ne se trouve pas avec ce fichier vous pouvez l'obtenir sur
+ * http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.txt
+ *
+ * Auteurs de STUdS (projet initial) : Guilhem BORGHESI (borghesi@unistra.fr) et Raphaël DROZ
+ * Auteurs de Framadate/OpenSondage : Framasoft (https://github.com/framasoft)
+ */
+namespace Framadate\Migration;
+
+use Framadate\Security\Token;
+use Framadate\Utils;
+
+/**
+ * This migration generate uniqId for all legacy votes.
+ *
+ * @package Framadate\Migration
+ * @version 0.9
+ */
+class Generate_uniqId_for_old_votes implements Migration {
+
+    function __construct() {
+    }
+
+    function description() {
+        return 'Generate "uniqId" in "vote" table for all legacy votes';
+    }
+
+    function preCondition(\PDO $pdo) {
+        $stmt = $pdo->query('SHOW TABLES');
+        $tables = $stmt->fetchAll(\PDO::FETCH_COLUMN);
+
+        // Check if tables of v0.9 are presents
+        $diff = array_diff([Utils::table('poll'), Utils::table('slot'), Utils::table('vote'), Utils::table('comment')], $tables);
+        return count($diff) === 0;
+    }
+
+    /**
+     * This methode is called only one time in the migration page.
+     *
+     * @param \PDO $pdo The connection to database
+     * @return bool true is the execution succeeded
+     */
+    function execute(\PDO $pdo) {
+
+        $pdo->beginTransaction();
+        $this->generateUniqIdsForEmptyOnes($pdo);
+        $pdo->commit();
+
+        return true;
+    }
+
+    private function generateUniqIdsForEmptyOnes($pdo) {
+        $select = $pdo->query('
+SELECT `id`
+  FROM `' . Utils::table('vote') . '`
+ WHERE `uniqid` = \'\'');
+
+        $update = $pdo->prepare('
+UPDATE `' . Utils::table('vote') . '`
+   SET `uniqid` = :uniqid
+ WHERE `id` = :id');
+
+        while ($row = $select->fetch(\PDO::FETCH_OBJ)) {
+            $token = Token::getToken(16);
+            $update->execute([
+                'uniqid' => $token,
+                'id' => $row->id
+                             ]);
+        }
+    }
+
+}
diff --git a/app/classes/Framadate/Migration/RPadVotes_from_0_8.php b/app/classes/Framadate/Migration/RPadVotes_from_0_8.php
new file mode 100644
index 0000000000000000000000000000000000000000..fcd03c91b94ebc61b8e33c83629a20f42a63f074
--- /dev/null
+++ b/app/classes/Framadate/Migration/RPadVotes_from_0_8.php
@@ -0,0 +1,68 @@
+<?php
+/**
+ * This software is governed by the CeCILL-B license. If a copy of this license
+ * is not distributed with this file, you can obtain one at
+ * http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt
+ *
+ * Authors of STUdS (initial project): Guilhem BORGHESI (borghesi@unistra.fr) and Raphaël DROZ
+ * Authors of Framadate/OpenSondate: Framasoft (https://github.com/framasoft)
+ *
+ * =============================
+ *
+ * Ce logiciel est régi par la licence CeCILL-B. Si une copie de cette licence
+ * ne se trouve pas avec ce fichier vous pouvez l'obtenir sur
+ * http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.txt
+ *
+ * Auteurs de STUdS (projet initial) : Guilhem BORGHESI (borghesi@unistra.fr) et Raphaël DROZ
+ * Auteurs de Framadate/OpenSondage : Framasoft (https://github.com/framasoft)
+ */
+namespace Framadate\Migration;
+
+use Framadate\Utils;
+
+/**
+ * This migration RPad votes from version 0.8.
+ * Because some votes does not have enough values for their poll.
+ *
+ * @package Framadate\Migration
+ * @version 0.9
+ */
+class RPadVotes_from_0_8 implements Migration {
+
+    function description() {
+        return 'RPad votes from version 0.8.';
+    }
+
+    function preCondition(\PDO $pdo) {
+        $stmt = $pdo->query('SHOW TABLES');
+        $tables = $stmt->fetchAll(\PDO::FETCH_COLUMN);
+
+        // Check if tables of v0.9 are presents
+        $diff = array_diff([Utils::table('poll'), Utils::table('slot'), Utils::table('vote'), Utils::table('comment')], $tables);
+        return count($diff) === 0;
+    }
+
+    function execute(\PDO $pdo) {
+
+        $pdo->beginTransaction();
+        $this->rpadVotes($pdo);
+        $pdo->commit();
+
+        return true;
+    }
+
+    private function rpadVotes($pdo) {
+        $pdo->exec('UPDATE fd_vote fv
+INNER JOIN (
+	SELECT v.id, RPAD(v.choices, inn.slots_count, \'0\') new_choices
+	FROM fd_vote v
+	INNER JOIN
+		(SELECT s.poll_id, SUM(IFNULL(LENGTH(s.moments) - LENGTH(REPLACE(s.moments, \',\', \'\')) + 1, 1)) slots_count
+		FROM fd_slot s
+		GROUP BY s.poll_id
+		ORDER BY s.poll_id) inn ON inn.poll_id = v.poll_id
+	WHERE LENGTH(v.choices) != inn.slots_count
+) computed ON fv.id = computed.id
+SET fv.choices = computed.new_choices');
+    }
+}
\ No newline at end of file
diff --git a/app/classes/Framadate/Repositories/PollRepository.php b/app/classes/Framadate/Repositories/PollRepository.php
index 1771b3d425953dac0c5cacb84b007434843ed253..95debe4d0c98693fc02d44bfad439fb18151e0be 100644
--- a/app/classes/Framadate/Repositories/PollRepository.php
+++ b/app/classes/Framadate/Repositories/PollRepository.php
@@ -65,9 +65,11 @@ class PollRepository extends AbstractRepository {
      * Search polls in databse.
      *
      * @param array $search Array of search : ['id'=>..., 'title'=>..., 'name'=>...]
+     * @param int $start The number of first entry to select
+     * @param int $limit The number of entries to find
      * @return array The found polls
      */
-    public function findAll($search) {
+    public function findAll($search, $start, $limit) {
         // Polls
         $prepared = $this->prepare('
 SELECT p.*,
@@ -77,6 +79,7 @@ SELECT p.*,
    AND (:title = "" OR p.title LIKE :title)
    AND (:name = "" OR p.admin_name LIKE :name)
  ORDER BY p.title ASC
+ LIMIT :start, :limit
  ');
 
         $poll = $search['poll'] . '%';
@@ -85,6 +88,8 @@ SELECT p.*,
         $prepared->bindParam(':id', $poll, PDO::PARAM_STR);
         $prepared->bindParam(':title', $title, PDO::PARAM_STR);
         $prepared->bindParam(':name', $name, PDO::PARAM_STR);
+        $prepared->bindParam(':start', $start, PDO::PARAM_INT);
+        $prepared->bindParam(':limit', $limit, PDO::PARAM_INT);
         $prepared->execute();
 
         return $prepared->fetchAll();
@@ -106,13 +111,33 @@ SELECT p.*,
     /**
      * Get the total number of polls in databse.
      *
+     * @param array $search Array of search : ['id'=>..., 'title'=>..., 'name'=>...]
      * @return int The number of polls
      */
-    public function count() {
+    public function count($search = null) {
         // Total count
-        $stmt = $this->query('SELECT count(1) nb FROM `' . Utils::table('poll') . '`');
-        $count = $stmt->fetch();
-        $stmt->closeCursor();
+        $prepared = $this->prepare('
+SELECT count(1) nb
+  FROM `' . Utils::table('poll') . '` p
+ WHERE (:id = "" OR p.id LIKE :id)
+   AND (:title = "" OR p.title LIKE :title)
+   AND (:name = "" OR p.admin_name LIKE :name)
+ ORDER BY p.title ASC');
+
+        $poll = $search == null ? '' : $search['poll'] . '%';
+        $title = $search == null ? '' : '%' . $search['title'] . '%';
+        $name = $search == null ? '' : '%' . $search['name'] . '%';
+        $prepared->bindParam(':id', $poll, PDO::PARAM_STR);
+        $prepared->bindParam(':title', $title, PDO::PARAM_STR);
+        $prepared->bindParam(':name', $name, PDO::PARAM_STR);
+
+        $prepared->execute();
+        $count = $prepared->fetch();
+
+        /*echo '---';
+        print_r($count);
+        echo '---';
+        exit;*/
 
         return $count->nb;
     }
diff --git a/app/classes/Framadate/Services/AdminPollService.php b/app/classes/Framadate/Services/AdminPollService.php
index fb020bcc5eb35ef9077b52ab9845bcae57d36273..a5f147fe30cfc04e4f627a3a1c67cfcaebf3130a 100644
--- a/app/classes/Framadate/Services/AdminPollService.php
+++ b/app/classes/Framadate/Services/AdminPollService.php
@@ -117,7 +117,10 @@ class AdminPollService {
 
         $slots = $this->pollService->allSlotsByPoll($poll);
 
-        if (count($slots) === 1) {
+        // We can't delete the last slot
+        if ($poll->format == 'D' && count($slots) === 1 && strpos($slots[0]->moments, ',') === -1) {
+            return false;
+        } elseif ($poll->format == 'A' && count($slots) === 1) {
             return false;
         }
 
@@ -196,6 +199,8 @@ class AdminPollService {
      * @return bool true if added
      */
     public function addDateSlot($poll_id, $datetime, $new_moment) {
+        $this->logService->log('ADD_SLOT', 'id:' . $poll_id . ', datetime:' . $datetime . ', moment:' . $new_moment);
+
         $slots = $this->slotRepository->listByPollId($poll_id);
         $result = $this->findInsertPosition($slots, $datetime, $new_moment);
 
@@ -243,6 +248,8 @@ class AdminPollService {
      * @return bool true if added
      */
     public function addClassicSlot($poll_id, $title) {
+        $this->logService->log('ADD_SLOT', 'id:' . $poll_id . ', title:' . $title);
+
         $slots = $this->slotRepository->listByPollId($poll_id);
 
         // Check if slot already exists
diff --git a/app/classes/Framadate/Services/InputService.php b/app/classes/Framadate/Services/InputService.php
index 31b3103d142bb47496f694fbd88bf50f10bef635..29e8a4230a20a73f28d475f9ec1ce388c6cd8881 100644
--- a/app/classes/Framadate/Services/InputService.php
+++ b/app/classes/Framadate/Services/InputService.php
@@ -55,7 +55,7 @@ class InputService {
     }
 
     public function filterName($name) {
-        $filtered = filter_var($name, FILTER_VALIDATE_REGEXP, ['options' => ['regexp' => NAME_REGEX]]);
+        $filtered = trim($name);
         return $this->returnIfNotBlank($filtered);
     }
 
diff --git a/app/classes/Framadate/Services/InstallService.php b/app/classes/Framadate/Services/InstallService.php
new file mode 100644
index 0000000000000000000000000000000000000000..0db9f1f8c8562e1c862048fc40fb9eac7027c65c
--- /dev/null
+++ b/app/classes/Framadate/Services/InstallService.php
@@ -0,0 +1,123 @@
+<?php
+/**
+ * This software is governed by the CeCILL-B license. If a copy of this license
+ * is not distributed with this file, you can obtain one at
+ * http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt
+ *
+ * Authors of STUdS (initial project): Guilhem BORGHESI (borghesi@unistra.fr) and Raphaël DROZ
+ * Authors of Framadate/OpenSondate: Framasoft (https://github.com/framasoft)
+ *
+ * =============================
+ *
+ * Ce logiciel est régi par la licence CeCILL-B. Si une copie de cette licence
+ * ne se trouve pas avec ce fichier vous pouvez l'obtenir sur
+ * http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.txt
+ *
+ * Auteurs de STUdS (projet initial) : Guilhem BORGHESI (borghesi@unistra.fr) et Raphaël DROZ
+ * Auteurs de Framadate/OpenSondage : Framasoft (https://github.com/framasoft)
+ */
+namespace Framadate\Services;
+use Framadate\Utils;
+use Smarty;
+
+/**
+ * This class helps to clean all inputs from the users or external services.
+ */
+class InstallService {
+
+    private $fields = array(
+        // General
+        'appName' => 'Framadate',
+        'appMail' => '',
+        'responseMail' => '',
+        'defaultLanguage' => 'fr',
+        'cleanUrl' => true,
+
+        // Database configuration
+        'dbConnectionString' => 'mysql:host=<HOST>;dbname=<SCHEMA>;port=3306',
+        'dbUser' => 'root',
+        'dbPassword' => '',
+        'dbPrefix' => 'fd_',
+        'migrationTable' => 'framadate_migration'
+    );
+
+    function __construct() {}
+
+    public function updateFields($data) {
+        foreach ($data as $field => $value) {
+            $this->fields[$field] = $value;
+        }
+    }
+
+    public function install(Smarty &$smarty) {
+        // Check values are present
+        if (empty($this->fields['appName']) || empty($this->fields['appMail']) || empty($this->fields['defaultLanguage']) || empty($this->fields['dbConnectionString']) || empty($this->fields['dbUser'])) {
+            return $this->error('MISSING_VALUES');
+        }
+
+        // Connect to database
+        $connect = $this->connectTo($this->fields['dbConnectionString'], $this->fields['dbUser'], $this->fields['dbPassword']);
+        if (!$connect) {
+            return $this->error('CANT_CONNECT_TO_DATABASE');
+        }
+
+        // Write configuration to conf.php file
+        $this->writeConfiguration($smarty);
+
+        return $this->ok();
+    }
+
+    function connectTo($connectionString, $user, $password) {
+        try {
+            $pdo = @new \PDO($connectionString, $user, $password);
+            $pdo->setAttribute(\PDO::ATTR_DEFAULT_FETCH_MODE, \PDO::FETCH_OBJ);
+            $pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
+            return $pdo;
+        } catch(\Exception $e) {
+            return null;
+        }
+    }
+
+    function writeConfiguration(Smarty &$smarty) {
+        foreach($this->fields as $field=>$value) {
+            $smarty->assign($field, $value);
+        }
+
+        $content = $smarty->fetch('admin/config.tpl');
+
+        $this->writeToFile($content);
+    }
+
+    /**
+     * @param $content
+     */
+    function writeToFile($content) {
+        file_put_contents(CONF_FILENAME, $content);
+    }
+
+    /**
+     * @return array
+     */
+    function ok() {
+        return array(
+            'status' => 'OK',
+            'msg' => __f('Installation', 'Ended', Utils::get_server_name())
+        );
+    }
+
+    /**
+     * @param $msg
+     * @return array
+     */
+    function error($msg) {
+        return array(
+            'status' => 'ERROR',
+            'code' => $msg
+        );
+    }
+
+    public function getFields() {
+        return $this->fields;
+    }
+
+}
diff --git a/app/classes/Framadate/Services/SuperAdminService.php b/app/classes/Framadate/Services/SuperAdminService.php
index a4b7850045987e69173b0dd370fa654491653b76..3945f079ea385d66d78312f6445af8e3bcbbe5c8 100644
--- a/app/classes/Framadate/Services/SuperAdminService.php
+++ b/app/classes/Framadate/Services/SuperAdminService.php
@@ -26,11 +26,12 @@ class SuperAdminService {
      */
     public function findAllPolls($search, $page, $limit) {
         $start = $page * $limit;
-        $polls = $this->pollRepository->findAll($search);
+        $polls = $this->pollRepository->findAll($search, $start, $limit);
+        $count = $this->pollRepository->count($search);
         $total = $this->pollRepository->count();
 
 
-        return ['polls' => array_slice($polls, $start, $limit), 'count' => count($polls), 'total' => $total];
+        return ['polls' => $polls, 'count' => $count, 'total' => $total];
     }
 
 }
diff --git a/app/classes/Framadate/Utils.php b/app/classes/Framadate/Utils.php
index 04348e2f19d4cedabcdb252e3afa6dea5fa069a6..250528b84ab460c0b2ca713c65fbc17ea9ccf5b5 100644
--- a/app/classes/Framadate/Utils.php
+++ b/app/classes/Framadate/Utils.php
@@ -28,7 +28,7 @@ class Utils {
         $dirname = dirname($_SERVER['SCRIPT_NAME']);
         $dirname = $dirname === '\\' ? '/' : $dirname . '/';
         $dirname = str_replace('/admin', '', $dirname);
-        $server_name = $_SERVER['SERVER_NAME'] . $port . $dirname;
+        $server_name = (defined('APP_URL') ? APP_URL : $_SERVER['SERVER_NAME']) . $port . $dirname;
 
         return $scheme . '://' . preg_replace('#//+#', '/', $server_name);
     }
@@ -75,7 +75,7 @@ class Utils {
         <script type="text/javascript" src="' . self::get_server_name() . 'js/bootstrap-datepicker.js"></script>
         <script type="text/javascript" src="' . self::get_server_name() . 'js/locales/bootstrap-datepicker.' . $locale . '.js"></script>
         <script type="text/javascript" src="' . self::get_server_name() . 'js/core.js"></script>';
-        if (file_exists($_SERVER['DOCUMENT_ROOT'] . "/nav/nav.js")) {
+        if (is_file($_SERVER['DOCUMENT_ROOT'] . "/nav/nav.js")) {
             echo '<script src="/nav/nav.js" id="nav_js" type="text/javascript" charset="utf-8"></script><!-- /Framanav -->';
         }
 
@@ -112,8 +112,7 @@ class Utils {
             }
             if ($vote_id != '') {
                 $url .= '/vote/' . $vote_id . "#edit";
-            }
-            if ($action != null && $action_value != null) {
+            } elseif ($action != null && $action_value != null) {
                 $url .= '/action/' . $action . '/' . $action_value;
             }
         } else {
@@ -124,8 +123,7 @@ class Utils {
             }
             if ($vote_id != '') {
                 $url .= '&vote=' . $vote_id . "#edit";
-            }
-            if ($action != null && $action_value != null)  {
+            } elseif ($action != null && $action_value != null)  {
                 $url .= '&' . $action . "=" . $action_value;
             }
         }
diff --git a/app/inc/XXconfig.php b/app/inc/XXconfig.php
new file mode 100644
index 0000000000000000000000000000000000000000..6530d1364b3d3abd1b9accc4e946665dcc4a3d6b
--- /dev/null
+++ b/app/inc/XXconfig.php
@@ -0,0 +1,88 @@
+<?php
+/**
+ * This software is governed by the CeCILL-B license. If a copy of this license
+ * is not distributed with this file, you can obtain one at
+ * http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt
+ *
+ * Authors of STUdS (initial project): Guilhem BORGHESI (borghesi@unistra.fr) and Raphaël DROZ
+ * Authors of Framadate/OpenSondate: Framasoft (https://github.com/framasoft)
+ *
+ * =============================
+ *
+ * Ce logiciel est régi par la licence CeCILL-B. Si une copie de cette licence
+ * ne se trouve pas avec ce fichier vous pouvez l'obtenir sur
+ * http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.txt
+ *
+ * Auteurs de STUdS (projet initial) : Guilhem BORGHESI (borghesi@unistra.fr) et Raphaël DROZ
+ * Auteurs de Framadate/OpenSondage : Framasoft (https://github.com/framasoft)
+ */
+
+// Fully qualified domain name of your webserver.
+// If this is unset or empty, the servername is determined automatically.
+// You *have to set this* if you are running Framedate behind a reverse proxy.
+// const APP_URL = '<www.mydomain.fr>';
+
+// Application name
+const NOMAPPLICATION = 'Développement OPZ';
+
+// Database administrator email
+const ADRESSEMAILADMIN = 'framadate-dev@olivierperez.fr';
+
+// Email for automatic responses (you should set it to "no-reply")
+const ADRESSEMAILREPONSEAUTO = 'no-reply@olivierperez.fr';
+
+// Database user
+const DB_USER= 'dev_framadate';
+
+// Database password
+const DB_PASSWORD = 'dev_framadate';
+
+// Database server name, leave empty to use a socket
+const DB_CONNECTION_STRING = 'mysql:host=localhost;dbname=framadate_dev;port=3306';
+
+// Name of the table that store migration script already executed
+const MIGRATION_TABLE = 'framadate_migration';
+
+// Table name prefix
+const TABLENAME_PREFIX = 'fd_';
+
+// Default Language using POSIX variant of BC P47 standard (choose in $ALLOWED_LANGUAGES)
+const DEFAULT_LANGUAGE = 'fr';
+
+// List of supported languages, fake constant as arrays can be used as constants only in PHP >=5.6
+$ALLOWED_LANGUAGES = [
+    'fr' => 'Français',
+    'en' => 'English',
+    'es' => 'Español',
+    'de' => 'Deutsch',
+    'it' => 'Italiano',
+];
+
+// Nom et emplacement du fichier image contenant le titre
+const IMAGE_TITRE = 'images/logo-framadate.png';
+
+// Clean URLs, boolean
+const URL_PROPRE = false;
+
+// Use REMOTE_USER data provided by web server
+const USE_REMOTE_USER =  true;
+
+// Path to the log file
+const LOG_FILE = 'admin/stdout.log';
+
+// Days (after expiration date) before purge a poll
+const PURGE_DELAY = 60;
+
+// Config
+$config = [
+    /* general config */
+    'use_smtp' => false,                     // use email for polls creation/modification/responses notification
+    /* home */
+    'show_what_is_that' => true,            // display "how to use" section
+    'show_the_software' => true,            // display technical information about the software
+    'show_cultivate_your_garden' => true,   // display "developpement and administration" information
+    /* create_classic_poll.php / create_date_poll.php */
+    'default_poll_duration' => 180,         // default values for the new poll duration (number of days).
+    /* create_classic_poll.php */
+    'user_can_add_img_or_link' => true,     // user can add link or URL when creating his poll.
+];
diff --git a/app/inc/config.template.php b/app/inc/config.template.php
index 49481c1e526e733bd2221ec3769deebf79b0714c..9aad34e4bcce015035728a42cf554f0f5015f9f0 100644
--- a/app/inc/config.template.php
+++ b/app/inc/config.template.php
@@ -17,6 +17,11 @@
  * Auteurs de Framadate/OpenSondage : Framasoft (https://github.com/framasoft)
  */
 
+// Fully qualified domain name of your webserver.
+// If this is unset or empty, the servername is determined automatically.
+// You *have to set this* if you are running Framedate behind a reverse proxy.
+// const APP_URL = '<www.mydomain.fr>';
+
 // Application name
 const NOMAPPLICATION = '<Application name>';
 
@@ -53,12 +58,6 @@ $ALLOWED_LANGUAGES = [
     'it' => 'Italiano',
 ];
 
-// Path to logo
-const LOGOBANDEAU = '<relative path to the logo file>';
-
-// Path to logo in PDF export
-const LOGOLETTRE = '<relative path to the logo file for pdf>';
-
 // Nom et emplacement du fichier image contenant le titre
 const IMAGE_TITRE = 'images/logo-framadate.png';
 
diff --git a/app/inc/constants.php b/app/inc/constants.php
index d1db10a037627566b5b977911af0340d8132dee6..166b21bf76a2a4514fa6e68ca4c790839d99a6ab 100644
--- a/app/inc/constants.php
+++ b/app/inc/constants.php
@@ -23,7 +23,6 @@ const VERSION = '0.9';
 // Regex
 const POLL_REGEX = '/^[a-z0-9]+$/i';
 const CHOICE_REGEX = '/^[012]$/';
-const NAME_REGEX = '/^[áàâäãåçéèêëíìîïñóòôöõúùûüýÿæœa-z0-9_ -]+$/i';
 const BOOLEAN_REGEX = '/^(on|off|true|false|1|0)$/i';
 const BOOLEAN_TRUE_REGEX = '/^(on|true|1)$/i';
 const EDITABLE_CHOICE_REGEX = '/^[0-2]$/';
diff --git a/app/inc/init.php b/app/inc/init.php
index 63379ef6d02c0f715b561a6e0699baed5f67ffd8..8879bae747efb4e49ec09d9fc34ceb477ce3c5d6 100644
--- a/app/inc/init.php
+++ b/app/inc/init.php
@@ -32,15 +32,31 @@ if (ini_get('date.timezone') == '') {
 }
 
 define('ROOT_DIR', __DIR__ . '/../../');
+define('CONF_FILENAME', ROOT_DIR . '/app/inc/config.php');
 
-require_once __DIR__ . '/constants.php';
-require_once __DIR__ . '/config.php';
-require_once __DIR__ . '/i18n.php';
+if (is_file(CONF_FILENAME)) {
 
-// Smarty
-require_once __DIR__ . '/smarty.php';
+    require_once __DIR__ . '/constants.php';
+    @include_once __DIR__ . '/config.php';
+
+    // Connection to database
+    $connect = new FramaDB(DB_CONNECTION_STRING, DB_USER, DB_PASSWORD);
+    RepositoryFactory::init($connect);
+    $err = 0;
+} else {
+    define('NOMAPPLICATION', 'Framadate');
+    define('DEFAULT_LANGUAGE', 'fr');
+    define('IMAGE_TITRE', 'images/logo-framadate.png');
+    define('LOG_FILE', 'admin/stdout.log');
+    $ALLOWED_LANGUAGES = [
+        'fr' => 'Français',
+        'en' => 'English',
+        'es' => 'Español',
+        'de' => 'Deutsch',
+        'it' => 'Italiano',
+    ];
+}
 
-// Connection to database
-$connect = new FramaDB(DB_CONNECTION_STRING, DB_USER, DB_PASSWORD);
-RepositoryFactory::init($connect);
-$err = 0;
+require_once __DIR__ . '/i18n.php';
+// Smarty
+require_once __DIR__ . '/smarty.php';
\ No newline at end of file
diff --git a/app/inc/smarty.php b/app/inc/smarty.php
index 83dddedf9dff02250a492317db20887a54e9d333..c265bf181a22d99656e7ca3b536e1c04b641e9e1 100644
--- a/app/inc/smarty.php
+++ b/app/inc/smarty.php
@@ -29,7 +29,7 @@ $smarty->assign('APPLICATION_NAME', NOMAPPLICATION);
 $smarty->assign('SERVER_URL', Utils::get_server_name());
 $smarty->assign('SCRIPT_NAME', $_SERVER['SCRIPT_NAME']);
 $smarty->assign('TITLE_IMAGE', IMAGE_TITRE);
-$smarty->assign('use_nav_js', file_exists($_SERVER['DOCUMENT_ROOT'] . '/nav/nav.js'));
+$smarty->assign('use_nav_js', strstr($_SERVER['SERVER_NAME'], 'framadate.org'));
 $smarty->assign('locale', $locale);
 $smarty->assign('langs', $ALLOWED_LANGUAGES);
 $smarty->assign('date_format', $date_format);
@@ -67,4 +67,4 @@ function smarty_modifier_resource($link) {
 
 function smarty_modifier_html($html) {
     return Utils::htmlEscape($html);
-}
+}
\ No newline at end of file
diff --git a/bandeaux.php b/bandeaux.php
index 9f0e073219a6a371d76523ba046a0863163abd65..404e8962eb19783cd262d6c1489b87ef3921c4e1 100644
--- a/bandeaux.php
+++ b/bandeaux.php
@@ -24,7 +24,7 @@ include_once __DIR__ . '/app/inc/init.php';
 function bandeau_titre($titre)
 {
     global $ALLOWED_LANGUAGES;
-    $img = ( IMAGE_TITRE ) ? '<img src="'. Utils::get_server_name(). IMAGE_TITRE. '" alt="'.NOMAPPLICATION.'">' : '';
+    $img = ( IMAGE_TITRE ) ? '<img src="'. Utils::get_server_name(). IMAGE_TITRE. '" alt="'.NOMAPPLICATION.'" class="img-responsive">' : '';
     echo '
     <header role="banner">';
     if(count($ALLOWED_LANGUAGES) > 1){
diff --git a/buildlang.php b/buildlang.php
new file mode 100644
index 0000000000000000000000000000000000000000..9677f405d832727eee21053abc4e5a739f8661be
--- /dev/null
+++ b/buildlang.php
@@ -0,0 +1,46 @@
+<?php
+include_once __DIR__ . '/app/inc/init.php';
+?>
+<html>
+<head>
+    <meta charset="utf-8"/>
+</head>
+<body><pre><?php
+
+    $goodLang = $_GET['good'];
+    $otherLang = $_GET['other'];
+
+    $good = json_decode(file_get_contents(__DIR__ . '/locale/' . $goodLang . '.json'), true);
+    $other = json_decode(file_get_contents(__DIR__ . '/locale/' . $otherLang . '.json'), true);
+
+    foreach ($good as $sectionName => $section) {
+        foreach ($section as $key => $value) {
+            $good[$sectionName][$key] = getFromOther($other, $key, $value, $otherLang);
+        }
+    }
+
+    echo json_encode($good, JSON_PRETTY_PRINT | ~(JSON_ERROR_UTF8 | JSON_HEX_QUOT | JSON_HEX_APOS));
+
+    function getFromOther($other, $goodKey, $default, $otherLang) {
+        foreach ($other as $sectionName => $section) {
+            foreach ($section as $key => $value) {
+                if (
+                    strtolower($key) === strtolower($goodKey) ||
+                    strtolower(trim($key)) === strtolower($goodKey) ||
+                    strtolower(substr($key, 0, strlen($key) - 1)) === strtolower($goodKey) ||
+                    strtolower(trim(substr(trim($key), 0, strlen($key) - 1))) === strtolower($goodKey)
+                ) {
+                    return $value;
+                }
+            }
+        }
+
+        echo '[-]' . $goodKey . "\n";
+
+        return strtoupper($otherLang) . '_' . $default;
+    }
+
+    ?>
+</pre>
+</body>
+</html>
diff --git a/compare.php b/compare.php
new file mode 100644
index 0000000000000000000000000000000000000000..aa780a4a772da52b1635d9822cdb2f2f9770c8b3
--- /dev/null
+++ b/compare.php
@@ -0,0 +1,69 @@
+<?php
+include_once __DIR__ . '/app/inc/init.php';
+?>
+<html>
+<head>
+    <meta charset="utf-8"/>
+</head>
+<body><pre><?php
+
+    $goodLang = $_GET['good'];
+    $testLang = $_GET['test'];
+
+    $good = json_decode(file_get_contents(__DIR__ . '/locale/' . $goodLang . '.json'), true);
+    $test = json_decode(file_get_contents(__DIR__ . '/locale/' . $testLang . '.json'), true);
+
+    $diffSection = false;
+
+    foreach ($good as $sectionName => $section) {
+        if (!isset($test[$sectionName])) {
+            echo '- section: ' . $sectionName . "\n";
+            $diffSection = true;
+        }
+    }
+    foreach ($test as $sectionName => $section) {
+        if (!isset($good[$sectionName])) {
+            echo '+ section: ' . $sectionName . "\n";
+            $diffSection = true;
+        }
+    }
+
+    if (!$diffSection and array_keys($good)!=array_keys($test)) {
+        var_dump(array_keys($good));
+        var_dump(array_keys($test));
+    } else {
+        echo 'All sections are in two langs.' . "\n";
+    }
+
+
+    $diff = array();
+
+    foreach ($good as $sectionName => $section) {
+        $diffSection = false;
+        foreach($section as $key=>$value) {
+            if (!isset($test[$sectionName][$key])) {
+                $diff[$sectionName]['-'][] = $key;
+                $diffSection = true;
+            }
+        }
+
+        if (!$diffSection and array_keys($good[$sectionName]) != array_keys($test[$sectionName])) {
+            $diff[$sectionName]['order_good'] = array_keys($good[$sectionName]);
+            $diff[$sectionName]['order_test'] = array_keys($test[$sectionName]);
+        }
+    }
+
+    foreach ($test as $sectionName => $section) {
+        foreach($section as $key=>$value) {
+            if (!isset($good[$sectionName][$key])) {
+                $diff[$sectionName]['+'][] = $key;
+            }
+        }
+    }
+    if (count($diff) > 0) {
+        var_dump($diff);
+    }
+    ?>
+</pre>
+</body>
+</html>
diff --git a/create_classic_poll.php b/create_classic_poll.php
index 21c652be333d7a77620f8ea2cd5258f72f7937bc..c9da495f4b0f976e2334a65635fa759afb7c4513 100644
--- a/create_classic_poll.php
+++ b/create_classic_poll.php
@@ -32,7 +32,7 @@ $pollService = new PollService($connect, $logService);
 $mailService = new MailService($config['use_smtp']);
 $purgeService = new PurgeService($connect, $logService);
 
-if (file_exists('bandeaux_local.php')) {
+if (is_file('bandeaux_local.php')) {
     include_once('bandeaux_local.php');
 } else {
     include_once('bandeaux.php');
@@ -102,17 +102,17 @@ if (empty($_SESSION['form']->title) || empty($_SESSION['form']->admin_name) || (
             $message = __('Mail', "This is the message you have to send to the people you want to poll. \nNow, you have to send this message to everyone you want to poll.");
             $message .= '<br/><br/>';
             $message .= Utils::htmlEscape($_SESSION['form']->admin_name) . ' ' . __('Mail', 'hast just created a poll called') . ' : "' . Utils::htmlEscape($_SESSION['form']->title) . '".<br/>';
-            $message .= __('Mail', 'Thanks for filling the poll at the link above') . ' :<br/><br/>%s';
+            $message .= __('Mail', 'Thanks for filling the poll at the link above') . ' :<br/><br/><a href="%1$s">%1$s</a>';
 
             $message_admin = __('Mail', "This message should NOT be sent to the polled people. It is private for the poll's creator.\n\nYou can now modify it at the link above");
-            $message_admin .= ' :<br/><br/>%s';
+            $message_admin .= ' :<br/><br/><a href="%1$s">%1$s</a>';
 
             $message = sprintf($message, Utils::getUrlSondage($poll_id));
             $message_admin = sprintf($message_admin, Utils::getUrlSondage($admin_poll_id, true));
 
             if ($mailService->isValidEmail($_SESSION['form']->admin_mail)) {
-                $mailService->send($_SESSION['form']->admin_mail, '[' . NOMAPPLICATION . '][' . __('Mail', 'Author\'s message') . '] ' . __('Generic', 'Poll') . ' : ' . Utils::htmlEscape($_SESSION['form']->title), $message_admin);
-                $mailService->send($_SESSION['form']->admin_mail, '[' . NOMAPPLICATION . '][' . __('Mail', 'For sending to the polled users') . '] ' . __('Generic', 'Poll') . ' : ' . Utils::htmlEscape($_SESSION['form']->title), $message);
+                $mailService->send($_SESSION['form']->admin_mail, '[' . NOMAPPLICATION . '][' . __('Mail', 'Author\'s message') . '] ' . __('Generic', 'Poll') . ': ' . Utils::htmlEscape($_SESSION['form']->title), $message_admin);
+                $mailService->send($_SESSION['form']->admin_mail, '[' . NOMAPPLICATION . '][' . __('Mail', 'For sending to the polled users') . '] ' . __('Generic', 'Poll') . ': ' . Utils::htmlEscape($_SESSION['form']->title), $message);
             }
         }
 
diff --git a/create_date_poll.php b/create_date_poll.php
index d33e48f1de8952d94e888780cbb0d20270d82c18..1cd1b576e9225e0e74c4bce1f81dd6ccdd1ff4b9 100644
--- a/create_date_poll.php
+++ b/create_date_poll.php
@@ -99,17 +99,17 @@ if (!isset($_SESSION['form']->title) || !isset($_SESSION['form']->admin_name) ||
             $message = __('Mail', "This is the message you have to send to the people you want to poll. \nNow, you have to send this message to everyone you want to poll.");
             $message .= '<br/><br/>';
             $message .= Utils::htmlEscape($_SESSION['form']->admin_name) . ' ' . __('Mail', 'hast just created a poll called') . ' : "' . Utils::htmlEscape($_SESSION['form']->title) . '".<br/>';
-            $message .= __('Mail', 'Thanks for filling the poll at the link above') . ' :<br/><br/>%s';
+            $message .= __('Mail', 'Thanks for filling the poll at the link above') . ' :<br/><br/><a href="%1$s">%1$s</a>';
 
             $message_admin = __('Mail', "This message should NOT be sent to the polled people. It is private for the poll's creator.\n\nYou can now modify it at the link above");
-            $message_admin .= ' :<br/><br/>%s';
+            $message_admin .= ' :<br/><br/><a href="%1$s">%1$s</a>';
 
             $message = sprintf($message, Utils::getUrlSondage($poll_id));
             $message_admin = sprintf($message_admin, Utils::getUrlSondage($admin_poll_id, true));
 
             if ($mailService->isValidEmail($_SESSION['form']->admin_mail)) {
-                $mailService->send($_SESSION['form']->admin_mail, '[' . NOMAPPLICATION . '][' . __('Mail', 'Author\'s message') . '] ' . __('Generic', 'Poll') . ' : ' . Utils::htmlEscape($_SESSION['form']->title), $message_admin);
-                $mailService->send($_SESSION['form']->admin_mail, '[' . NOMAPPLICATION . '][' . __('Mail', 'For sending to the polled users') . '] ' . __('Generic', 'Poll') . ' : ' . Utils::htmlEscape($_SESSION['form']->title), $message);
+                $mailService->send($_SESSION['form']->admin_mail, '[' . NOMAPPLICATION . '][' . __('Mail', 'Author\'s message') . '] ' . __('Generic', 'Poll') . ': ' . Utils::htmlEscape($_SESSION['form']->title), $message_admin);
+                $mailService->send($_SESSION['form']->admin_mail, '[' . NOMAPPLICATION . '][' . __('Mail', 'For sending to the polled users') . '] ' . __('Generic', 'Poll') . ': ' . Utils::htmlEscape($_SESSION['form']->title), $message);
             }
         }
 
@@ -168,7 +168,7 @@ if (!isset($_SESSION['form']->title) || !isset($_SESSION['form']->admin_name) ||
             $summary .= '<li>'.strftime($date_format['txt_full'], $choice->getName());
             $first = true;
             foreach ($choice->getSlots() as $slots) {
-                $summary .= $first ? ' : ' : ', ';
+                $summary .= $first ? ': ' : ', ';
                 $summary .= $slots;
                     $first = false;
             }
diff --git a/css/style.css b/css/style.css
index 2688810c634b757815c0b5dc166239e2fbedf421..6d9ad97e9839221ac70b231786c9625bb02f61b1 100644
--- a/css/style.css
+++ b/css/style.css
@@ -311,7 +311,9 @@ table.results .btn-link.btn-sm {
 #vote-form td {
     border-top:2px solid white;
 }
-
+#vote-form td:first-child {
+    min-width: 180px;
+}
 .yes input, .ifneedbe input,.no input {
     position:absolute;
     left:0;
diff --git a/index.php b/index.php
index 364c90c3ef2dfa5a65d3ecf523150f93112f897a..8ee6b6f9eb7d596c65a597183e49ab6d18ceba9d 100644
--- a/index.php
+++ b/index.php
@@ -18,9 +18,15 @@
  */
 
 use Framadate\Services\PollService;
+use Framadate\Utils;
 
 include_once __DIR__ . '/app/inc/init.php';
 
+if (!is_file(CONF_FILENAME)) {
+    header(('Location: ' . Utils::get_server_name() . 'admin/install.php'));
+    exit;
+}
+
 /* SERVICES */
 /* -------- */
 $logService = '\Framadate\Services\LogService';
diff --git a/install/InstallComposer.php b/install/InstallComposer.php
deleted file mode 100644
index a370f9580ab866322595aac5f78970a4fe5d30c4..0000000000000000000000000000000000000000
--- a/install/InstallComposer.php
+++ /dev/null
@@ -1,90 +0,0 @@
-<?php
-
-class InstallComposer
-{
-    /**
-     * @var string
-     */
-    private $composer;
-
-    /**
-     * @return bool
-     */
-    public function check()
-    {
-        return file_exists(dirname(__DIR__).'/vendor/autoload.php');
-    }
-
-    public function install()
-    {
-        require_once 'phar://'.$this->getComposer().'/src/bootstrap.php';
-
-        $this->initEnv();
-
-        $application = new \Composer\Console\Application();
-        $application->setAutoExit(false);
-
-        $input = new \Symfony\Component\Console\Input\ArrayInput(array(
-            'command'   => 'install',
-            '-d'        => __DIR__.'/..',
-            '-vvv',
-            '--optimize-autoloader',
-        ));
-        $output = new \Symfony\Component\Console\Output\NullOutput();
-
-        $application->run($input, $output);
-    }
-
-    /**
-     * @return string
-     */
-    private function getComposer()
-    {
-        if (null === $this->composer) {
-            $this->initComposer();
-        }
-
-        return $this->composer;
-    }
-
-    private function initComposer()
-    {
-        // Composer exist ?
-        $locations = array(
-            __DIR__.'/../composer.phar',
-            '/usr/bin/composer.phar',
-            '/usr/local/bin/composer.phar',
-        );
-
-        $this->composer = null;
-        foreach ($locations as $location) {
-            if (file_exists($location) === true) {
-                $this->composer = $location;
-                break;
-            }
-        }
-
-        // If composer not found, download it !
-        if (null === $this->composer) {
-            if (!file_put_contents(
-                __DIR__.'/../composer.phar',
-                file_get_contents('https://getcomposer.org/composer.phar')
-            )
-            ) {
-                throw new \Exception('Impossible to download composer');
-            }
-
-            $this->composer = __DIR__.'/../composer.phar';
-        }
-    }
-
-    private function initEnv()
-    {
-        $composer_home = getenv('COMPOSER_HOME');
-        $personal_home = getenv('HOME');
-        if (empty($composer_home) === true && empty($personal_home) === true) {
-            putenv('COMPOSER_HOME='.sys_get_temp_dir());
-        }
-    }
-
-}
diff --git a/install/InstallConfiguration.php b/install/InstallConfiguration.php
deleted file mode 100644
index 3595312e98e1c78d234833fc1c769f079b7a8dba..0000000000000000000000000000000000000000
--- a/install/InstallConfiguration.php
+++ /dev/null
@@ -1,73 +0,0 @@
-<?php
-
-class InstallConfiguration
-{
-    /**
-     * @var array
-     */
-    private $datas;
-
-    /**
-     * @var array
-     */
-    private $checks = array(
-        'title' => 'Application name',
-        'email' => 'email address',
-        'no-reply-email' => 'no-reply@mydomain.com',
-        'db-name' => 'database name',
-        'db-user' => 'database user',
-        'db-pass' => 'database password',
-        'db-host' => 'database server',
-        'db-type' => 'database type',
-    );
-
-    /**
-     * @param array     $datas
-     */
-    public function __construct(array $datas)
-    {
-        $this->datas = $datas;
-    }
-
-    /**
-     * @return bool
-     */
-    public function checkValues()
-    {
-        foreach (array_keys($this->checks) as $key) {
-            if (isset($this->datas[$key]) === false) {
-                return false;
-            }
-        }
-
-        return true;
-    }
-
-    public function copy($template, $destination)
-    {
-        $configuration = file_get_contents($template);
-        if (false === $configuration) {
-            throw new \Exception('Impossible to read template configuration');
-        }
-
-        $configuration = $this->convertConfigurationFile($configuration);
-
-        if (file_put_contents($destination, $configuration) === false) {
-            throw new \Exception('Impossible to save configuration');
-        }
-    }
-
-
-    private function convertConfigurationFile($content)
-    {
-        foreach ($this->checks as $replace => $search) {
-            $content = str_replace(
-                '\'<'.$search.'>\'',
-                var_export($this->datas[$replace], true),
-                $content
-            );
-        }
-
-        return $content;
-    }
-}
diff --git a/install/InstallSql.php b/install/InstallSql.php
deleted file mode 100644
index 749767b24b40841da6df73571ad8cf37356b10d8..0000000000000000000000000000000000000000
--- a/install/InstallSql.php
+++ /dev/null
@@ -1,24 +0,0 @@
-<?php
-
-class InstallSql
-{
-    public function inject()
-    {
-        require_once __DIR__.'/../app/inc/init.php';
-
-        if ($connect->ErrorMsg() !== '') {
-            throw new \Exception('Bad database configuration : '.$connect->ErrorMsg());
-        }
-
-        $sqls = explode("\n", file_get_contents(__DIR__.'/install.mysql.auto.sql'));
-        foreach ($sqls as $sql) {
-            $sql = trim($sql);
-            if (empty($sql) === true) {
-                continue;
-            }
-
-            $query = $connect->Prepare($sql);
-            $cleaning = $connect->Execute($query);
-        }
-    }
-}
diff --git a/install/error.html b/install/error.html
deleted file mode 100644
index c6dc5ba17190d3a792eafe1e050a4641df1d8fd7..0000000000000000000000000000000000000000
--- a/install/error.html
+++ /dev/null
@@ -1,33 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-    <head>
-        <meta charset="utf-8" />
-        <title>OpenSondage Installation</title>
-        <link rel="stylesheet" href="../css/bootstrap.min.css">
-        <link rel="stylesheet" href="../css/style.css">
-        <link rel="stylesheet" href="../css/frama.css">
-        <link rel="stylesheet" href="install.css">
-    </head>
-    <body>
-        <div class="container ombre">
-            <header role="banner">
-                <h1>
-                    <img src="../images/logo-framadate.png" width="360" height="50" alt="Framadate" />
-                </h1>
-                <h2>Make your polls</h2>
-                <hr class="trait" role="presentation">
-            </header>
-            <main role="main">
-                <h3>Framadate Installation</h3>
-                <div class="alert alert-danger" role="alert">
-                    <?php echo htmlspecialchars($e->getMessage(), ENT_COMPAT | ENT_HTML401, 'UTF-8') ?>
-                </div>
-                <div class="alert alert-info" role="alert">
-                    <pre>
-                    <?php echo htmlspecialchars($e->getTraceAsString(), ENT_COMPAT | ENT_HTML401, 'UTF-8') ?>
-                    </pre>
-                </div>
-            </main>
-        </div>
-    </body>
-</html>
diff --git a/install/install.css b/install/install.css
deleted file mode 100644
index 18f3dc539ee9ec75f531f15e039821948e604e6e..0000000000000000000000000000000000000000
--- a/install/install.css
+++ /dev/null
@@ -1,11 +0,0 @@
-header {
-    padding-bottom: 0;
-}
-
-main {
-    padding-top: 0;
-}
-
-fieldset {
-    margin: 1.5em 0;
-}
\ No newline at end of file
diff --git a/install/install.html b/install/install.html
deleted file mode 100644
index 1caa3af2c9c9e3764280be3595520e9d459f1a5f..0000000000000000000000000000000000000000
--- a/install/install.html
+++ /dev/null
@@ -1,72 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-    <head>
-        <meta charset="utf-8" />
-        <title>OpenSondage Installation</title>
-        <link rel="stylesheet" href="../css/bootstrap.min.css">
-        <link rel="stylesheet" href="../css/style.css">
-        <link rel="stylesheet" href="../css/frama.css">
-        <link rel="stylesheet" href="install.css">
-    </head>
-    <body>
-        <div class="container ombre">
-            <header role="banner">
-                <h1>
-                    <img src="../images/logo-framadate.png" width="360" height="50" alt="Framadate" />
-                </h1>
-                <h2>Make your polls</h2>
-                <hr class="trait" role="presentation">
-            </header>
-            <main role="main">
-                <h3>Framadate Installation</h3>
-                <form action="" method="post" role="form">
-                    <fieldset>
-                        <legend>General</legend>
-
-                        <div class="form-group">
-                            <label for="title">Title</label>
-                            <input type="text" class="form-control" id="title" name="title" placeholder="Application name" required>
-                        </div>
-                        <div class="form-group">
-                            <label for="email">Administrator email</label>
-                            <input type="email" class="form-control" id="email" name="email" placeholder="Email of the administrator" required>
-                        </div>
-                        <div class="form-group">
-                            <label for="no-reply-email">No-reply email</label>
-                            <input type="email" class="form-control" id="no-reply-email" name="no-reply-email" placeholder="Email for automatic responses" required>
-                        </div>
-                    </fieldset>
-                    <fieldset>
-                        <legend>Database</legend>
-
-                        <div class="form-group">
-                            <label for="db-type">Type</label>
-                            <select name="db-type" id="db-type" required>
-                                <option value="pdo">PDO - MySQL (recommanded)</option>
-                                <option value="mysql">MySQL</option>
-                            </select>
-                        </div>
-                        <div class="form-group">
-                            <label for="db-host">Host</label>
-                            <input type="text" class="form-control" id="db-host" name="db-host" value="localhost" required>
-                        </div>
-                        <div class="form-group">
-                            <label for="db-name">Database name</label>
-                            <input type="text" class="form-control" id="db-name" name="db-name" value="opensondage" required>
-                        </div>
-                        <div class="form-group">
-                            <label for="db-user">Username</label>
-                            <input type="text" class="form-control" id="db-user" name="db-user" value="root" required>
-                        </div>
-                        <div class="form-group">
-                            <label for="db-pass">Password</label>
-                            <input type="password" class="form-control" id="db-pass" name="db-pass" value="">
-                        </div>
-                    </fieldset>
-
-                    <input type="submit" class="btn btn-success" name="install" value="Install">
-                </form>
-            </main>
-        </div>
-    </body>
-</html>
diff --git a/install/install.mysql.auto.sql b/install/install.mysql.auto.sql
deleted file mode 100644
index a42245e12f6a0a91f9733597c046827754409098..0000000000000000000000000000000000000000
--- a/install/install.mysql.auto.sql
+++ /dev/null
@@ -1,8 +0,0 @@
-CREATE TABLE IF NOT EXISTS `comments` (`id_comment` int(11) unsigned NOT NULL AUTO_INCREMENT, `id_sondage` char(16) NOT NULL, `comment` text NOT NULL, `usercomment` text, PRIMARY KEY (`id_comment`), KEY `id_sondage` (`id_sondage`) ) ENGINE=InnoDB  DEFAULT CHARSET=utf8;
-CREATE TABLE IF NOT EXISTS `sondage` (`id_sondage` char(16) NOT NULL, `commentaires` text, `mail_admin` varchar(128) DEFAULT NULL, `nom_admin` varchar(64) DEFAULT NULL, `titre` text, `id_sondage_admin` char(24) DEFAULT NULL, `date_creation` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `date_fin` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', `format` varchar(2) DEFAULT NULL, `mailsonde` tinyint(1) DEFAULT '0', `statut` int(11) NOT NULL DEFAULT '1' COMMENT '1 = actif ; 0 = inactif ; ', UNIQUE KEY `id_sondage` (`id_sondage`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-CREATE TABLE IF NOT EXISTS `sujet_studs` (`id_sondage` char(16) NOT NULL, `sujet` text, KEY `id_sondage` (`id_sondage`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-CREATE TABLE IF NOT EXISTS `user_studs` (`id_users` int(11) unsigned NOT NULL AUTO_INCREMENT, `nom` varchar(64) NOT NULL, `id_sondage` char(16) NOT NULL, `reponses` text NOT NULL, PRIMARY KEY (`id_users`), KEY `id_sondage` (`id_sondage`)) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=0 ;
-
-INSERT INTO `sondage` (`id_sondage`, `commentaires`, `mail_admin`, `nom_admin`, `titre`, `id_sondage_admin`, `date_fin`, `format`) VALUES ('aqg259dth55iuhwm','Repas de Noel du service','Stephanie@retaillard.com','Stephanie', 'Repas de Noel','aqg259dth55iuhwmy9d8jlwk', FROM_UNIXTIME('1627100361'),'D+');
-INSERT INTO `sujet_studs` (`id_sondage`, `sujet`) VALUES ('aqg259dth55iuhwm','1225839600@12h,1225839600@19h,1226012400@12h,1226012400@19h,1226876400@12h,1226876400@19h,1227049200@12h,1227049200@19h,1227826800@12h,1227826800@19h');
-INSERT INTO `user_studs` (`nom`, `id_sondage`, `reponses`, `id_users`) VALUES ('marcel','aqg259dth55iuhwm','0110111101','933'), ('paul','aqg259dth55iuhwm','1011010111','935'), ('sophie','aqg259dth55iuhwm','1110110000','945'), ('barack','aqg259dth55iuhwm','0110000','948'), ('takashi','aqg259dth55iuhwm','0000110100','951'), ('albert','aqg259dth55iuhwm','1010110','975'), ('alfred','aqg259dth55iuhwm','0110010','1135'), ('marcs','aqg259dth55iuhwm','0100001010','1143'), ('laure','aqg259dth55iuhwm','0011000','1347'), ('benda','aqg259dth55iuhwm','1101101100','1667'), ('Albert','aqg259dth55iuhwm','1111110011','1668');
diff --git a/install/install.mysql.sql b/install/install.mysql.sql
deleted file mode 100644
index aa0354cf984784bb559f1586a622202019f47781..0000000000000000000000000000000000000000
--- a/install/install.mysql.sql
+++ /dev/null
@@ -1,112 +0,0 @@
--- --------------------------------------------------------
-
---
--- Table structure `poll`
---
-
-CREATE TABLE IF NOT EXISTS `poll` (
-  `id`              CHAR(16)  NOT NULL,
-  `admin_id`        CHAR(24)  NOT NULL,
-  `title`           TEXT      NOT NULL,
-  `description`     TEXT,
-  `admin_name`      VARCHAR(64) DEFAULT NULL,
-  `admin_mail`      VARCHAR(128) DEFAULT NULL,
-  `creation_date`   TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
-  `end_date`        TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',
-  `format`          VARCHAR(1) DEFAULT NULL,
-  `editable`        TINYINT(1) DEFAULT '0',
-  `receiveNewVotes` TINYINT(1) DEFAULT '0',
-  `active`          TINYINT(1) DEFAULT '1',
-  PRIMARY KEY (`id`)
-)
-  ENGINE = InnoDB
-  DEFAULT CHARSET = utf8;
-
--- --------------------------------------------------------
-
---
--- Table structure `slot`
---
-
-CREATE TABLE IF NOT EXISTS `slot` (
-  `id`      INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
-  `poll_id` CHAR(16)         NOT NULL,
-  `title`   TEXT,
-  `moments` TEXT,
-  PRIMARY KEY (`id`),
-  KEY `poll_id` (`poll_id`)
-)
-  ENGINE = InnoDB
-  DEFAULT CHARSET = utf8;
-
--- --------------------------------------------------------
-
---
--- Table structure `comment`
---
-
-CREATE TABLE IF NOT EXISTS `comment` (
-  `id`      INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
-  `poll_id` CHAR(16)         NOT NULL,
-  `name`    TEXT,
-  `comment` TEXT             NOT NULL,
-  PRIMARY KEY (`id`),
-  KEY `poll_id` (`poll_id`)
-)
-  ENGINE = InnoDB
-  DEFAULT CHARSET = utf8;
-
--- --------------------------------------------------------
-
---
--- Table structure `vote`
---
-
-CREATE TABLE IF NOT EXISTS `vote` (
-  `id`      INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
-  `poll_id` CHAR(16)         NOT NULL,
-  `name`    VARCHAR(64)      NOT NULL,
-  `choices` TEXT             NOT NULL,
-  PRIMARY KEY (`id`),
-  KEY `poll_id` (`poll_id`)
-)
-  ENGINE = InnoDB
-  DEFAULT CHARSET = utf8;
-
-
---
--- Data for Name: poll; Type: TABLE DATA;
---
-
-INSERT INTO `poll`
-(`id`, `description`, `admin_mail`, `admin_name`, `title`, `admin_id`, `end_date`, `format`)
-VALUES
-  ('aqg259dth55iuhwm', 'Repas de Noel du service', 'Stephanie@retaillard.com', 'Stephanie', 'Repas de Noel',
-   'aqg259dth55iuhwmy9d8jlwk', FROM_UNIXTIME('1627100361'), 'D');
-
---
--- Data for Name: slot; Type: TABLE DATA;
---
-
-INSERT INTO `slot` (`poll_id`, `title`, `moments`) VALUES
-  ('aqg259dth55iuhwm', '1225839600', '12h,19h'),
-  ('aqg259dth55iuhwm', '1226012400', '12h,19h'),
-  ('aqg259dth55iuhwm', '1226876400', '12h,19h'),
-  ('aqg259dth55iuhwm', '1227826800', '12h,19h');
-
---
--- Data for Name: vote; Type: TABLE DATA;
---
-
-INSERT INTO `vote` (`name`, `poll_id`, `choices`) VALUES
-  ('marcel', 'aqg259dth55iuhwm', '02202222'),
-  ('paul', 'aqg259dth55iuhwm', '20220202'),
-  ('sophie', 'aqg259dth55iuhwm', '22202200'),
-  ('barack', 'aqg259dth55iuhwm', '02200000'),
-  ('takashi', 'aqg259dth55iuhwm', '00002202'),
-  ('albert', 'aqg259dth55iuhwm', '20202200'),
-  ('alfred', 'aqg259dth55iuhwm', '02200200'),
-  ('marcs', 'aqg259dth55iuhwm', '02000020'),
-  ('laure', 'aqg259dth55iuhwm', '00220000'),
-  ('benda', 'aqg259dth55iuhwm', '22022022'),
-  ('albert', 'aqg259dth55iuhwm', '22222200');
diff --git a/install/install.php b/install/install.php
deleted file mode 100644
index 8cf9f3f9b13cdf0a390875d4cbe1549969d1bb20..0000000000000000000000000000000000000000
--- a/install/install.php
+++ /dev/null
@@ -1,43 +0,0 @@
-<?php
-
-require_once __DIR__.'/InstallComposer.php';
-require_once __DIR__.'/InstallConfiguration.php';
-require_once __DIR__.'/InstallSql.php';
-
-$configuration_file = __DIR__.'/../app/inc/constants.php';
-
-if (file_exists($configuration_file) === true) {
-    header('Location: ../index.php');
-    exit;
-}
-
-if (isset($_POST['install']) === true) {
-    try {
-        // Composer installation
-        $composer = new InstallComposer();
-        if ($composer->check() === false) {
-            ini_set('max_execution_time', 0);
-            $composer->install();
-        }
-
-        // Save configuration
-        $configuration = new InstallConfiguration($_POST);
-        if ($configuration->checkValues() === false) {
-            throw new \Exception('Bad value for configuration');
-        }
-
-        $configuration->copy($configuration_file.'.template', $configuration_file);
-
-        // Inject database
-        $sql = new InstallSql();
-        $sql->inject();
-
-        header('Location: ../index.php');
-        die();
-    } catch (Exception $e) {
-        require_once __DIR__.'/error.html';
-        die();
-    }
-}
-
-require_once __DIR__.'/install.html';
diff --git a/js/app/studs.js b/js/app/studs.js
index 52fd1021dc1f134661c8ae02b32a3d656e1e2f9a..2ef5aeec5a748402d398260ac489df33208174b5 100644
--- a/js/app/studs.js
+++ b/js/app/studs.js
@@ -20,10 +20,9 @@ $(document).ready(function () {
 
     $("#poll_form").submit(function (event) {
         var name = $("#name").val();
-        var regexContent = $("#parameter_name_regex").text().split("/");
-        var regex = new RegExp(regexContent[1], regexContent[2]);
+        name = name.trim();
 
-        if (name.length == 0 || !regex.test(name)) {
+        if (name.length == 0) {
             event.preventDefault();
             var newMessage = $("#nameErrorMessage").clone();
             $("#message-container").empty();
diff --git a/js/core.js b/js/core.js
index be4fcbdf8ab3bc68e206909b73b89b1d0d94c007..b703c34ab7bdcebc2a4f367007595f4cd892a7fb 100644
--- a/js/core.js
+++ b/js/core.js
@@ -8,98 +8,98 @@ $(document).ready(function() {
 
     $('#title-form .btn-edit').on('click', function() {
         $('#title-form h3').hide();
-        $('.js-title').removeClass("hidden");
+        $('.js-title').removeClass('hidden');
         $('.js-title input').focus();
         return false;
     });
 
     $('#title-form .btn-cancel').on('click', function() {
         $('#title-form h3').show();
-        $('#title-form .js-title').addClass("hidden");
+        $('#title-form .js-title').addClass('hidden');
         $('#title-form .btn-edit').focus();
         return false;
     });
 
     $('#name-form .btn-edit').on('click', function() {
         $('#name-form p').hide();
-        $('.js-name').removeClass("hidden");
+        $('.js-name').removeClass('hidden');
         $('.js-name input').focus();
         return false;
     });
 
     $('#name-form .btn-cancel').on('click', function() {
         $('#name-form p').show();
-        $('#name-form .js-name').addClass("hidden");
+        $('#name-form .js-name').addClass('hidden');
         $('#name-form .btn-edit').focus();
         return false;
     });
 
     $('#email-form .btn-edit').on('click', function() {
         $('#email-form p').hide();
-        $('#email-form .js-email').removeClass("hidden");
+        $('#email-form .js-email').removeClass('hidden');
         $('.js-email input').focus();
         return false;
     });
 
     $('#email-form .btn-cancel').on('click', function() {
         $('#email-form p').show();
-        $('#email-form .js-email').addClass("hidden");
+        $('#email-form .js-email').addClass('hidden');
         $('#email-form .btn-edit').focus();
         return false;
     });
 
     $('#description-form .btn-edit').on('click', function() {
         $('#description-form .well').hide();
-        $('#description-form .js-desc').removeClass("hidden");
+        $('#description-form .js-desc').removeClass('hidden');
         $('.js-desc textarea').focus();
         return false;
     });
 
     $('#description-form .btn-cancel').on('click', function() {
         $('#description-form .well').show();
-        $('#description-form .js-desc').addClass("hidden");
+        $('#description-form .js-desc').addClass('hidden');
         $('.js-desc .btn-edit').focus();
         return false;
     });
 
     $('#poll-rules-form .btn-edit').on('click', function() {
         $('#poll-rules-form p').hide();
-        $('#poll-rules-form .js-poll-rules').removeClass("hidden");
+        $('#poll-rules-form .js-poll-rules').removeClass('hidden');
         $('.js-poll-rules select').focus();
         return false;
     });
 
     $('#poll-rules-form .btn-cancel').on('click', function() {
         $('#poll-rules-form p').show();
-        $('#poll-rules-form .js-poll-rules').addClass("hidden");
+        $('#poll-rules-form .js-poll-rules').addClass('hidden');
         $('.js-poll-rules .btn-edit').focus();
         return false;
     });
 
     $('#poll-hidden-form .btn-edit').on('click', function() {
         $('#poll-hidden-form p').hide();
-        $('#poll-hidden-form .js-poll-hidden').removeClass("hidden");
+        $('#poll-hidden-form .js-poll-hidden').removeClass('hidden');
         $('.js-poll-hidden input[type=checkbox]').focus();
         return false;
     });
 
     $('#poll-hidden-form .btn-cancel').on('click', function() {
         $('#poll-hidden-form p').show();
-        $('#poll-hidden-form .js-poll-hidden').addClass("hidden");
+        $('#poll-hidden-form .js-poll-hidden').addClass('hidden');
         $('.js-poll-hidden .btn-edit').focus();
         return false;
     });
 
     $('#expiration-form .btn-edit').on('click', function() {
         $('#expiration-form p').hide();
-        $('.js-expiration').removeClass("hidden");
+        $('.js-expiration').removeClass('hidden');
         $('.js-expiration input').focus();
         return false;
     });
 
     $('#expiration-form .btn-cancel').on('click', function() {
         $('#expiration-form p').show();
-        $('#expiration-form .js-expiration').addClass("hidden");
+        $('#expiration-form .js-expiration').addClass('hidden');
         $('#expiration-form .btn-edit').focus();
         return false;
     });
@@ -115,31 +115,54 @@ $(document).ready(function() {
     $('.scroll-left').addClass('disabled');
 
     $('.scroll-left').click(function(){
+        var next = Math.floor($scroll_page);
+        if(next == $scroll_page) {
+            next--;
+        }
+
         $('.scroll-right').removeClass('disabled');
-        $( "#tableContainer" ).animate({
-            scrollLeft: $scroll_scale*($scroll_page-1)
+        $('#tableContainer').animate({
+            scrollLeft: $scroll_scale*(next - 1)
         }, 1000);
         if($scroll_page == 1) {
             $(this).addClass('disabled');
         } else {
-            $scroll_page = $scroll_page-1;
+            $scroll_page = next;
         }
         return false;
     });
     $('.scroll-right').click(function(){
+        var next = Math.ceil($scroll_page);
+        if(next == $scroll_page)
+            next++;
         $('.scroll-left').removeClass('disabled');
-        $( "#tableContainer" ).animate({
-            scrollLeft: $scroll_scale*($scroll_page)
+        $('#tableContainer').animate({
+            scrollLeft: $scroll_scale*(next - 1)
         }, 1000);
 
-        if($scroll_scale*($scroll_page+1) > $( ".results" ).width()) {
+        if($scroll_scale*($scroll_page+1) > $('.results').width()) {
             $(this).addClass('disabled');
         } else {
-            $scroll_page++;
+            $scroll_page = next;
         }
         return false;
     });
 
+    $('#tableContainer').scroll(function() {
+        var position = $(this).scrollLeft();
+        $scroll_page = position / $scroll_scale + 1;
+        if(position == 0) {
+            $('.scroll-left').addClass('disabled');
+        } else {
+            $('.scroll-left').removeClass('disabled');
+        }
+
+        if(position >= $('.results').width() - $('#tableContainer').width()) {
+            $('.scroll-right').addClass('disabled');
+        } else {
+            $('.scroll-right').removeClass('disabled');
+        }
+    });
 });
 
 // Vote form moving to the top or to the bottom
diff --git a/locale/de.json b/locale/de.json
index 2b266a84405f2f28c7b2d79edce99ed2472ccc19..56fdbfe51497f15692d61d65df17a852d5e4c6a4 100644
--- a/locale/de.json
+++ b/locale/de.json
@@ -1,7 +1,7 @@
 {
     "Generic": {
         "Make your polls": "Eigene Umfragen erstellen",
-        "Home": "Heimat",
+        "Home": "Startseite",
         "Poll": "Umfrage",
         "Save": "Speichern",
         "Cancel": "Abbrechen",
@@ -16,7 +16,7 @@
         "Your email address": "Ihre E-Mail-Adresse",
         "(in the format name@mail.com)": "(Format: name@mail.com)",
         "Description": "Beschreibung",
-        "Back to the homepage of": "Zurück zur Homepage von ",
+        "Back to the homepage of": "Zurück zur Startseite von ",
         "days": "Tage",
         "months": "Monate",
         "Day": "Tag",
@@ -36,7 +36,8 @@
         "Choice": "Wahl",
         "Link": "Link",
         "Search": "Suche",
-        "Creation date:": "Erstellungsdatum:"
+        "Creation date:": "Erstellungsdatum:",
+        "ASTERISK": "*"
     },
     "Date": {
         "dd/mm/yyyy": "jj/mm/aaaa",
@@ -55,7 +56,7 @@
     "Homepage": {
         "Schedule an event": "Termin finden",
         "Make a classic poll": "Klassische Umfrage",
-        "Where are my polls": "Wo sind meine Umfragen"
+        "Where are my polls": "Wo sind meine Umfragen?"
     },
     "Maintenance": {
         "The application": "die Anwendung",
@@ -64,151 +65,151 @@
     },
     "1st section": {
         "What is that?": "Was ist das?",
-        "Framadate is an online service for planning an appointment or make a decision quickly and easily. No registration is required.": "Framadate ist ein Online-Dienst, das Ihnen hilft, Termine zu finden oder Entscheidungen schnell und einfach zu treffen. Keine Registrierung ist erforderlich. ",
+        "Framadate is an online service for planning an appointment or make a decision quickly and easily. No registration is required.": "Framadate ist ein Online-Dienst, der Ihnen bei der Absprache von Terminen oder der Entscheidungsfindung hilft. Es ist keinerlei Registrierung ist erforderlich. ",
         "Here is how it works:": "So geht es:",
         "Make a poll": "Umfrage erstellen",
-        "Define dates or subjects to choose": "Datum- oder Auswahlmöglichkeiten definieren",
+        "Define dates or subjects to choose": "Zeitpunkte oder andere Alternativen zur Auswahl stellen",
         "Send the poll link to your friends or colleagues": "Link zur Umfrage an Ihre Freunde oder Kollegen schicken",
-        "Discuss and make a decision": "Besprechen und Entscheidung treffen",
+        "Discuss and make a decision": "Besprechen und Entscheidungen treffen",
         "Do you want to": "Wollen Sie sich",
-        "view an example?": "einen Beispiel ansehen?"
+        "view an example?": "ein Beispiel ansehen?"
     },
     "2nd section": {
         "The software": "Die Software",
-        "Framadate was initially based on ": "Framadate war am Anfang auf ",
-        "a software developed by the University of Strasbourg. Today, it is devevoped by the association Framasoft.": "basiert, eine von der Straßburg-Universität entwickelte Software. Heutzutage wird sie von der Framasoft-Vereinigung entwickelt.",
-        "This software needs javascript and cookies enabled. It is compatible with the following web browsers:": "Für diese Software müssen Javascript und Cookie aktiviert sein. Sie ist mit den folgenden Browsers kompatibel:",
+        "Framadate was initially based on ": "Framadate basierte zunächst auf ",
+        "a software developed by the University of Strasbourg. Today, it is devevoped by the association Framasoft.": ", einer von der Universität von Straßburg entwickelten Software. Heute wird sie vom Verein Framasoft weiterentwickelt.",
+        "This software needs javascript and cookies enabled. It is compatible with the following web browsers:": "Javascript und Cookie aktiviert sein, damit Framadate funktioniert. Die Software ist mit den folgenden Browsern kompatibel:",
         "It is governed by the": "Sie ist lizenziert unter der",
         "CeCILL-B license": "CeCILL-B Lizenz"
     },
     "3rd section": {
         "Cultivate your garden": "Bestellen Sie ihren Garten",
-        "To participate in the software development, suggest improvements or simply download it, please visit ": "Um zur Software-Entwicklung teilzunehmen, Verbesserungen vorzuschlagen oder um sie herunterzuladen, gehen Sie auf ",
-        "the development site": "die Entwicklung-Seite",
-        "If you want to install the software for your own use and thus increase your independence, we help you on:": "Wenn Sie die Software für Ihre eigene Nutzung installieren möchten und Ihre Eigenständigkeit erhöhen, helfen wir Sie auf:"
+        "To participate in the software development, suggest improvements or simply download it, please visit ": "Um an der Entwicklung der Software teilzunehmen, Verbesserungen vorzuschlagen oder um sie herunterzuladen, rufen sie diese Seite auf: ",
+        "the development site": "die Seite der Entwickler",
+        "If you want to install the software for your own use and thus increase your independence, we help you on:": "Wenn Sie die Software für die eigene Nutzung installieren und damit Ihre Unabhängigkeit erhöhen möchten, helfen wir Ihnen auf:"
     },
     "PollInfo": {
         "Remove the poll": "Umfrage löschen",
         "Remove all the comments": "Alle Kommentare löschen",
-        "Remove all the votes": "Alle Stimmungen löschen",
+        "Remove all the votes": "Alle Wertungen löschen",
         "Print": "Drucken",
         "Export to CSV": "CSV-Export",
         "Title": "Titel",
         "Edit the title": "Titel bearbeiten",
         "Save the new title": "Den neuen Titel speichern",
-        "Cancel the title edit": "Änderung des Titels abbrechen",
-        "Initiator of the poll": "Ersteller der Umfrage",
+        "Cancel the title edit": "Abbruch, Titel nicht ändern",
+        "Initiator of the poll": "Autor der Umfrage",
         "Edit the name": "Bearbeiten Sie den Namen",
         "Save the new name": "Speichern Sie den neuen Namen",
-        "Cancel the name edit": "Brechen Sie den Namen bearbeiten",
+        "Cancel the name edit": "Abbruch, Namen nicht ändern",
         "Email": "E-Mail-Adresse",
         "Edit the email adress": "E-Mail-Adresse ändern",
         "Save the email address": "Speichern Sie die E-Mail-Adresse",
-        "Cancel the email address edit": "Brechen Sie die E-Mail-Adresse bearbeiten",
+        "Cancel the email address edit": "Abbruch, Mail-Adresse nicht ändern",
         "Edit the description": "Beschreibung bearbeiten",
         "Save the description": "Beschreibung speichern",
-        "Cancel the description edit": "Änderung der Beschreibung verwerfen",
+        "Cancel the description edit": "Änderungen der Beschreibung verwerfen",
         "Public link of the poll": "Öffentlicher Link zur Umfrage",
-        "Admin link of the poll": "Administrator-Link der Umfrage",
-        "Expiration date": "Verfallsdatum",
+        "Admin link of the poll": "Administrationsseite der Umfrage",
+        "Expiration date": "Ablaufdatum",
         "Edit the expiration date": "Bearbeiten Sie das Ablaufdatum",
         "Save the new expiration date": "Speichern Sie das neue Ablaufdatum",
-        "Cancel the expiration date edit": "Deaktivieren Sie die Ablaufdatum bearbeiten",
+        "Cancel the expiration date edit": "Abbruch, Ablaufdatum nicht ändern",
         "Poll rules": "Regeln der Umfrage",
         "Edit the poll rules": "Regeln der Umfrage bearbeiten",
-        "Votes and comments are locked": "Abstimmungen und Kommentare sind gesperrt",
-        "Votes and comments are open": "Abstimmungen und Kommentare sind möglich",
-        "Votes are editable": "Die Abstimmungen können geändert werden",
-        "Votes are editable solely by their owner.": "Stimmen sind nur editierbar von ihrem Eigentümer",
+        "Votes and comments are locked": "Wertungen und Kommentare sind gesperrt",
+        "Votes and comments are open": "Wertungen und Kommentare sind erlaubt",
+        "Votes are editable": "Die Wertungen können geändert werden",
+        "Votes are editable solely by their owner.": "Wertungen können nur vom Urheber geändert werden",
         "Save the new rules": "Neue Regeln speichern",
-        "Cancel the rules edit": "Neue Regeln nicht speichern",
+        "Cancel the rules edit": "Abbruch, Regeln nicht ändern",
         "Results are hidden.": "Ergebnisse werden ausgeblendet.",
         "Results are visible.": "Ergebnisse sind sichtbar."
     },
     "Poll results": {
-        "Votes of the poll": "Abstimmungen der Umfrage ",
+        "Votes of the poll": "Stimmabgaben zur Umfrage",
         "Edit the line:": "Zeile bearbeiten:",
         "Remove the line:": "Zeile entfernen:",
-        "Vote no for": "Nein stimmen für",
-        "Vote yes for": "Abstimmung ja für",
-        "Vote ifneedbe for": "Vote falls für sein",
+        "Vote no for": "Nein-Stimmen für",
+        "Vote yes for": "Ja-Stimmen für",
+        "Vote ifneedbe for": "Ja-Stimmen unter Vorbehalt",
         "Save the choices": "Wahl speichern",
         "Addition": "Hinzufügen",
-        "Best choice": "Bste Option",
-        "Best choices": "Besten Optionen",
+        "Best choice": "Beste Alternative",
+        "Best choices": "Beste Alternativen",
         "The best choice at this time is:": "Die beste Option ist derzeit:",
-        "The bests choices at this time are:": "Die beste Optionen sind derzeit:",
-        "Scroll to the left": "Links scrollen",
-        "Scroll to the right": "Rechts scrollen"
-        "polled user": "DE_votant",
-        "polled users": "DE_votants",
-        "Display the chart of the results": "DE_Afficher le graphique des résultats",
-        "Chart": "DE_Graphique"
+        "The bests choices at this time are:": "Die besten Optionen sind derzeit:",
+        "Scroll to the left": "Nach links scrollen",
+        "Scroll to the right": "Nach rechts scrollen",
+        "polled user": "Stimme",
+        "polled users": "Stimmen",
+        "Display the chart of the results": "Ergebnisgrafik anzeigen",
+        "Chart": "Grafik"
     },
     "Comments": {
-        "Comments of polled people": "Kommentare von Teilnehmer",
+        "Comments of polled people": "Kommentare der Teilnehmer",
         "Remove the comment": "Kommentar entfernen",
-        "Add a comment to the poll": "Add a comment to the poll",
+        "Add a comment to the poll": "Kommentar zur Abstimmung abgeben",
         "Your comment": "Ihr Kommentar",
-        "Send the comment": "Kommentar senden",
+        "Send the comment": "Kommentar abschicken",
         "anonyme": "anonym",
         "Comment added": "Kommentar hinzugefügt"
     },
     "studs": {
-        "If you want to vote in this poll, you have to give your name, choose the values that fit best for you and validate with the plus button at the end of the line.": "Wenn Sie bei dieser Umfrage abstimmen möchten, müssen Sie ihren Namen angeben. Wählen Sie die Optionen, die für Sie am besten passen und bestätigen Sie diese über den Plus-Button am Ende der Zeile.",
-        "POLL_LOCKED_WARNING": "Die Administration gesperrt diese Umfrage. Bewertungen und Kommentare werden eingefroren, es ist nicht mehr möglich, teilzunehmen",
-        "The poll is expired, it will be deleted soon.": "Die Umfrage ist abgelaufen, es wird bald gelöscht werden.",
+        "If you want to vote in this poll, you have to give your name, choose the values that fit best for you and validate with the plus button at the end of the line.": "Wenn Sie an dieser Umfrage teilnehmen möchten, müssen Sie ihren Namen angeben, die Auswahl treffen, die Ihnen am ehesten zusagt und mit dem Plus-Button am Ende der Zeile bestätigen.",
+        "POLL_LOCKED_WARNING": "Die Abstimmung wurde vom Administrator gesperrt. Bewertungen und Kommentare werden eingefroren; es ist nicht mehr möglich, teilzunehmen",
+        "The poll is expired, it will be deleted soon.": "Der Zeitraum für die Umfrage ist überschritten, sie wird bald gelöscht werden.",
         "Deletion date:": "Löschdatum:",
-        "Your vote has been registered successfully, but be careful: regarding this poll options, you need to keep this personal link to edit your own vote:": "DE_Votre vote a bien été pris en compte, mais faites attention : ce sondage n'autorise l'édition de votre vote qu'avec le lien personnalisé suivant ; conservez le précieusement ! ",
-        "Update vote succeeded": "Update Abstimmung gelungen",
-        "Adding the vote succeeded": "Hinzufügen der Abstimmung war erfolgreich"
+        "Your vote has been registered successfully, but be careful: regarding this poll options, you need to keep this personal link to edit your own vote:": "Ihre Stimme wurde gezählt, aber beachten Sie, dass diese Umfrage die nachträgliche Änderung Ihrer Wertung nur über den nachfolgend genannten, personalisierten Link erlaubt; bewahren Sie in an einem sicheren Ort!",
+        "Update vote succeeded": "Die Wertung wurde geändert",
+        "Adding the vote succeeded": "Die Wertung wurde hinzugefügt"
     },
     "adminstuds": {
-        "As poll administrator, you can change all the lines of this poll with this button": "Als Administrator der Umfrage, können Sie alle Zeilen der Umfrage über diesen Button ändern",
+        "As poll administrator, you can change all the lines of this poll with this button": "Als Administrator der Umfrage können Sie alle Zeilen der Umfrage über diesen Button ändern",
         "remove a column or a line with": "Zeile oder Spalte entfernen mit",
         "and add a new column with": "und neue Spalte hinzufügen mit",
-        "Finally, you can change the informations of this poll like the title, the comments or your email address.": "Sie können auch die Informationen dieser Umfrage wie Titel, Kommentare oder E-Mail-Adresse ändern.",
+        "Finally, you can change the informations of this poll like the title, the comments or your email address.": "Schließlich können Sie die Informationen wie Titel, Kommentare oder Ihre E-Mail-Adresse ändern.",
         "Column's adding": "Spalte hinzufügen",
-        "You can add a new scheduling date to your poll.": "Sie können zur Umfrage ein neues Datum hinzufügen.",
-        "If you just want to add a new hour to an existant date, put the same date and choose a new hour.": "Wenn Sie nur eine neue Uhrzeiteit zu einem existierenden Datum hinzufügen wollen, wählen Sie das selbe Datum und wählen Sie eine neue Zeit aus.",
+        "You can add a new scheduling date to your poll.": "Sie können Ihrer Umfrage ein neues Datum hinzufügen.",
+        "If you just want to add a new hour to an existant date, put the same date and choose a new hour.": "Wenn Sie nur eine neue Uhrzeiteit zu einem vorhandenen Datum hinzufügen möchten, geben Sie das selbe Datum an und wählen Sie eine neue Uhrzeit aus.",
         "Confirm removal of the poll": "Bestätigen Sie die Löschung ihrer Umfrage",
-        "Delete the poll": "Löschen Sie die Umfrage",
-        "Keep the poll": "Halten Sie die Umfrage",
+        "Delete the poll": "Umfrage löschen",
+        "Keep the poll": "Umfrage beibehalten",
         "Your poll has been removed!": "Ihre Umfrage wurde gelöscht!",
         "Poll saved": "Umfrage gespeichert",
-        "Vote added": "vote hinzugefügt",
-        "Vote updated": "vote aktualisiert",
+        "Vote added": "Wertung hinzugefügt",
+        "Vote updated": "Wertung aktualisiert",
         "Poll fully deleted": "Umfrage vollständig gelöscht",
-        "Vote deleted": "vote gelöscht",
-        "All votes deleted": "Alle Stimmen werden gelöscht",
+        "Vote deleted": "Wertung gelöscht",
+        "All votes deleted": "Alle Wertungen werden gelöscht",
         "Back to the poll": "Zurück zur Umfrage",
         "Add a column": "Spalte hinzufügen",
         "Remove the column": "Spalte entfernen",
-        "Column removed": "Säule entfernt",
-        "Choice added": "Auswahl aufgenommen",
-        "Confirm removal of all votes of the poll": "Entfernung aller Stimmen der Umfrage bestätigen",
-        "Keep the votes": "Halten Sie die Stimmen",
+        "Column removed": "Spalte entfernt",
+        "Choice added": "Alternative hinzugefügt",
+        "Confirm removal of all votes of the poll": "Bestätigen Sie die Entfernung aller Wertungen aus der Umfrage",
+        "Keep the votes": "Wertungen beibehalten",
         "Remove the votes": "Entfernen Sie die Stimmen",
-        "Confirm removal of all comments of the poll": "Entfernen aller Kommentare der Umfrage bestätigen",
-        "Keep the comments": "Halten Sie die Kommentare",
-        "Remove the comments": "Entfernen Sie die Kommentare",
+        "Confirm removal of all comments of the poll": "Bestätigen Sie die Löschung aller Kommentare aus der Umfrage",
+        "Keep the comments": "Kommentare beibehalten",
+        "Remove the comments": "Kommentare entfernen",
         "Comment deleted": "Kommentar gelöscht",
         "All comments deleted": "Alle Kommentare gelöscht",
-        "Keep votes": "Halten Stimmen",
-        "Keep comments": "Halten Sie Kommentare",
-        "Keep this poll": "Halten Sie diese Umfrage"
+        "Keep votes": "Wertungen beibehalten",
+        "Keep comments": "Kommentare beibehalten",
+        "Keep this poll": "Diese Umfrage beibehalten"
     },
     "Step 1": {
-        "Poll creation (1 on 3)": "Umfrage erstellen (1 von 3)",
-        "You are in the poll creation section.": "Sie können hier Umfragen erstellen",
+        "Poll creation (1 on 3)": "Umfrage erstellen (Schritt 1 von 3)",
+        "You are in the poll creation section.": "Hier erstellen Sie die Umfrage",
         "Required fields cannot be left blank.": "Mit * markierte Felder müssen ausgefüllt sein.",
-        "Poll title": "Umfragetitel",
-        "Votes cannot be modified.": "DE_Aucun vote ne peut être modifié",
-        "All voters can modify any vote": "DE_Tous les sondés peuvent modifier tous les votes",
-        "Voters can modify their vote themselves": "Teilnehmer können ihre Antworten verändern",
-        "To receive an email for each new vote": "Bei jeder neuen Abstimmung eine E-Mail erhalten",
-        "To receive an email for each new comment": "Um eine E-Mail für jede neue Kommentar zu empfangen",
-        "Only the poll maker can see the poll's results": "DE_Seul le créateur du sondage peut voir les résultats",
+        "Poll title": "Titel der Umfrage",
+        "Votes cannot be modified.": "Wertungen können nicht verändert werden.",
+        "All voters can modify any vote": "Jeder Teilnehmer kann jede abgegebene Wertung ändern.",
+        "Voters can modify their vote themselves": "Teilnehmer können ihre Wertungen verändern",
+        "To receive an email for each new vote": "Bei jeder neuen Wertung eine E-Mail erhalten",
+        "To receive an email for each new comment": "Bei jedem neuen Kommentar eine E-Mail erhalten",
+        "Only the poll maker can see the poll's results": "Einzig der Autor der Abstimmung kann die Ergebnisse einsehen.",
         "Go to step 2": "Weiter zum 2. Schritt"
     },
     "Step 2": {
@@ -217,10 +218,10 @@
     },
     "Step 2 date": {
         "Poll dates (2 on 3)": "Umfragedaten (2 von 3)",
-        "Choose the dates of your poll": "Wählen Sie Terminmöglichkeiten für Ihre Umfrage",
-        "To schedule an event you need to propose at least two choices (two hours for one day or two days).": "Um eine Umfrage für einen Termin zu erstellen, müssen Sie mindestens zwei Auswahlmöglichkeiten angeben (zwei verschiedene Zeiten an einem Tag oder zwei Tage).",
+        "Choose the dates of your poll": "Machen Sie Treminvorschläge für Ihre Umfrage",
+        "To schedule an event you need to propose at least two choices (two hours for one day or two days).": "Um eine Terminabsprache zu konfigurieren, müssen Sie mindestens zwei alternative Zeitpunkte vorschlagen (zwei Uhrzeiten am gleichen Tag oder verschiedene Tage).",
         "You can add or remove additionnal days and hours with the buttons": "Sie können weitere Tage und Uhrzeiten über diesen Button hinzufügen oder entfernen",
-        "For each selected day, you can choose, or not, meeting hours (e.g.: \"8h\", \"8:30\", \"8h-10h\", \"evening\", etc.)": "TRANSLATE_ For each selected day, you can choose, or not, meeting hours (e.g.: \"8h\", \"8:30\", \"8h-10h\", \"evening\", etc.)",
+        "For each selected day, you can choose, or not, meeting hours (e.g.: \"8h\", \"8:30\", \"8h-10h\", \"evening\", etc.)": "Für jeden ausgewählten Tag können Sie fakultativ Uhrzeiten festlegen (z.B.: \"8h\", \"8:30\", \"8h-10h\", \"abends\", usw.)",
         "Remove an hour": "Eine Uhrzeit entfernen",
         "Add an hour": "Eine Uhrzeit hinzufügen",
         "Copy hours of the first day": "Uhrzeiten des ersten Tags kopieren",
@@ -230,13 +231,13 @@
         "Remove all hours": "Alle Uhrzeiten entfernen"
     },
     "Step 2 classic": {
-        "Poll subjects (2 on 3)": "Umfragethemen (2 von 3)",
-        "To make a generic poll you need to propose at least two choices between differents subjects.": "Um eine allgemeine Umfrage zu erstellen, benötigen Sie mindestens zwei Auswahlmöglichkeiten zwischen verschiedenen Themen.",
-        "You can add or remove additional choices with the buttons": "Sie können über den Button zusätzliche Auswahlmöglichkeiten hinzufügen oder entfernen",
-        "It's possible to propose links or images by using": "Es besteht die Möglichkeit, Links oder Bilder vorszuschlagen mit ",
-        "the Markdown syntax": "Markdown",
+        "Poll subjects (2 on 3)": "Umfragegegenstand (2 von 3)",
+        "To make a generic poll you need to propose at least two choices between differents subjects.": "Um eine gewöhnliche Umfrage zu erstellen, müssen Sie mindestens zwei Alternativen zur Auswahl stellen.",
+        "You can add or remove additional choices with the buttons": "Um Auswahlmöglichkeiten hinzuzufügen oder zu entfernen, verwenden Sie die Buttons",
+        "It's possible to propose links or images by using": "Sie haben die Möglichkeit, auch Links oder Bilder vorzuschlagen; verwenden Sie dazu",
+        "the Markdown syntax": "Markdown Syntax",
         "Add a link or an image": "Link oder Bild hinzufügen",
-        "These fields are optional. You can add a link, an image or both.": "Diese Felder sind optional. Sie können einen Link, ein Bild oder beide hinzufügen.",
+        "These fields are optional. You can add a link, an image or both.": "Diese Felder sind optional. Sie können einen Link, ein Bild oder beides hinzufügen.",
         "URL of the image": "URL des Bilds",
         "Alternative text": "Alternativer Text",
         "Remove a choice": "Eine Auswahlmöglichkeit entfernen",
@@ -244,16 +245,16 @@
     },
     "Step 3": {
         "Back to step 2": "Zurück zum 2. Schritt",
-        "Removal date and confirmation (3 on 3)": "Löschdatum und Bestätigung (3 von 3)",
+        "Removal date and confirmation (3 on 3)": "Abstimmungszeitraum und Bestätigung (3 von 3)",
         "Confirm the creation of your poll": "Bestätigen Sie die Erstellung ihrer Umfrage",
         "List of your choices": "Liste Ihrer Auswahlmöglichkeiten",
-        "Once you have confirmed the creation of your poll, you will be automatically redirected on the administration page of your poll.": "Wenn Sie die Erstellung ihrer Umfrage bestätigt haben, werden sie automatisch zur Administrationsseite ihrer Umfrage weitergeleitet.",
-        "Then, you will receive quickly two emails: one contening the link of your poll for sending it to the voters, the other contening the link to the administration page of your poll.": "Danach werden Sie zwei E-Mails erhalten: die Eine enthält den Link zur Umfrage für die Teilnehmer, die Andere enthält den Link zur Administrationsseite ihrer Umfrage.",
+        "Once you have confirmed the creation of your poll, you will be automatically redirected on the administration page of your poll.": "Wenn Sie die Erzeugung ihrer Umfrage bestätigt haben, werden sie automatisch zur Administrationsseite ihrer Umfrage weitergeleitet.",
+        "Then, you will receive quickly two emails: one contening the link of your poll for sending it to the voters, the other contening the link to the administration page of your poll.": "Sie werden zwei E-Mails erhalten: die Eine enthält den Link zur Umfrage für die Teilnehmer, die andere den zur Administrationsseite für Ihre Umfrage.",
         "Create the poll": "Umfrage erstellen",
-        "Your poll will automatically be archived": "Ihre Umfrage wird automatisch archiviert werden",
-        "after the last date of your poll.": "nach dem letzten Tag der Ihren Pool.",
-        "You can set a closer archiving date for it.": "Sie können eine engere Archivierungsdatum für sie einzustellen.",
-        "Archiving date:": "Archivierungsdatum:"
+        "Your poll will automatically be archived": "Ihre Umfrage wird automatisch für",
+        "after the last date of your poll.": "nach dem letzten Tag der Abstimmung archiviert werden.",
+        "You can set a closer archiving date for it.": "Sie können das Datum der Archivierung vorverlegen.",
+        "Archiving date:": "Tag der Archivierung:"
     },
     "Admin": {
         "Back to administration": "Zurück zur Verwaltung",
@@ -262,6 +263,7 @@
         "Migration": "Migration",
         "Purge": "Säuberung",
         "Logs": "Verlauf",
+        "Installation": "Installation",
         "Poll ID": "Umfrage-ID",
         "Format": "Format",
         "Title": "Titel",
@@ -270,70 +272,72 @@
         "Expiration date": "Verfallsdatum",
         "Votes": "Stimmen",
         "Actions": "Aktionen",
-        "See the poll": "Umfrage sehen",
+        "See the poll": "Umfrage ansehen",
         "Change the poll": "Umfrage ändern",
-        "Deleted the poll": "Gelöschte die Umfrage",
+        "Deleted the poll": "Umfrage gelöscht",
         "Summary": "Zusammenfassung",
         "Success": "Erfolg",
-        "Fail": "scheitern",
+        "Fail": "Gescheitert",
         "Nothing": "Nichts",
         "Succeeded:": "Erfolgreich:",
-        "Failed:": "fehlgeschlagen:",
-        "Skipped:": "übersprungene:",
+        "Failed:": "Fehlgeschlagen:",
+        "Skipped:": "Übersprungene:",
         "Pages:": "Seiten:",
-        "Purged:": "gespült :",
-        "Confirm removal of the poll": "Bestätigen Sie die Löschung ihrer Umfrage",
+        "Purged:": "Entfernt:",
+        "Confirm removal of the poll": "Bestätigen Sie die Löschung der Umfrage",
         "polls in the database at this time": "Umfragen derzeit in der Datenbank",
-        "Purge the polls": "TRANSLATE_ Purge the polls"
+        "Purge the polls": "Umfragen vollständig löschen"
     },
     "FindPolls": {
         "Here are your polls": "Hier sind Ihre Umfragen",
         "Send me my polls": "Senden Sie mir mein Umfragen",
-        "Polls sent": "Umfragen geschickt"
+        "Polls sent": "Umfragen abgeschickt"
     },
     "Mail": {
-        "Poll's participation": "Beteiligung an der Umfrage",
-        "Notification of poll": "Mitteilung bezüglich der Umfrage",
-        "filled a vote.\nYou can find your poll at the link": "füllte eine Stimme.<br/>Sie können Ihre Umfrage unter dem Link zu finden",
-        "updated a vote.\nYou can find your poll at the link": "eine Abstimmung regelmäßig aktualisiert.<br/>Sie können Ihre Umfrage unter dem Link zu finden",
-        "wrote a comment.\nYou can find your poll at the link": "hat einen Kommentar.<br/>Sie können Ihre Umfrage unter dem Link zu finden",
-        "Someone just change your poll available at the following link %s.": "Jemand ändern Sie einfach Ihre Umfrage finden Sie unter dem folgenden Link <a href=\"%1$s\">%1$s</a>.",
-        "Someone just delete your poll %s.": "Jemand hat gerade Ihre Umfrage löschen \"%s\".",
+        "Poll's participation: %s": "Beteiligung an der Umfrage: %s",
+        "Notification of poll: %s": "Mitteilung bezüglich der Umfrage: %s",
+        "filled a vote.\nYou can find your poll at the link": "hat abgestimmt.<br/>Sie finden Ihre Umfrage über den Link",
+        "updated a vote.\nYou can find your poll at the link": "hat eine Wertung aktualisiert.<br/>Sie finden Ihre Umfrage über den Link",
+        "wrote a comment.\nYou can find your poll at the link": "hat einen Kommentar geschrieben.<br/>Sie finden Ihre Umfrage über den Link",
+        "Someone just change your poll available at the following link %s.": "Jemand hat gerade Ihre Umfrage auf %s geändert.",
+        "Someone just delete your poll %s.": "Jemand hat gerade Ihre Umfrage auf %s gelöscht.",
         "Thanks for your trust.": "Danke für Ihr Vertrauen.",
-        "FOOTER": "",
+        "FOOTER": "„Die Strecke ist lang, aber der Weg ist frei… » <br/>Framasoft besteht nur durch Ihre Spenden (in Frankreich von der Steuer absetzbar).<br/>Herzlichen Dank für Ihre Unterstützung http://soutenir.framasoft.org",
         "[ADMINISTRATOR] New settings for your poll": "[ADMINISTRATOR] Neue Einstellungen für Ihre Umfrage ",
-        "You have changed the settings of your poll. \nYou can modify this poll with this link": "Sie haben die Einstellungen Ihrer Umfrage verändert.<br/>Sie können diese Umfrage mit diesem Link ändern",
-        "This is the message you have to send to the people you want to poll. \nNow, you have to send this message to everyone you want to poll.": "Dies ist die Botschaft, die Sie zu den Menschen, die Sie abfragen möchten senden.<br/>Nun haben Sie diese Nachricht an alle, die Sie abfragen möchten senden.",
-        "hast just created a poll called": " hat eine Umfrage erstellt - Name folgt: ",
-        "Thanks for filling the poll at the link above": "Danke, dass Sie die Umfrage unter dem obrigen Link ausgefüllt haben",
-        "This message should NOT be sent to the polled people. It is private for the poll's creator.\n\nYou can now modify it at the link above": "Diese Meldung sollte nicht auf die befragten Personen gesendet werden. Es ist privat für die Umfrage Schöpfer.<br/><br/>Sie können nun ändern sie unter dem Link oben",
+        "You have changed the settings of your poll. \nYou can modify this poll with this link": "Sie haben die Einstellungen Ihrer Umfrage verändert.<br/>Sie können diese Umfrage über diesen Link ändern",
+        "This is the message you have to send to the people you want to poll. \nNow, you have to send this message to everyone you want to poll.": "Dies ist die Nachricht an die Leute, die Sie zur Abstimmung bitten.<br/>Schicken Sie sie an alle, die Sie zur Teilnahme aufrufen möchten.",
+        "hast just created a poll called": " hat gerade eine Umfrage erstellt. Sie trägt den Titel",
+        "Thanks for filling the poll at the link above": "Danke, dass Sie die Umfrage unter dem obigen Link ausgefüllt haben",
+        "This message should NOT be sent to the polled people. It is private for the poll's creator.\n\nYou can now modify it at the link above": "Diese Meldung sollte NICHT an die befragten Personen gesendet werden. Sie richtet sich einzig an den Autor der Umfrage. Sie können sie jetzt über den oben genannten Link abändern.",
         "Author's message": "Nachricht vom Autor ",
         "For sending to the polled users": "Nachricht für die Teilnehmer"
     },
     "Error": {
         "Error!": "Fehler!",
         "Enter a title": "Titel eingeben",
-        "Something is going wrong...": "Etwas falsch läuft...",
-        "Something is wrong with the format": "Something is wrong with the format",
-        "Enter an email address": "Sie müssen eine E-Mail-Adresse eingeben",
-        "The address is not correct! You should enter a valid email address (like r.stallman@outlock.com) in order to receive the link to your poll.": "Die Adresse ist nicht korrekt! Sie sollten eine funktionierende E-Mail-Adresse angeben, um den Link zu ihrer Umfrage zu erhalten",
+        "Something is going wrong...": "Etwas geht schief...",
+        "Something is wrong with the format": "Mit dem Format stimmt etwas nicht",
+        "Enter an email address": "Geben Sie eine E-Mail Adresse ein",
+        "The address is not correct! You should enter a valid email address (like r.stallman@outlock.com) in order to receive the link to your poll.": "Die Adresse ist nicht korrekt! Sie sollten eine gültige E-Mail-Adresse angeben, damit Ihnen der Link zur Umfrage zugeschickt werden kann.",
         "No polls found": "Keine Umfragen gefunden",
-        "There is a problem with your choices": "Es gibt ein Problem mit der Auswahl",
+        "There is a problem with your choices": "Es gibt ein Problem mit Ihren Alternativen",
         "You haven't filled the first section of the poll creation.": "Sie haben den ersten Teil der Umfrageerstellung nicht ausgefüllt.",
-        "Javascript is disabled on your browser. Its activation is required to create a poll.": "Javascript ist in Ihrem Browser deaktiviert. Seine Aktivierung ist erforderlich, um eine Umfrage zu erstellen.",
-        "Cookies are disabled on your browser. Theirs activation is required to create a poll.": "Cookies werden auf Ihrem Browser deaktiviert. Deren Aktivierung ist erforderlich, um eine Umfrage zu erstellen.",
+        "Javascript is disabled on your browser. Its activation is required to create a poll.": "Javascript ist in Ihrem Browser deaktiviert. Um eine Umfrage zu erstellen, müssen Sie es aktivieren.",
+        "Cookies are disabled on your browser. Theirs activation is required to create a poll.": "Cookies werden von Ihrem Browser abgelehnt. Um eine Umfrage zu erstellen, müssen Sie sie akzeptieren.",
         "This poll doesn't exist !": "Diese Umfrage existiert nicht!",
         "Enter a name": "Geben Sie einen Namen ein",
         "The name is invalid.": "Der Name ist ungültig.",
-        "The name you've chosen already exist in this poll!": "Der von Ihnen eingegebenen Name existiert bereits in dieser Umfrage",
+        "The name you've chosen already exist in this poll!": "Der von Ihnen eingegebenen Name existiert schon in dieser Umfrage",
         "Enter a name and a comment!": "Geben Sie einen Namen und ein Kommentar ein!",
         "Failed to insert the comment!": "Einfügen des Kommentars gescheitert!",
-        "Framadate is not properly installed, please check the \"INSTALL\" to setup the database before continuing.": "Framadate ist nicht richtig installiert, überprüfen Sie bitte die Schaltfläche \"INSTALL\", um das Setup der Datenbank, bevor Sie fortfahren.",
-        "Failed to save poll": "Fehlgeschlagen Umfrage sparen",
-        "Update vote failed": "Update vote failed",
-        "Adding vote failed": "Adding vote failed",
-        "Comment failed": "Kommentar gescheitert",
-        "You can't create a poll with hidden results with the following edition option:": "Sie können nicht eine Umfrage erstellen mit versteckten Ergebnisse mit der folgenden Ausgabe-Option:",
-        "Failed to delete column": "Fehler beim Spalte löschen"
+        "Framadate is not properly installed, please check the \"INSTALL\" to setup the database before continuing.": "Framadate ist nicht richtig installiert. Bevor Sie fortfahren, beachten Sie bitte die Angaben zum Aufsetzen der Datenbank in \"INSTALL\".",
+        "Failed to save poll": "Speichern der Umfrage fehlgeschlagen",
+        "Update vote failed": "Aktualisierung der Wertung fehlgeschlagen",
+        "Adding vote failed": "Stimmabgabe fehlgeschlagen",
+        "Comment failed": "Abgabe des Kommentars gescheitert",
+        "You can't create a poll with hidden results with the following edition option:": "Sie können mit der folgenden Editier-Option keine Umfrage mit versteckten Ergebnissen erzeugen:",
+        "Failed to delete column": "Löschen der Spalte fehlgeschlagen",
+        "MISSING_VALUES": "Fehlende Werte",
+        "CANT_CONNECT_TO_DATABASE": "Kann nicht mit der Datenbank verbinden"
     }
 }
diff --git a/locale/en.json b/locale/en.json
index 32fa288722fa25beaa3d706b86eba2f436c7f83f..c9ec50f039370fbaa1da56e36b1657eee88e0386 100644
--- a/locale/en.json
+++ b/locale/en.json
@@ -36,7 +36,8 @@
     "Choice": "Choice",
     "Link": "Link",
     "Search": "Search",
-    "Creation date:": "Creation date:"
+    "Creation date:": "Creation date:",
+    "ASTERISK": "*"
   },
   "Date" : {
     "dd/mm/yyyy": "jj/mm/aaaa",
@@ -49,8 +50,8 @@
     "DATETIME": "%m/%d/%Y %H:%M"
   },
   "Language selector": {
-    "Select the language": "Select the language",
-    "Change the language": "Change the language"
+    "Select the language": "Select language",
+    "Change the language": "Change language"
   },
   "Maintenance": {
     "The application": "The application",
@@ -60,14 +61,14 @@
   "Homepage": {
     "Schedule an event": "Schedule an event",
     "Make a classic poll": "Make a classic poll",
-    "Where are my polls": "Where are my polls"
+    "Where are my polls": "Where are my polls?"
   },
   "1st section": {
-    "What is that?": "What is that?",
-    "Framadate is an online service for planning an appointment or make a decision quickly and easily. No registration is required.": "Framadate is an online service for planning an appointment or make a decision quickly and easily. No registration is required.",
+    "What is that?": "What is Framadate?",
+    "Framadate is an online service for planning an appointment or make a decision quickly and easily. No registration is required.": "Framadate is an online service for planning an appointment or making a decision quickly and easily. No registration is required.",
     "Here is how it works:": "Here is how it works:",
-    "Make a poll": "Make a poll",
-    "Define dates or subjects to choose": "Define dates or subjects to choose",
+    "Make a poll": "Create a poll",
+    "Define dates or subjects to choose": "Define dates or subjects to choose from",
     "Send the poll link to your friends or colleagues": "Send the poll link to your friends or colleagues",
     "Discuss and make a decision": "Discuss and make a decision",
     "Do you want to": "Do you want to",
@@ -76,16 +77,16 @@
   "2nd section": {
     "The software": "The software",
     "Framadate was initially based on ": "Framadate was initially based on ",
-    "a software developed by the University of Strasbourg. Today, it is devevoped by the association Framasoft.": "a software developed by the University of Strasbourg. Today, it is devevoped by the association Framasoft.",
-    "This software needs javascript and cookies enabled. It is compatible with the following web browsers:": "This software needs javascript and cookies enabled. It is compatible with the following web browsers:",
-    "It is governed by the": "It is governed by the",
+    "a software developed by the University of Strasbourg. Today, it is devevoped by the association Framasoft.": "software developed by the University of Strasbourg. These days, it is developed by the Framasoft association.",
+    "This software needs javascript and cookies enabled. It is compatible with the following web browsers:": "This software needs JavaScript and cookies enabled. It is compatible with the following web browsers:",
+    "It is governed by the": "Framadate is licensed under the",
     "CeCILL-B license": "CeCILL-B license"
   },
   "3rd section": {
     "Cultivate your garden": "Cultivate your garden",
     "To participate in the software development, suggest improvements or simply download it, please visit ": "To participate in the software development, suggest improvements or simply download it, please visit ",
     "the development site": "the development site",
-    "If you want to install the software for your own use and thus increase your independence, we help you on:": "If you want to install the software for your own use and thus increase your independence, we help you on:"
+    "If you want to install the software for your own use and thus increase your independence, we help you on:": "If you want to install the software for your own use and thus increase your independence, we can help you at:"
   },
   "PollInfo": {
     "Remove the poll": "Remove the poll",
@@ -94,81 +95,83 @@
     "Print": "Print",
     "Export to CSV": "Export to CSV",
     "Title": "Title of the poll",
-    "Edit the title": "Edit the title",
+    "Edit the title": "Edit title",
     "Save the new title": "Save the new title",
     "Cancel the title edit": "Cancel the title edit",
     "Initiator of the poll": "Initiator of the poll",
-    "Edit the name": "Edit the name",
+    "Edit the name": "Edit name",
     "Save the new name": "Save the new name",
     "Cancel the name edit": "Cancel the name edit",
     "Email": "Email",
-    "Edit the email adress": "Edit the email adress",
+    "Edit the email adress": "Edit the email address",
     "Save the email address": "Save the email address",
     "Cancel the email address edit": "Cancel the email address edit",
     "Edit the description": "Edit the description",
     "Save the description": "Save the description",
     "Cancel the description edit": "Cancel the description edit",
-    "Public link of the poll": "Public link of the poll",
-    "Admin link of the poll": "Admin link of the poll",
-    "Expiration date": "Expiration's date",
-    "Edit the expiration date": "Edit the expiration's date",
-    "Save the new expiration date": "Save the new expiration's date",
-    "Cancel the expiration date edit": "Cancel the expiration's date edit",
+    "Public link of the poll": "Public link to the poll",
+    "Admin link of the poll": "Admin link for the poll",
+    "Expiration date": "Expiry date",
+    "Edit the expiration date": "Edit the expiry date",
+    "Save the new expiration date": "Save the new expiration date",
+    "Cancel the expiration date edit": "Cancel the expiration date edit",
     "Poll rules": "Poll rules",
     "Edit the poll rules": "Edit the poll rules",
     "Votes and comments are locked": "Votes and comments are locked",
     "Votes and comments are open": "Votes and comments are open",
-    "Votes are editable": "Votes are editable",
-    "Votes are editable solely by their owner.": "Votes are editable solely by their owner",
+    "Votes are editable": "Votes are modifiable",
+    "Votes are editable solely by their owner.": "Votes can only be edited by their owner",
     "Save the new rules": "Save the new rules",
     "Cancel the rules edit": "Cancel the rules edit",
     "Results are hidden.": "Results are hidden.",
     "Results are visible.": "Results are visible."
   },
   "Poll results": {
-    "Votes of the poll": "Votes of the poll",
-    "Edit the line:": "Edit the line:",
-    "Remove the line:": "Remove the line:",
+    "Votes of the poll": "Votes",
+    "Edit the line:": "Edit line:",
+    "Remove the line:": "Remove line:",
     "Vote no for": "Vote \"no\" for",
     "Vote yes for": "Vote \"yes\" for",
     "Vote ifneedbe for": "Vote \"ifneedbe\" for",
-    "Save the choices": "Save the choices",
-    "Addition": "Addition",
-    "Best choice": "Best choices",
+    "Save the choices": "Save choices",
+    "Addition": "Total",
+    "Best choice": "Best choice",
     "Best choices": "Best choices",
-    "The best choice at this time is:": "The best choice at this time is:",
-    "The bests choices at this time are:": "The bests choices at this time are:",
+    "The best choice at this time is:": "The current best choice is:",
+    "The bests choices at this time are:": "The current best choices are:",
     "Scroll to the left": "Scroll to the left",
-    "Scroll to the right": "Scroll to the right"
+    "Scroll to the right": "Scroll to the right",
+    "polled user": "polled user",
+    "polled users": "polled users",
     "Display the chart of the results": "Display the chart of the results",
     "Chart": "Chart"
   },
   "Comments": {
-    "Comments of polled people": "Comments of polled people",
-    "Remove the comment": "Remove the comment",
+    "Comments of polled people": "Comments",
+    "Remove the comment": "Remove comment",
     "Add a comment to the poll": "Add a comment to the poll",
-    "Your comment": "Your comment",
-    "Send the comment": "Send the comment",
+    "Your comment": "Comment",
+    "Send the comment": "Submit comment",
     "anonyme": "anonyme",
-    "Comment added": "Comment added"
+    "Comment added": "Comment saved"
   },
   "studs": {
-    "If you want to vote in this poll, you have to give your name, choose the values that fit best for you and validate with the plus button at the end of the line.": "If you want to vote in this poll, you have to give your name, choose the values that fit best for you and validate with the plus button at the end of the line.",
-    "POLL_LOCKED_WARNING": "The administration locked this poll. Votes and comments are frozen, it is no longer possible to participate",
-    "The poll is expired, it will be deleted soon.":  "The poll is expired, it will be deleted soon.",
+    "If you want to vote in this poll, you have to give your name, choose the values that fit best for you and validate with the plus button at the end of the line.": "If you want to vote in this poll, you have to give your name, make your choice, and submit it with the plus button at the end of the line.",
+    "POLL_LOCKED_WARNING": "The administrator locked this poll. Votes and comments are frozen, it is no longer possible to participate",
+    "The poll is expired, it will be deleted soon.":  "The poll has expired, it will soon be deleted.",
     "Deletion date:": "Deletion date:",
-    "Your vote has been registered successfully, but be careful: regarding this poll options, you need to keep this personal link to edit your own vote:": "Your vote has been registered successfully, but be careful: regarding this poll options, you need to keep this personal link to edit your own vote.",
-    "Update vote succeeded": "Update vote succeeded",
-    "Adding the vote succeeded": "Adding the vote succeeded"
+    "Your vote has been registered successfully, but be careful: regarding this poll options, you need to keep this personal link to edit your own vote:": "Your vote has been saved, but please note: you need to keep this personalised link to be able to edit your vote.",
+    "Update vote succeeded": "Vote updated",
+    "Adding the vote succeeded": "Vote added"
   },
   "adminstuds": {
     "As poll administrator, you can change all the lines of this poll with this button": "As poll administrator, you can change all the lines of this poll with this button",
     "remove a column or a line with": "remove a column or a line with",
     "and add a new column with": "and add a new column with",
-    "Finally, you can change the informations of this poll like the title, the comments or your email address.": "Finally, you can change the informations of this poll like the title, the comments or your email address.",
-    "Column's adding": "Column's adding",
+    "Finally, you can change the informations of this poll like the title, the comments or your email address.": "Finally, you can change the properties of this poll such as the title, the comments or your email address.",
+    "Column's adding": "Adding a column",
     "You can add a new scheduling date to your poll.": "You can add a new scheduling date to your poll.",
-    "If you just want to add a new hour to an existant date, put the same date and choose a new hour.": "If you just want to add a new hour to an existant date, put the same date and choose a new hour.",
+    "If you just want to add a new hour to an existant date, put the same date and choose a new hour.": "If you just want to add a new time slot to an existing date, add that date here and choose a new time slot.",
     "Confirm removal of the poll": "Confirm removal of your poll",
     "Delete the poll": "Delete the poll",
     "Keep the poll": "Keep the poll",
@@ -181,13 +184,13 @@
     "All votes deleted": "All votes deleted",
     "Back to the poll": "Back to the poll",
     "Add a column": "Add a column",
-    "Remove the column": "Remove the column",
+    "Remove the column": "Remove column",
     "Column removed": "Column deleted",
     "Choice added": "Choice added",
-    "Confirm removal of all votes of the poll": "Confirm removal of all votes of the poll",
+    "Confirm removal of all votes of the poll": "Confirm removal of all votes",
     "Keep the votes": "Keep the votes",
     "Remove the votes": "Remove the votes",
-    "Confirm removal of all comments of the poll": "Confirm removal of all comments of the poll",
+    "Confirm removal of all comments of the poll": "Confirm removal of all comments",
     "Comment deleted": "Comment deleted",
     "All comments deleted": "All comments deleted",
     "Keep the comments": "Keep the comments",
@@ -197,42 +200,42 @@
     "Keep this poll": "Keep this poll"
   },
   "Step 1": {
-    "Poll creation (1 on 3)": "Poll creation (1 on 3)",
+    "Poll creation (1 on 3)": "Poll creation (1 of 3)",
     "You are in the poll creation section.": "You are in the poll creation section.",
     "Required fields cannot be left blank.": "Required fields cannot be left blank.",
     "Poll title": "Poll title",
     "Votes cannot be modified.": "Votes cannot be modified",
     "All voters can modify any vote": "All voters can modify any vote",
     "Voters can modify their vote themselves": "Voters can modify their vote themselves",
-    "To receive an email for each new vote": "To receive an email for each new vote",
-    "To receive an email for each new comment": "To receive an email for each new comment",
-    "Only the poll maker can see the poll's results": "Only the poll maker can see the poll's results",
+    "To receive an email for each new vote": "Receive an email for each new vote",
+    "To receive an email for each new comment": "Receive an email for each new comment",
+    "Only the poll maker can see the poll's results": "Only the poll maker can see the poll results",
     "Go to step 2": "Go to step 2"
   },
   "Step 2": {
-    "Back to step 1": "Revenir à l’étape 1",
-    "Go to step 3": "Aller à l’étape 3"
+    "Back to step 1": "Return to step 1",
+    "Go to step 3": "Go to step 3"
   },
   "Step 2 date": {
-    "Poll dates (2 on 3)": "Poll dates (2 on 3)",
-    "Choose the dates of your poll": "Choose the dates of your poll",
-    "To schedule an event you need to propose at least two choices (two hours for one day or two days).": "To schedule an event you need to propose at least two choices (two hours for one day or two days).",
-    "You can add or remove additionnal days and hours with the buttons": "You can add or remove additionnal days and hours with the buttons",
-    "For each selected day, you can choose, or not, meeting hours (e.g.: \"8h\", \"8:30\", \"8h-10h\", \"evening\", etc.)": "For each selected day, you can choose, or not, meeting hours (e.g.: \"8h\", \"8:30\", \"8h-10h\", \"evening\", etc.)",
-    "Remove an hour": "Remove an hour",
-    "Add an hour": "Add an hour",
-    "Copy hours of the first day": "Copy hours of the first day",
+    "Poll dates (2 on 3)": "Poll dates (2 of 3)",
+    "Choose the dates of your poll": "Choose dates for your poll",
+    "To schedule an event you need to propose at least two choices (two hours for one day or two days).": "To schedule an event you need to provide at least two choices (e.g., two time slots on one day or two days).",
+    "You can add or remove additionnal days and hours with the buttons": "You can add or remove additional days and times with the buttons",
+    "For each selected day, you can choose, or not, meeting hours (e.g.: \"8h\", \"8:30\", \"8h-10h\", \"evening\", etc.)": "For each selected day, you are free to suggest meeting times (e.g., \"8h\", \"8:30\", \"8h-10h\", \"evening\", etc.)",
+    "Remove an hour": "Remove a time slot",
+    "Add an hour": "Add a time slot",
+    "Copy hours of the first day": "Copy times from the first day",
     "Remove a day": "Remove a day",
     "Add a day": "Add a day",
     "Remove all days": "Remove all days",
-    "Remove all hours": "Remove all hours"
+    "Remove all hours": "Remove all times"
   },
   "Step 2 classic": {
-    "Poll subjects (2 on 3)": "Poll subjects (2 on 3)",
-    "To make a generic poll you need to propose at least two choices between differents subjects.": "To make a generic poll you need to propose at least two choices between differents subjects.",
-    "You can add or remove additional choices with the buttons": "You can add or remove additional choices with the buttons",
-    "It's possible to propose links or images by using": "It's possible to propose links or images by using",
-    "the Markdown syntax": "the Markdown syntax",
+    "Poll subjects (2 on 3)": "Poll options (2 of 3)",
+    "To make a generic poll you need to propose at least two choices between differents subjects.": "To create a poll you should provide at least two different choices.",
+    "You can add or remove additional choices with the buttons": "You can add or remove choices with the buttons",
+    "It's possible to propose links or images by using": "Links or images can be included using",
+    "the Markdown syntax": "Markdown syntax",
     "Add a link or an image": "Add a link or an image",
     "These fields are optional. You can add a link, an image or both.": "These fields are optional. You can add a link, an image or both.",
     "URL of the image": "URL of the image",
@@ -242,16 +245,16 @@
   },
   "Step 3": {
     "Back to step 2": "Back to step 2",
-    "Removal date and confirmation (3 on 3)": "Removal date and confirmation (3 on 3)",
+    "Removal date and confirmation (3 on 3)": "Removal date and confirmation (1 of 3)",
     "Confirm the creation of your poll": "Confirm the creation of your poll",
-    "List of your choices": "List of your choices",
-    "Once you have confirmed the creation of your poll, you will be automatically redirected on the administration page of your poll.": "Once you have confirmed the creation of your poll, you will be automatically redirected on the administration page of your poll.",
-    "Then, you will receive quickly two emails: one contening the link of your poll for sending it to the voters, the other contening the link to the administration page of your poll.": "Then, you will receive quickly two emails: one contening the link of your poll for sending it to the voters, the other contening the link to the administration page of your poll.",
+    "List of your choices": "List of options",
+    "Once you have confirmed the creation of your poll, you will be automatically redirected on the administration page of your poll.": "Once you have confirmed the creation of your poll, you will automatically be redirected to the poll's administration page.",
+    "Then, you will receive quickly two emails: one contening the link of your poll for sending it to the voters, the other contening the link to the administration page of your poll.": "Then you will receive two emails: one containing the link of your poll for sending to the participants, the other containing the link to the poll administration page.",
     "Create the poll": "Create the poll",
     "Your poll will automatically be archived": "Your poll will automatically be archived",
     "after the last date of your poll.": "after the last date of your poll.",
-    "You can set a closer archiving date for it.": "You can set a closer archiving date for it.",
-    "Archiving date:": "Date d'archivage :"
+    "You can set a closer archiving date for it.": "You can set a specific expiry date for the poll.",
+    "Archiving date:": "Expiry date:"
   },
   "Admin": {
     "Back to administration": "Back to administration",
@@ -260,17 +263,18 @@
     "Migration": "Migration",
     "Purge": "Purge",
     "Logs": "Logs",
+    "Installation": "Installation",
     "Poll ID": "Poll ID",
     "Format": "Format",
     "Title": "Title",
     "Author": "Author",
-    "Email": "Courriel",
-    "Expiration date": "Date d'expiration",
+    "Email": "Email",
+    "Expiration date": "Expiry date",
     "Votes": "Votes",
     "Actions": "Actions",
-    "See the poll": "See the poll",
-    "Change the poll": "Change the poll",
-    "Deleted the poll": "Deleted the poll",
+    "See the poll": "Go to poll",
+    "Change the poll": "Change poll",
+    "Deleted the poll": "Delete the poll",
     "Summary": "Summary",
     "Success": "Success",
     "Fail": "Fail",
@@ -290,48 +294,50 @@
     "Polls sent": "Polls sent"
   },
   "Mail" : {
-    "Poll's participation": "Poll's participation",
-    "Notification of poll": "Notification of poll",
-    "filled a vote.\nYou can find your poll at the link": "filled a vote.<br/>You can find your poll at the link",
-    "updated a vote.\nYou can find your poll at the link": "updated a vote.<br/>You can find your poll at the link",
-    "wrote a comment.\nYou can find your poll at the link": "wrote a comment.<br/>You can find your poll at the link",
-    "Someone just change your poll available at the following link %s.": "Someone just change your poll available at the following link <a href=\"%1$s\">%1$s</a>.",
-    "Someone just delete your poll %s.": "Someone just delete your poll \"%s\".",
-    "Thanks for your trust.": "Thanks for your trust.",
+    "Poll's participation: %s": "Poll participation: %s",
+    "Notification of poll: %s": "Notification of poll: %s",
+    "filled a vote.\nYou can find your poll at the link": "added a vote.<br/>You can visit your poll at the link",
+    "updated a vote.\nYou can find your poll at the link": "updated a vote.<br/>You can visit your poll at the link",
+    "wrote a comment.\nYou can find your poll at the link": "wrote a comment.<br/>You can visit your poll at the link",
+    "Someone just change your poll available at the following link %s.": "Someone just changed your poll at the following link <a href=\"%1$s\">%1$s</a>.",
+    "Someone just delete your poll %s.": "Someone just deleted your poll \"%s\".",
+    "Thanks for your trust.": "Thank you for your trust.",
     "FOOTER": "",
     "[ADMINISTRATOR] New settings for your poll": "[ADMINISTRATOR] New settings for your poll",
     "You have changed the settings of your poll. \nYou can modify this poll with this link": "You have changed the settings of your poll.<br/>You can modify this poll with this link",
-    "This is the message you have to send to the people you want to poll. \nNow, you have to send this message to everyone you want to poll.":"This is the message you have to send to the people you want to poll.<br/>Now, you have to send this message to everyone you want to poll.",
+    "This is the message you have to send to the people you want to poll. \nNow, you have to send this message to everyone you want to poll.":"This is the message to forward to the poll participants.",
     "hast just created a poll called": "has just created a poll called",
-    "Thanks for filling the poll at the link above": "Thanks for filling the poll at the link above",
-    "This message should NOT be sent to the polled people. It is private for the poll's creator.\n\nYou can now modify it at the link above": "This message should NOT be sent to the polled people. It is private for the poll's creator.<br/><br/>You can now modify it at the link above",
+    "Thanks for filling the poll at the link above": "Please fill in the poll at the link above",
+    "This message should NOT be sent to the polled people. It is private for the poll's creator.\n\nYou can now modify it at the link above": "This message should NOT be sent to the poll participants. You should keep it private. <br/><br/>You can modify your poll at the link above",
     "Author's message": "Author's message",
-    "For sending to the polled users": "For sending to the polled users"
+    "For sending to the polled users": "Participant link"
   },
   "Error": {
     "Error!": "Error!",
     "Enter a title": "Enter a title",
-    "Something is going wrong...": "Something is going wrong...",
+    "Something is going wrong...": "Something has gone wrong...",
     "Something is wrong with the format": "Something is wrong with the format",
     "Enter an email address": "Enter an email address",
     "The address is not correct! You should enter a valid email address (like r.stallman@outlock.com) in order to receive the link to your poll.": "The address is not correct! You should enter a valid email address (like r.stallman@outlock.com) in order to receive the link to your poll.",
     "No polls found": "No polls found",
     "There is a problem with your choices": "There is a problem with your choices",
-    "You haven't filled the first section of the poll creation.": "You haven't filled the first section of the poll creation.",
-    "Javascript is disabled on your browser. Its activation is required to create a poll.": "Javascript is disabled on your browser. Its activation is required to create a poll.",
-    "Cookies are disabled on your browser. Theirs activation is required to create a poll.": "Cookies are disabled on your browser. Theirs activation is required to create a poll.",
-    "This poll doesn't exist !": "This poll doesn't exist !",
+    "You haven't filled the first section of the poll creation.": "You haven't filled in the first section of the poll.",
+    "Javascript is disabled on your browser. Its activation is required to create a poll.": "JavaScript is disabled on your browser. It is required to create a poll.",
+    "Cookies are disabled on your browser. Theirs activation is required to create a poll.": "Cookies are disabled on your browser. They are required to be able to create a poll.",
+    "This poll doesn't exist !": "This poll doesn't exist!",
     "Enter a name": "Enter a name",
     "The name is invalid.": "The name is invalid.",
-    "The name you've chosen already exist in this poll!": "The name you've chosen already exist in this poll!",
+    "The name you've chosen already exist in this poll!": "The name you've chosen already exists in this poll!",
     "Enter a name and a comment!": "Enter a name and a comment!",
     "Failed to insert the comment!": "Failed to insert the comment!",
-    "Framadate is not properly installed, please check the \"INSTALL\" to setup the database before continuing.": "Framadate is not properly installed, please check the 'INSTALL' to setup the database before continuing.",
+    "Framadate is not properly installed, please check the \"INSTALL\" to setup the database before continuing.": "Framadate is not properly installed, please see the 'INSTALL' file for instructions on setting up the database before continuing.",
     "Failed to save poll": "Failed to save poll",
     "Update vote failed": "Update vote failed",
     "Adding vote failed": "Adding vote failed",
     "Comment failed": "Comment failed",
-    "You can't create a poll with hidden results with the following edition option:": "You can't create a poll with hidden results with the following edition option: ",
-    "Failed to delete column": "Failed to delete column"
+    "You can't create a poll with hidden results with the following edition option:": "You can't create a poll with hidden results with the following option: ",
+    "Failed to delete column": "Failed to delete column",
+    "MISSING_VALUES": "Missing values",
+    "CANT_CONNECT_TO_DATABASE": "Unable to connect to database"
   }
 }
diff --git a/locale/es.json b/locale/es.json
index f3a70874831dd9d211c303e362d3098141a1ef62..87351f100f163a452d76bd04c3d5fb333ebc80ab 100644
--- a/locale/es.json
+++ b/locale/es.json
@@ -36,7 +36,8 @@
         "Choice": "Opciòn",
         "Link": "ES_Lien",
         "Search": "Búsqueda",
-        "Creation date:": "ES_Date de création :"
+        "Creation date:": "ES_Date de création :",
+        "ASTERISK": "*"
     },
     "Date": {
         "dd/mm/yyyy": "ES_jj/mm/aaaa",
@@ -55,7 +56,7 @@
     "Homepage": {
         "Schedule an event": "Encuesta para planificar un evento",
         "Make a classic poll": "ES_Créer un sondage classique",
-        "Where are my polls": "ES_Où sont mes sondages"
+        "Where are my polls": "ES_Où sont mes sondages ?"
     },
     "Maintenance": {
         "The application": "ES_L'application",
@@ -139,7 +140,7 @@
         "The best choice at this time is:": "ES_Le meilleur choix pour l'instant est :",
         "The bests choices at this time are:": "ES_Les meilleurs choix pour l'instant sont :",
         "Scroll to the left": "ES_Faire défiler à gauche",
-        "Scroll to the right": "ES_Faire défiler à droite"
+        "Scroll to the right": "ES_Faire défiler à droite",
         "polled user": "ES_votant",
         "polled users": "ES_votants",
         "Display the chart of the results": "ES_Afficher le graphique des résultats",
@@ -262,6 +263,7 @@
         "Migration": "ES_Migration",
         "Purge": "ES_Purge",
         "Logs": "Histórico",
+        "Installation": "Instalación",
         "Poll ID": "ES_ID sondage",
         "Format": "ES_Format",
         "Title": "ES_Titre",
@@ -292,8 +294,8 @@
         "Polls sent": "ES_Sondages envoyés"
     },
     "Mail": {
-        "Poll's participation": "Participación Encuesta",
-        "Notification of poll": "Notificación de la encuesta",
+        "Poll's participation: %s": "Participación Encuesta: %s",
+        "Notification of poll: %s": "Notificación de la encuesta: %s",
         "filled a vote.\nYou can find your poll at the link": "ES_vient de voter.<br/>Vous pouvez retrouver votre sondage avec le lien suivant",
         "updated a vote.\nYou can find your poll at the link": "ES_vient de mettre à jour un vote.<br/>Vous pouvez retrouver votre sondage avec le lien suivant",
         "wrote a comment.\nYou can find your poll at the link": "ES_vient de rédiger un commentaire.<br/>Vous pouvez retrouver votre sondage avec le lien suivant",
@@ -334,6 +336,8 @@
         "Adding vote failed": "ES_Ajout d'un vote échoué",
         "Comment failed": "ES_Commentaire échoué",
         "You can't create a poll with hidden results with the following edition option:": "ES_Vous ne pouvez pas créer de sondage avec résulats cachés avec les options d'éditions suivantes : ",
-        "Failed to delete column": "Error al eliminar la columna"
+        "Failed to delete column": "Error al eliminar la columna",
+        "MISSING_VALUES": "Los valores perdidos",
+        "CANT_CONNECT_TO_DATABASE": "No se puede conectar a la base de datos"
     }
 }
diff --git a/locale/fr.json b/locale/fr.json
index 8c09a500b7786ba437850bf380df5c53d7bbd5dc..ee1a9e894d3c18a61a9f5643de4621c568dc8cc6 100644
--- a/locale/fr.json
+++ b/locale/fr.json
@@ -36,7 +36,8 @@
     "Choice": "Choix",
     "Link": "Lien",
     "Search": "Chercher",
-    "Creation date:": "Date de création :"
+    "Creation date:": "Date de création :",
+    "ASTERISK": "*"
   },
   "Date": {
     "dd/mm/yyyy": "jj/mm/aaaa",
@@ -55,7 +56,7 @@
   "Homepage": {
     "Schedule an event": "Créer un sondage spécial dates",
     "Make a classic poll": "Créer un sondage classique",
-    "Where are my polls": "Où sont mes sondages"
+    "Where are my polls": "Où sont mes sondages ?"
   },
   "Maintenance": {
     "The application": "L'application",
@@ -262,6 +263,7 @@
     "Migration": "Migration",
     "Purge": "Purge",
     "Logs": "Historique",
+    "Installation": "Installation",
     "Poll ID": "ID sondage",
     "Format": "Format",
     "Title": "Titre",
@@ -292,8 +294,8 @@
     "Polls sent": "Sondages envoyés"
   },
   "Mail": {
-    "Poll's participation": "Participation au sondage",
-    "Notification of poll": "Notification d'un sondage",
+    "Poll's participation: %s": "Participation au sondage : %s",
+    "Notification of poll: %s": "Notification d'un sondage : %s",
     "filled a vote.\nYou can find your poll at the link": "vient de voter.<br/>Vous pouvez retrouver votre sondage avec le lien suivant",
     "updated a vote.\nYou can find your poll at the link": "vient de mettre à jour un vote.<br/>Vous pouvez retrouver votre sondage avec le lien suivant",
     "wrote a comment.\nYou can find your poll at the link": "vient de rédiger un commentaire.<br/>Vous pouvez retrouver votre sondage avec le lien suivant",
@@ -310,6 +312,21 @@
     "Author's message": "Réservé à l'auteur",
     "For sending to the polled users": "Pour diffusion aux sondés"
   },
+  "Installation": {
+    "AppMail": "Adresse mail de l'application",
+    "AppName": "Nom de l'application",
+    "CleanUrl": "URL propres",
+    "Database": "Base de données",
+    "DbConnectionString": "Chaîne de connexion",
+    "DbPassword": "Mot de passe",
+    "DbPrefix": "Préfixe",
+    "DbUser": "Utilisateur",
+    "DefaultLanguage": "Langue par défaut",
+    "General": "Général",
+    "Install": "Installer",
+    "MigrationTable": "Table de migration",
+    "ResponseMail": "Mail de réponse"
+  },
   "Error": {
     "Error!": "Erreur !",
     "Enter a title": "Il faut saisir un titre !",
@@ -334,6 +351,8 @@
     "Adding vote failed": "Ajout d'un vote échoué",
     "Comment failed": "Commentaire échoué",
     "You can't create a poll with hidden results with the following edition option:": "Vous ne pouvez pas créer de sondage avec résulats cachés avec les options d'éditions suivantes : ",
-    "Failed to delete column": "Échec de la suppression de colonne"
+    "Failed to delete column": "Échec de la suppression de colonne",
+    "MISSING_VALUES": "Il manque des valeurs",
+    "CANT_CONNECT_TO_DATABASE": "Impossible de se connecter à la base de données"
   }
 }
diff --git a/locale/it.json b/locale/it.json
index 1562e25aac26954cc82d950f7448c8934d63cd5c..413958106ec8be1d3d0028f7274c6258f2ffb3e1 100644
--- a/locale/it.json
+++ b/locale/it.json
@@ -36,7 +36,8 @@
     "Choice": "Scelta",
     "Link": "Link",
     "Search": "IT_Chercher",
-    "Creation date:": "IT_Date de création :"
+    "Creation date:": "IT_Date de création :",
+    "ASTERISK": "*"
   },
   "Date": {
     "dd/mm/yyyy": "gg/mm/aaaa",
@@ -55,7 +56,7 @@
   "Homepage": {
     "Schedule an event": "Creare un evento",
     "Make a classic poll": "Creare un sondaggio",
-    "Where are my polls": "Dove sono i miei sondaggi"
+    "Where are my polls": "Dove sono i miei sondaggi?"
   },
   "Maintenance": {
     "The application": "L'applicazione",
@@ -262,6 +263,7 @@
     "Migration": "IT_Migration",
     "Purge": "IT_Purge",
     "Logs": "Log",
+    "Installation": "Installazione",
     "Poll ID": "ID sondaggio",
     "Format": "Formato",
     "Title": "Titolo",
@@ -292,8 +294,8 @@
     "Polls sent": "IT_Sondages envoyés"
   },
   "Mail": {
-    "Poll's participation": "Partecipazione al sondaggio",
-    "Notification of poll": "Notifica di sondaggio",
+    "Poll's participation: %s": "Partecipazione al sondaggio: %s",
+    "Notification of poll: %s": "Notifica di sondaggio: %s",
     "filled a vote.\nYou can find your poll at the link": "IT_vient de voter.\nVous pouvez retrouver votre sondage avec le lien suivant",
     "updated a vote.\nYou can find your poll at the link": "IT_vient de mettre à jour un vote.\nVous pouvez retrouver votre sondage avec le lien suivant",
     "wrote a comment.\nYou can find your poll at the link": "IT_vient de rédiger un commentaire.\nVous pouvez retrouver votre sondage avec le lien suivant",
@@ -334,6 +336,8 @@
     "Adding vote failed": "IT_Ajout d'un vote échoué",
     "Comment failed": "IT_Commentaire échoué",
     "You can't create a poll with hidden results with the following edition option:": "IT_Vous ne pouvez pas créer de sondage avec résulats cachés avec les options d'éditions suivantes : ",
-    "Failed to delete column": "Impossibile eliminare colonna"
+    "Failed to delete column": "Impossibile eliminare colonna",
+    "MISSING_VALUES": "Valori mancanti",
+    "CANT_CONNECT_TO_DATABASE": "Impossibile connettersi al database"
   }
 }
diff --git a/po2json.php b/po2json.php
new file mode 100644
index 0000000000000000000000000000000000000000..07b77b78622ce32f9300c937ce87c14e574d76b6
--- /dev/null
+++ b/po2json.php
@@ -0,0 +1,15 @@
+<?php
+include_once __DIR__ . '/app/inc/init.php';
+?>
+<html>
+<head>
+    <meta charset="utf-8"/>
+</head>
+<body><pre><?php
+$lang = 'fr_FR';
+$po = file_get_contents(__DIR__ . '/locale/' . $lang . '/LC_MESSAGES/Studs.po');
+$converter = new \o80\convert\Po2JsonConverter();
+$json = $converter->convert($po);
+print_r($json);
+?></pre></body>
+</html>
diff --git a/studs.php b/studs.php
index 7270fd1e09a40e05e02cb9395f33154e4d08c1aa..52b90962e94bdff95741fcab0611ab1e245bb6cc 100644
--- a/studs.php
+++ b/studs.php
@@ -66,7 +66,7 @@ function sendUpdateNotification($poll, $mailService, $name, $type) {
 
     if ($poll->receiveNewVotes) {
 
-        $subject = '[' . NOMAPPLICATION . '] ' . __('Mail', 'Poll\'s participation') . ' : ' . $poll->title;
+        $subject = '[' . NOMAPPLICATION . '] ' . __f('Mail', 'Poll\'s participation: %s', $poll->title);
 
         $message = $name . ' ';
         switch ($type) {
@@ -80,7 +80,8 @@ function sendUpdateNotification($poll, $mailService, $name, $type) {
                 $message .= __('Mail', "wrote a comment.\nYou can find your poll at the link") . " :\n\n";
                 break;
         }
-        $message .= Utils::getUrlSondage($poll->admin_id, true) . "\n\n";
+        $urlSondage = Utils::getUrlSondage($poll->admin_id, true);
+        $message .= '<a href="' . $urlSondage . '">' . $urlSondage . '</a>' . "\n\n";
 
         $messageTypeKey = $type . '-' . $poll->id;
         $mailService->send($poll->admin_mail, $subject, $message, $messageTypeKey);
@@ -215,6 +216,5 @@ $smarty->assign('editingVoteId', $editingVoteId);
 $smarty->assign('message', $message);
 $smarty->assign('admin', false);
 $smarty->assign('hidden', $poll->hidden);
-$smarty->assign('parameter_name_regex', NAME_REGEX);
 
 $smarty->display('studs.tpl');
diff --git a/tpl/admin/config.tpl b/tpl/admin/config.tpl
new file mode 100644
index 0000000000000000000000000000000000000000..3254e91968421c01c9b93a6878498c3b25e4ef6b
--- /dev/null
+++ b/tpl/admin/config.tpl
@@ -0,0 +1,89 @@
+<?php
+/**
+ * This software is governed by the CeCILL-B license. If a copy of this license
+ * is not distributed with this file, you can obtain one at
+ * http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt
+ *
+ * Authors of STUdS (initial project): Guilhem BORGHESI (borghesi@unistra.fr) and Raphaël DROZ
+ * Authors of Framadate/OpenSondate: Framasoft (https://github.com/framasoft)
+ *
+ * =============================
+ *
+ * Ce logiciel est régi par la licence CeCILL-B. Si une copie de cette licence
+ * ne se trouve pas avec ce fichier vous pouvez l'obtenir sur
+ * http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.txt
+ *
+ * Auteurs de STUdS (projet initial) : Guilhem BORGHESI (borghesi@unistra.fr) et Raphaël DROZ
+ * Auteurs de Framadate/OpenSondage : Framasoft (https://github.com/framasoft)
+ */
+
+// Fully qualified domain name of your webserver.
+// If this is unset or empty, the servername is determined automatically.
+// You *have to set this* if you are running Framedate behind a reverse proxy.
+// const APP_URL = '<www.mydomain.fr>';
+
+// Application name
+const NOMAPPLICATION = '{$appName}';
+
+// Database administrator email
+const ADRESSEMAILADMIN = '{$appMail}';
+
+// Email for automatic responses (you should set it to "no-reply")
+const ADRESSEMAILREPONSEAUTO = '{$responseMail}';
+
+// Database server name, leave empty to use a socket
+const DB_CONNECTION_STRING = '{$dbConnectionString}';
+
+// Database user
+const DB_USER= '{$dbUser}';
+
+// Database password
+const DB_PASSWORD = '{$dbPassword}';
+
+// Table name prefix
+const TABLENAME_PREFIX = '{$dbPrefix}';
+
+// Name of the table that store migration script already executed
+const MIGRATION_TABLE = '{$migrationTable}';
+
+// Default Language
+const DEFAULT_LANGUAGE = '{$defaultLanguage}';
+
+// List of supported languages, fake constant as arrays can be used as constants only in PHP >=5.6
+$ALLOWED_LANGUAGES = [
+    'fr' => 'Français',
+    'en' => 'English',
+    'es' => 'Español',
+    'de' => 'Deutsch',
+    'it' => 'Italiano',
+];
+
+// Nom et emplacement du fichier image contenant le titre
+const IMAGE_TITRE = 'images/logo-framadate.png';
+
+// Clean URLs, boolean
+const URL_PROPRE = {if in_array($cleanUrl, array('1', 'on', 'true'))}true{else}false{/if};
+
+// Use REMOTE_USER data provided by web server
+const USE_REMOTE_USER =  true;
+
+// Path to the log file
+const LOG_FILE = 'admin/stdout.log';
+
+// Days (after expiration date) before purge a poll
+const PURGE_DELAY = 60;
+
+// Config
+$config = [
+    /* general config */
+    'use_smtp' => true,                     // use email for polls creation/modification/responses notification
+    /* home */
+    'show_what_is_that' => true,            // display "how to use" section
+    'show_the_software' => true,            // display technical information about the software
+    'show_cultivate_your_garden' => true,   // display "developpement and administration" information
+    /* create_classic_poll.php / create_date_poll.php */
+    'default_poll_duration' => 180,         // default values for the new poll duration (number of days).
+    /* create_classic_poll.php */
+    'user_can_add_img_or_link' => true,     // user can add link or URL when creating his poll.
+];
+
diff --git a/tpl/admin/install.tpl b/tpl/admin/install.tpl
new file mode 100644
index 0000000000000000000000000000000000000000..38f613cc5bcaaffcbc3db3cd95c8b32960e4a5b1
--- /dev/null
+++ b/tpl/admin/install.tpl
@@ -0,0 +1,102 @@
+{extends 'admin/admin_page.tpl'}
+
+{block 'main'}
+<div class="row">
+    <div class="col-md-12">
+        <form action="" method="POST">
+
+            {if $error}
+                <div id="result" class="alert alert-danger">{$error}</div>
+            {/if}
+
+            <fieldset>
+                <legend>{__('Installation', 'General')}</legend>
+                <div class="form-group">
+                    <div class="form-group">
+                        <div class="input-group">
+                            <label for="appName" class="input-group-addon">{__('Generic', 'ASTERISK')} {__('Installation', 'AppName')}</label>
+                            <input type="text" class="form-control" id="appName" name="appName" value="{$fields['appName']}" autofocus required>
+                        </div>
+                    </div>
+
+                    <div class="form-group">
+                        <div class="input-group">
+                            <label for="appMail" class="input-group-addon">{__('Generic', 'ASTERISK')} {__('Installation', 'AppMail')}</label>
+                            <input type="email" class="form-control" id="appMail" name="appMail" value="{$fields['appMail']}" required>
+                        </div>
+                    </div>
+
+                    <div class="form-group">
+                        <div class="input-group">
+                            <label for="responseMail" class="input-group-addon">{__('Installation', 'ResponseMail')}</label>
+                            <input type="email" class="form-control" id="responseMail" name="responseMail" value="{$fields['responseMail']}">
+                        </div>
+                    </div>
+
+                    <div class="form-group">
+                        <div class="input-group">
+                            <label for="defaultLanguage" class="input-group-addon">{__('Generic', 'ASTERISK')} {__('Installation', 'DefaultLanguage')}</label>
+                            <select type="email" class="form-control" id="defaultLanguage" name="defaultLanguage" required>
+                                {foreach $langs as $lang=>$label}
+                                    <option value="{$lang}" {if $lang==$fields['defaultLanguage']}selected{/if}>{$label}</option>
+                                {/foreach}
+                            </select>
+                        </div>
+                    </div>
+
+                    <div class="input-group">
+                        <label for="cleanUrl" class="input-group-addon">{__('Installation', 'CleanUrl')}</label>
+
+                        <div class="form-control">
+                            <input type="checkbox" id="cleanUrl" name="cleanUrl" {($fields['cleanUrl']) ? 'checked' : ''}>
+                        </div>
+                    </div>
+                </div>
+            </fieldset>
+
+            <fieldset>
+                <legend>{__('Installation', 'Database')}</legend>
+                <div class="form-group">
+                    <div class="input-group">
+                        <label for="dbConnectionString" class="input-group-addon">{__('Generic', 'ASTERISK')} {__('Installation', 'DbConnectionString')}</label>
+                        <input type="text" class="form-control" id="dbConnectionString" name="dbConnectionString" value="{$fields['dbConnectionString']}" required>
+                    </div>
+                </div>
+
+                <div class="form-group">
+                    <div class="input-group">
+                        <label for="dbUser" class="input-group-addon">{__('Generic', 'ASTERISK')} {__('Installation', 'DbUser')}</label>
+                        <input type="text" class="form-control" id="dbUser" name="dbUser" value="{$fields['dbUser']}" required>
+                    </div>
+                </div>
+
+                <div class="form-group">
+                    <div class="input-group">
+                        <label for="dbPassword" class="input-group-addon">{__('Installation', 'DbPassword')}</label>
+                        <input type="password" class="form-control" id="dbPassword" name="dbPassword" value="{$fields['dbPassword']}">
+                    </div>
+                </div>
+
+                <div class="form-group">
+                    <div class="input-group">
+                        <label for="dbPrefix" class="input-group-addon">{__('Installation', 'DbPrefix')}</label>
+                        <input type="text" class="form-control" id="dbPrefix" name="dbPrefix" value="{$fields['dbPrefix']}">
+                    </div>
+                </div>
+
+                <div class="form-group">
+                    <div class="input-group">
+                        <label for="migrationTable" class="input-group-addon">{__('Generic', 'ASTERISK')} {__('Installation', 'MigrationTable')}</label>
+                        <input type="text" class="form-control" id="migrationTable" name="migrationTable" value="{$fields['migrationTable']}" required>
+                    </div>
+                </div>
+            </fieldset>
+
+            <div class="text-center form-group">
+                <button type="submit" class="btn btn-primary">{__('Installation', 'Install')}</button>
+            </div>
+
+        </form>
+    </div>
+</div>
+{/block}
diff --git a/tpl/admin/polls.tpl b/tpl/admin/polls.tpl
index 53bbd1f896c4dd8029e45ca8d1b924552ee5890f..2963ed25610ce132cdc9e94e8be2a6b20de1fbd5 100644
--- a/tpl/admin/polls.tpl
+++ b/tpl/admin/polls.tpl
@@ -53,7 +53,7 @@
 
         <div class="panel panel-default">
             <div class="panel-heading">
-                {$count} / {$total} {__('Admin', 'polls in the database at this time')}
+                {if $count == $total}{$count}{else}{$count} / {$total}{/if} {__('Admin', 'polls in the database at this time')}
             </div>
 
             <table class="table table-bordered table-polls">
diff --git a/tpl/create_poll.tpl b/tpl/create_poll.tpl
index c064dbf72353264cf590ee8a85e6881335dba21f..8e98899b3c93987cd601a37e5eb2a683a19b0cea 100644
--- a/tpl/create_poll.tpl
+++ b/tpl/create_poll.tpl
@@ -96,10 +96,6 @@
                 <div class="form-group">
                     <div class="col-sm-offset-4 col-sm-8">
                         <div class="radio">
-                            <label>
-                                <input type="radio" name="editable" {if empty($poll_editable) or $poll_editable==constant("Framadate\Editable::NOT_EDITABLE")}checked{/if} value="{constant("Framadate\Editable::NOT_EDITABLE")}">
-                                {__('Step 1', 'Votes cannot be modified.')}
-                            </label>
                             <label>
                                 <input type="radio" name="editable" id="editableByAll" {if $poll_editable==constant("Framadate\Editable::EDITABLE_BY_ALL")}checked{/if} value="{constant("Framadate\Editable::EDITABLE_BY_ALL")}">
                                 {__('Step 1', 'All voters can modify any vote')}
@@ -108,6 +104,10 @@
                                 <input type="radio" name="editable" {if $poll_editable==constant("Framadate\Editable::EDITABLE_BY_OWN")}checked{/if} value="{constant("Framadate\Editable::EDITABLE_BY_OWN")}">
                                 {__('Step 1', 'Voters can modify their vote themselves')}
                             </label>
+                            <label>
+                                <input type="radio" name="editable" {if empty($poll_editable) or $poll_editable==constant("Framadate\Editable::NOT_EDITABLE")}checked{/if} value="{constant("Framadate\Editable::NOT_EDITABLE")}">
+                                {__('Step 1', 'Votes cannot be modified.')}
+                            </label>
                         </div>
                     </div>
                 </div>
@@ -136,23 +136,25 @@
                             </div>
                         </div>
                     </div>
-                    <div class="form-group">
-                        <div class="col-sm-offset-4 col-sm-8">
-                            <div class="checkbox">
-                                <label>
-                                    <input type="checkbox" name="hidden" {if $poll_hidden}checked{/if}
-                                    id="hidden">
-                                    {__('Step 1', 'Only the poll maker can see the poll\'s results')}
-                                </label>
-                            </div>
-                            <div id="hiddenWithBadEditionModeError" class="alert alert-danger hidden">
-                                <p>
-                                    {__('Error', 'You can\'t create a poll with hidden results with the following edition option:')}"{__('Step 1', 'All voters can modify any vote')}"
-                                </p>
-                            </div>
+                {/if}
+
+                <div class="form-group">
+                    <div class="col-sm-offset-4 col-sm-8">
+                        <div class="checkbox">
+                            <label>
+                                <input type="checkbox" name="hidden" {if $poll_hidden}checked{/if}
+                                id="hidden">
+                                {__('Step 1', 'Only the poll maker can see the poll\'s results')}
+                            </label>
+                        </div>
+                        <div id="hiddenWithBadEditionModeError" class="alert alert-danger hidden">
+                            <p>
+                                {__('Error', 'You can\'t create a poll with hidden results with the following edition option:')}"{__('Step 1', 'All voters can modify any vote')}"
+                            </p>
                         </div>
                     </div>
-                {/if}
+                </div>
+
 
 
 
diff --git a/tpl/header.tpl b/tpl/header.tpl
index a4eb83c36859cad1a14b94544bf9c79d3f9b9931..5f68c92597a25aa99f302876da6f22baf5308932 100644
--- a/tpl/header.tpl
+++ b/tpl/header.tpl
@@ -1,7 +1,7 @@
-    <header role="banner">
+    <header role="banner" class="clearfix">
     {if count($langs)>1}
         <form method="post" action="" class="hidden-print">
-            <div class="input-group input-group-sm pull-right col-md-2 col-xs-4">
+            <div class="input-group input-group-sm pull-right col-xs-12 col-sm-2">
                 <select name="lang" class="form-control" title="{__('Language selector', 'Select the language')}" >
                 {foreach $langs as $lang_key=>$lang_value}
                     <option lang="{substr($lang_key, 0, 2)}" {if substr($lang_key, 0, 2)==$locale}selected{/if} value="{$lang_key|html}">{$lang_value|html}</option>
@@ -14,8 +14,12 @@
         </form>
     {/if}
 
-        <h1><a href="{$SERVER_URL|html}" title="{__('Generic', 'Home')} - {$APPLICATION_NAME|html}"><img src="{$TITLE_IMAGE|resource}" alt="{$APPLICATION_NAME|html}"/></a></h1>
-        {if !empty($title)}<h2 class="lead"><i>{$title|html}</i></h2>{/if}
-        <hr class="trait" role="presentation" />
+        <h1 class="row col-xs-12 col-sm-10">
+            <a href="{$SERVER_URL|html}" title="{__('Generic', 'Home')} - {$APPLICATION_NAME|html}" >
+                <img src="{$TITLE_IMAGE|resource}" alt="{$APPLICATION_NAME|html}" class="img-responsive"/>
+            </a>
+        </h1>
+        {if !empty($title)}<h2 class="lead col-xs-12"><i>{$title|html}</i></h2>{/if}
+        <div class="trait col-xs-12" role="presentation"></div>
     </header>
-    <main role="main">
\ No newline at end of file
+    <main role="main">
diff --git a/tpl/index.tpl b/tpl/index.tpl
index 1d396870dad7431599ea49f2a51938207f8fccc3..e1f6e194f36bbaa8fdf810abe8e69397fe9dce6c 100644
--- a/tpl/index.tpl
+++ b/tpl/index.tpl
@@ -2,7 +2,7 @@
 
 {block name=main}
     <div class="row">
-        <div class="col-md-6 text-center">
+        <div class="col-xs-12 col-md-6 text-center">
             <p class="home-choice">
                 <a href="{$SERVER_URL}create_poll.php?type=date" class="opacity" role="button">
                     <img class="img-responsive center-block" src="{'images/date.png'|resource}" alt=""/>
@@ -14,7 +14,7 @@
                 </a>
             </p>
         </div>
-        <div class="col-md-6 text-center">
+        <div class="col-xs-12 col-md-6 text-center">
             <p class="home-choice">
                 <a href="{$SERVER_URL}create_poll.php?type=autre" class="opacity" role="button">
                     <img alt="" class="img-responsive center-block" src="{'images/classic.png'|resource}"/>
@@ -26,7 +26,7 @@
                 </a>
             </p>
         </div>
-        <div class="col-md-6 col-md-offset-3 text-center">
+        <div class="col-xs-12 col-md-6 col-md-offset-3 text-center">
             <p class="home-choice">
                 <a href="{$SERVER_URL}find_polls.php" class="opacity" role="button">
                     <span class="btn btn-warning btn-lg">
diff --git a/tpl/page.tpl b/tpl/page.tpl
index c3922c5e2b06097992d55a854a2e4755cfa1dcb5..72c466155f0b33a8d8584f0f496ba7bb66b4c1d0 100644
--- a/tpl/page.tpl
+++ b/tpl/page.tpl
@@ -20,14 +20,13 @@
     <script type="text/javascript" src="{"js/locales/bootstrap-datepicker.$locale.js"|resource}"></script>
     <script type="text/javascript" src="{'js/core.js'|resource}"></script>
 
-    {if $use_nav_js}
-        <script src="{'nav/nav.js'|resource}" id="nav_js" type="text/javascript" charset="utf-8"></script><!-- /Framanav -->
-    {/if}
-
     {block name="header"}{/block}
 
 </head>
 <body>
+{if $use_nav_js}
+    <script src="https://n2.framasoft.org/nav/nav.js" type="text/javascript"></script>
+{/if}
 <div class="container ombre">
 
 {include file='header.tpl'}
@@ -37,4 +36,4 @@
 </main>
 </div> <!-- .container -->
 </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/tpl/part/vote_table_classic.tpl b/tpl/part/vote_table_classic.tpl
index 725c4c987a6b1f76a0f69623e2759754423e8a92..20fe88583775f429596737c74692fd285a2ca04a 100644
--- a/tpl/part/vote_table_classic.tpl
+++ b/tpl/part/vote_table_classic.tpl
@@ -192,19 +192,23 @@
     <script type="text/javascript">
         $(document).ready(function () {
             $('#showChart').on('click', function() {
-                $('#showChart').after("<h3>{__('Poll results', 'Chart')}</h3><canvas id=\"Chart\"></canvas>");
-                $('#showChart').remove();
+                $('#showChart')
+                        .after("<h3>{__('Poll results', 'Chart')}</h3><canvas id=\"Chart\"></canvas>")
+                        .remove();
                 
                 var resIfneedbe = [];
                 var resYes = [];
             
-                $('#addition').find('td').each(function (colIndex) {
-                    if($(this).find('.inb-count').text()!='' && $(this).find('.inb-count').text()!=undefined) {
+                $('#addition').find('td').each(function () {
+                    var inbCountText = $(this).find('.inb-count').text();
+                    if(inbCountText != '' && inbCountText != undefined) {
                         resIfneedbe.push($(this).find('.inb-count').html())
                     } else {
                         resIfneedbe.push(0);
                     }
-                    if($(this).find('.yes-count').text()!='' && $(this).find('.yes-count').text()!=undefined) {
+
+                    var yesCountText = $(this).find('.yes-count').text();
+                    if(yesCountText != '' && yesCountText != undefined) {
                         resYes.push($(this).find('.yes-count').html())
                     } else {
                         resYes.push(0);
@@ -216,8 +220,8 @@
                 {/foreach}
                 ];
 
-                resIfneedbe.shift(); resIfneedbe.pop();
-                resYes.shift(); resYes.pop();
+                resIfneedbe.shift();
+                resYes.shift();
 
                 var barChartData = {
                     labels : cols,
diff --git a/tpl/part/vote_table_date.tpl b/tpl/part/vote_table_date.tpl
index cf3f3758fa8b6bc43e605af4af3280fdfe14fc60..029e11f5e13397a2c45f0e08e75d5585759317f6 100644
--- a/tpl/part/vote_table_date.tpl
+++ b/tpl/part/vote_table_date.tpl
@@ -17,7 +17,7 @@
                     {foreach $slots as $slot}
                         {foreach $slot->moments as $id=>$moment}
                             <td headers="M{$slot@key} D{$headersDCount} H{$headersDCount}">
-                                <a href="{poll_url id=$admin_poll_id admin=true action='delete_column' action_value=$slot->day|cat:'@'|cat:$moment}"
+                                <a href="{poll_url id=$admin_poll_id admin=true action='delete_column' action_value=$slot->day|cat:'@'|cat:urlencode($moment)}"
                                    class="btn btn-link btn-sm"
                                    title="{__('adminstuds', 'Remove the column')} {$slot->day|date_format:$date_format.txt_short|html} - {$moment|html}">
                                     <i class="glyphicon glyphicon-remove text-danger"></i><span class="sr-only">{__('Generic', 'Remove')}</span>
@@ -247,20 +247,23 @@
     <script type="text/javascript">
         $(document).ready(function () {
             $('#showChart').on('click', function() {
-                $('#showChart').after("<h3>{__('Poll results', 'Chart')}</h3><canvas id=\"Chart\"></canvas>");
-                $('#showChart').remove();
+                $('#showChart')
+                        .after("<h3>{__('Poll results', 'Chart')}</h3><canvas id=\"Chart\"></canvas>")
+                        .remove();
                                
                 var resIfneedbe = [];
                 var resYes = [];
             
-                $('#addition').find('td').each(function (colIndex) {
-                    if($(this).find('.inb-count').text()!='') {
-                        resIfneedbe.push($(this).find('.inb-count').text())
+                $('#addition').find('td').each(function () {
+                    var inbCountText = $(this).find('.inb-count').text();
+                    if(inbCountText != '' && inbCountText != undefined) {
+                        resIfneedbe.push(inbCountText)
                     } else {
                         resIfneedbe.push(0);
                     }
-                    if($(this).find('.yes-count').text()!='') {
-                        resYes.push($(this).find('.yes-count').text())
+                    var yesCountText = $(this).find('.yes-count').text();
+                    if(yesCountText != '' && yesCountText != undefined) {
+                        resYes.push(yesCountText)
                     } else {
                         resYes.push(0);
                     }
@@ -273,8 +276,8 @@
                 {/foreach}
                 ];
 
-                resIfneedbe.shift(); resIfneedbe.pop();
-                resYes.shift(); resYes.pop();
+                resIfneedbe.shift();
+                resYes.shift();
 
                 var barChartData = {
                     labels : cols,
diff --git a/tpl/studs.tpl b/tpl/studs.tpl
index aaddc992a4d7677028d0fab0ad7f5ec46055e418..f84fe6a7b66b8d866cb2f2465ba3c500e19d4c96 100644
--- a/tpl/studs.tpl
+++ b/tpl/studs.tpl
@@ -48,10 +48,6 @@
     </div>
 </div>
 
-<div class="hidden">
-    <p id="parameter_name_regex">{$parameter_name_regex}</p>
-</div>
-
 
 {* Vote table *}