diff --git a/Makefile b/Makefile
index ab00e8a3331720f5e5862d073019eb00251df013..8958c6bfbfc8ce17f8757ea26079b379db650220 100644
--- a/Makefile
+++ b/Makefile
@@ -134,8 +134,8 @@ gogo-update: ## Update a PROD server to the lastest version of gogocarto
 	$(YARN) install
 	$(GULP) build
 	$(GULP) production
-	$(YARN) encore production		
-	$(SYMFONY) db:migrate
-	make purge
+	$(YARN) encore production	
+	make purge	
+	$(SYMFONY) db:migrate	
 	make hide-deploy-message
 	service cron start
\ No newline at end of file
diff --git a/assets/scss/admin.scss b/assets/scss/admin.scss
index e68c4104c5dc81bae99c8ddc9c4d983c3d15ff67..1d57a600ec19c3a2f7a4b7278f21319d1643e780 100644
--- a/assets/scss/admin.scss
+++ b/assets/scss/admin.scss
@@ -99,4 +99,10 @@ pre {
 .form-control {
     height: 30px;
     padding: 3px 12px;
+}
+.select2-container .select2-choice {
+    height: 30px;
+}
+.select2-choice>span:first-child, .select2-chosen, .select2-container .select2-choices .select2-search-field input {
+    padding: 5px 12px;
 }
\ No newline at end of file
diff --git a/bin/execute_custom_domain.sh b/bin/execute_custom_domain.sh
index f7e06fd24ac11bcd4bed89bbd55e7f6def7915cb..0edad4e2656453dcba0db5ea51beec1255ecaea2 100644
--- a/bin/execute_custom_domain.sh
+++ b/bin/execute_custom_domain.sh
@@ -7,7 +7,8 @@ for file in var/file_queues/custom_domain_to_remove/*
 do    
     if [ -e $file ] 
     then
-        CUSTOM_URL=`cat $file`
+        fileContent=`cat $file`
+        CUSTOM_URL=($fileContent) # get first word
         echo "\n\n\nRemoving subdomain for $file : $CUSTOM_URL"
         if [ -n "$CUSTOM_URL" ]; then
             echo "Remove previous certificates if exists"
@@ -24,19 +25,24 @@ do
 done
 
 for file in var/file_queues/custom_domain_to_configure/*
-do
+do    
     if [ -e $file ] 
     then
-        arguments=`cat $file`
-        echo "\n\n\nConfigure new domain for $file : $arguments"
-
-        if sh bin/configure_custom_domain.sh $arguments
-        then
-            echo "Successfully configured $file, the file queue can now be deleted"
-            service nginx reload
-            rm $file
+        if [[ $(find "$file" -mmin +300 -print) ]]; then
+            echo "File $file is older than 5 hours, so deleting it"
+            mv $file var/file_queues/custom_domain_to_remove/
         else
-            echo "Problem while configuring $file"
-        fi    
+            arguments=`cat $file`
+            echo "\n\n\nConfigure new domain for $file : $arguments"
+
+            if sh bin/configure_custom_domain.sh $arguments
+            then
+                echo "Successfully configured $file, the file queue can now be deleted"
+                service nginx reload
+                rm $file
+            else
+                echo "Problem while configuring $file"
+            fi    
+        fi        
     fi
 done
diff --git a/config/parameters.yaml b/config/parameters.yaml
index 6593441ff518ff6573a0b82167eabc0d1204c280..fb44b686bab449aebcff1c4dc8a949da1fa4bd66 100644
--- a/config/parameters.yaml
+++ b/config/parameters.yaml
@@ -1,7 +1,7 @@
 # Put parameters here that don't need to change on each machine where the app is deployed
 # https://symfony.com/doc/current/best_practices/configuration.html#application-related-configuration
 parameters:
-    app.version: 3.2.1
+    app.version: 3.2.2
     use_as_sass: "%env(USE_AS_SAAS)%"
     locale: fr
     router.request_context.host: '%env(string:BASE_URL)%'
diff --git a/config/services.yaml b/config/services.yaml
index 5fba080a1e38c749212cd4aec4ec391131dd02f8..93e77ea1a25967751d5716acea77d503a21d2feb 100755
--- a/config/services.yaml
+++ b/config/services.yaml
@@ -231,6 +231,12 @@ services:
         arguments: [~, App\Document\Configuration, 'App\Controller\Admin\ConfigurationAdminController']
         tags:
             - { name: sonata.admin, manager_type: doctrine_mongodb, group: custom, label: App Mobile }
+    
+    admin.custom_js_css_config:
+        class: App\Admin\ConfigurationCustomJsCssAdmin
+        arguments: [~, App\Document\Configuration, 'App\Controller\Admin\ConfigurationAdminController']
+        tags:
+            - { name: sonata.admin, manager_type: doctrine_mongodb, group: custom, label: Custom Css / Js }
 
     admin.email_config:
         class: App\Admin\ConfigurationMailAdmin
diff --git a/docs/installation.md b/docs/installation.md
index 7e7abaa1a683214d6c8e591e1b102689a2021804..a170135291bcb6c75af229c557c817b0155f2464 100755
--- a/docs/installation.md
+++ b/docs/installation.md
@@ -103,7 +103,7 @@ Here are the following cron tab you need to configure
 
 @daily php GOGOCARTO_DIR/bin/console --env=prod app:projects:check-for-deleting
 # Next one is for custom domain, it works only with NGINX
-* * * * * cd GOGOCARTO_DIR && sh bin/execute_custom_domain.sh
+0 * * * * cd GOGOCARTO_DIR &&bash bin/execute_custom_domain.sh
 ```
 
 ### Updating GoGoCarto
diff --git a/src/Admin/ConfigurationAdmin.php b/src/Admin/ConfigurationAdmin.php
index 4e418147f51bbb5bc46d7df9b522c045d3922fcb..e55ecde89310a0afeaefb4c8854b40f492fb056d 100755
--- a/src/Admin/ConfigurationAdmin.php
+++ b/src/Admin/ConfigurationAdmin.php
@@ -30,7 +30,7 @@ class ConfigurationAdmin extends ConfigurationAbstractAdmin
                 ->add('appName', null, ['label' => 'Nom du site'])
                 ->add('appBaseline', null, ['label' => 'Description du site (baseline)', 'required' => false])
                 ->add('appTags', null, ['label' => 'Mot clés pour le référencement (séparés par une virgule)', 'required' => false])
-                ->add('customDomain', UrlType::class, ['label' => "Utiliser un nom de domaine personnalisé (exple macarte.org au lieu de macarte.gogocarto.fr). Après avoir acheté le nom de domaine macarte.org, vous devez d'abords le rediriger sur l'adresse IP du serveur GoGoCarto (" . $_SERVER['SERVER_ADDR'] ."). Ensuite renseignez ici le nom de votre domaine, et attendez quelques minutes le temps que cela soit configuré par GoGoCarto", 'required' => false])
+                ->add('customDomain', UrlType::class, ['label' => "Utiliser un nom de domaine personnalisé (exple macarte.org au lieu de macarte.gogocarto.fr). Après avoir acheté le nom de domaine macarte.org, vous devez d'abords le rediriger sur l'adresse IP du serveur GoGoCarto (" . $_SERVER['SERVER_ADDR'] ."). Ensuite renseignez ici le nom de votre domaine, et attendez le temps que cela soit configuré par GoGoCarto (une tentative est effectuée toute les heures). GoGoCarto abandonne au bout de 4 tentatives", 'label_attr' => ['title' => 'Si au bout de plusieurs heures rien ne se passe, vous devrez remettre vide la configuration du sous domaine, sauvegarder, puis la reremplir pour créer un nouvel essai'], 'required' => false])
                 ->add('dataLicenseUrl', null, ['label' => 'Url de la licence qui protège vos données', 'required' => false])
             ->end()
             ->with('Images générales', ['class' => 'col-md-6'])
diff --git a/src/Admin/ConfigurationCustomJsCssAdmin.php b/src/Admin/ConfigurationCustomJsCssAdmin.php
new file mode 100755
index 0000000000000000000000000000000000000000..23e3a90fc031e60c5468bf9072372573906029c5
--- /dev/null
+++ b/src/Admin/ConfigurationCustomJsCssAdmin.php
@@ -0,0 +1,28 @@
+<?php
+
+namespace App\Admin;
+
+use Sonata\AdminBundle\Form\FormMapper;
+
+class ConfigurationCustomJsCssAdmin extends ConfigurationAbstractAdmin
+{
+    protected $baseRouteName = 'gogo_core_bundle_config_custom_js_css_admin_classname';
+
+    protected $baseRoutePattern = 'gogo/core/configuration-custom-js-css';
+
+    protected function configureFormFields(FormMapper $formMapper)
+    {
+        $formMapper
+            ->tab('Custom Style')
+                ->with('Entrez du code CSS qui sera chargé sur toutes les pages publiques')
+                    ->add('customCSS', null, ['label' => 'Custom CSS', 'attr' => ['class' => 'gogo-code-editor', 'format' => 'css', 'height' => '500'], 'required' => false])
+                ->end()
+            ->end()
+            ->tab('Custom Javascript')
+                ->with('Entrez du code Javascript qui sera chargé sur toutes les pages publiques')
+                    ->add('customJavascript', null, ['label' => 'Custom Javascript', 'attr' => ['class' => 'gogo-code-editor', 'format' => 'javascript', 'height' => '500'], 'required' => false])
+                ->end()
+            ->end()
+        ;
+    }
+}
diff --git a/src/Admin/ConfigurationStyleAdmin.php b/src/Admin/ConfigurationStyleAdmin.php
index b61eadf49b278481869e51ae0c87d7a514ec4226..636caaf5f38e3a49cf6371e32a4da62b40560a5f 100755
--- a/src/Admin/ConfigurationStyleAdmin.php
+++ b/src/Admin/ConfigurationStyleAdmin.php
@@ -19,60 +19,43 @@ class ConfigurationStyleAdmin extends ConfigurationAbstractAdmin
 
     protected function configureFormFields(FormMapper $formMapper)
     {
-        $featureStyle = ['class' => 'col-md-6 col-lg-3'];
-        $contributionStyle = ['class' => 'col-md-6 col-lg-4'];
-        $mailStyle = ['class' => 'col-md-12 col-lg-6'];
-        $featureFormOption = ['delete' => false, 'required' => false, 'label_attr' => ['style' => 'display:none']];
-        $featureFormTypeOption = ['edit' => 'inline'];
         $formMapper
-            ->tab('Style')
-                ->with('Thème et polices', ['class' => 'col-md-6'])
-                    ->add('theme', ChoiceType::class, ['label' => 'Thème', 'choices' => ['Défaut' => 'default', 'Flat' => 'flat', 'Près de chez Nous' => 'presdecheznous', 'Transiscope' => 'transiscope']])
-                    ->add('mainFont', null, ['label' => 'Police principale', 'attr' => ['class' => 'gogo-font-picker']])
-                    ->add('titleFont', null, ['label' => 'Police de titre', 'attr' => ['class' => 'gogo-font-picker']])
+            ->with('Thème et polices', ['class' => 'col-md-6'])
+                ->add('theme', ChoiceType::class, ['label' => 'Thème', 'choices' => ['Défaut' => 'default', 'Flat' => 'flat', 'Près de chez Nous' => 'presdecheznous', 'Transiscope' => 'transiscope']])
+                ->add('mainFont', null, ['label' => 'Police principale', 'attr' => ['class' => 'gogo-font-picker']])
+                ->add('titleFont', null, ['label' => 'Police de titre', 'attr' => ['class' => 'gogo-font-picker']])
 
-                ->end()
-                ->with('Couleurs principales', ['class' => 'col-md-6'])
-                    ->add('textColor', null, ['label' => 'Couleur de texte', 'attr' => ['class' => 'gogo-color-picker']])
-                    ->add('primaryColor', null, ['label' => 'Couleur Primaire', 'attr' => ['class' => 'gogo-color-picker']])
-                    ->add('backgroundColor', null, ['label' => 'Couleur de fond de page', 'attr' => ['class' => 'gogo-color-picker'], 'required' => false])
-                ->end()
-                ->with("Charger d'autres polices et icones")
-                    ->add('fontImport', null, ['label' => 'Lien pour le CDN des polices', 'required' => false])
-                    ->add('iconImport', null, ['label' => 'Lien pour le CDN des icones (par défault, les icones de FontAwesome sont chargées)', 'required' => false])
-                ->end()
-                ->with('Autres couleurs', ['class' => 'col-md-6'])
-                    ->add('secondaryColor', null, ['label' => 'Couleur Secondaire', 'attr' => ['class' => 'gogo-color-picker'], 'required' => false])
-                    ->add('headerColor', null, ['label' => 'Couleur fond header', 'attr' => ['class' => 'gogo-color-picker'], 'required' => false])
-                    ->add('headerTextColor', null, ['label' => 'Couleur texte header', 'attr' => ['class' => 'gogo-color-picker'], 'required' => false])
-                    ->add('headerHoverColor', null, ['label' => 'Couleur texte survol header', 'attr' => ['class' => 'gogo-color-picker'], 'required' => false])
-                    ->add('contentBackgroundColor', null, ['label' => 'Couleur arrière plan du contenu des pages', 'attr' => ['class' => 'gogo-color-picker'], 'required' => false])
-                    ->add('contentBackgroundElementBodyColor', null, ['label' => 'Couleur arrière plan du contenu de la fiche détail', 'attr' => ['class' => 'gogo-color-picker'], 'required' => false])
-                    ->add('homeBackgroundColor', null, ['label' => "Couleur arrière plan de la page d'accueil", 'attr' => ['class' => 'gogo-color-picker'], 'required' => false])
-                    ->add('searchBarColor', null, ['label' => 'Couleur bar de recherche', 'attr' => ['class' => 'gogo-color-picker'], 'required' => false])
-                    ->add('interactiveSectionColor', null, ['label' => 'Couleur section pour voter dans la fiche détail', 'attr' => ['class' => 'gogo-color-picker'], 'required' => false])
-                ->end()
-                ->with('Couleurs avancées', ['class' => 'col-md-6'])
-                    ->add('textDarkColor', null, ['label' => 'Couleur text foncé', 'attr' => ['class' => 'gogo-color-picker'], 'required' => false])
-                    ->add('textDarkSoftColor', null, ['label' => 'Couleur text foncé adoucie', 'attr' => ['class' => 'gogo-color-picker'], 'required' => false])
-                    ->add('textLightColor', null, ['label' => 'Couleur texte clair', 'attr' => ['class' => 'gogo-color-picker'], 'required' => false])
-                    ->add('textLightSoftColor', null, ['label' => 'Couleur text clair adoucie', 'attr' => ['class' => 'gogo-color-picker'], 'required' => false])
-                    ->add('errorColor', null, ['label' => "Couleur d'erreur", 'attr' => ['class' => 'gogo-color-picker'], 'required' => false])
-                    ->add('disableColor', null, ['label' => 'Couleur désactivé', 'attr' => ['class' => 'gogo-color-picker'], 'required' => false])
-                    ->add('pendingColor', null, ['label' => 'Couleur en attente de validation', 'attr' => ['class' => 'gogo-color-picker'], 'required' => false])
-
-                ->end()
             ->end()
-            ->tab('Custom Style')
-                ->with('Entrez du code CSS qui sera chargé sur toutes les pages publiques')
-                    ->add('customCSS', null, ['label' => 'Custom CSS', 'attr' => ['class' => 'gogo-code-editor', 'format' => 'css', 'height' => '500'], 'required' => false])
-                ->end()
+            ->with('Couleurs principales', ['class' => 'col-md-6'])
+                ->add('textColor', null, ['label' => 'Couleur de texte', 'attr' => ['class' => 'gogo-color-picker']])
+                ->add('primaryColor', null, ['label' => 'Couleur Primaire', 'attr' => ['class' => 'gogo-color-picker']])
+                ->add('backgroundColor', null, ['label' => 'Couleur de fond de page', 'attr' => ['class' => 'gogo-color-picker'], 'required' => false])
+            ->end()
+            ->with("Charger d'autres polices et icones")
+                ->add('fontImport', null, ['label' => 'Lien pour le CDN des polices', 'required' => false])
+                ->add('iconImport', null, ['label' => 'Lien pour le CDN des icones (par défault, les icones de FontAwesome sont chargées)', 'required' => false])
             ->end()
-            ->tab('Custom Javascript')
-                ->with('Entrez du code Javascript qui sera chargé sur toutes les pages publiques')
-                    ->add('customJavascript', null, ['label' => 'Custom Javascript', 'attr' => ['class' => 'gogo-code-editor', 'format' => 'javascript', 'height' => '500'], 'required' => false])
-                ->end()
+            ->with('Autres couleurs', ['class' => 'col-md-6'])
+                ->add('secondaryColor', null, ['label' => 'Couleur Secondaire', 'attr' => ['class' => 'gogo-color-picker'], 'required' => false])
+                ->add('headerColor', null, ['label' => 'Couleur fond header', 'attr' => ['class' => 'gogo-color-picker'], 'required' => false])
+                ->add('headerTextColor', null, ['label' => 'Couleur texte header', 'attr' => ['class' => 'gogo-color-picker'], 'required' => false])
+                ->add('headerHoverColor', null, ['label' => 'Couleur texte survol header', 'attr' => ['class' => 'gogo-color-picker'], 'required' => false])
+                ->add('contentBackgroundColor', null, ['label' => 'Couleur arrière plan du contenu des pages', 'attr' => ['class' => 'gogo-color-picker'], 'required' => false])
+                ->add('contentBackgroundElementBodyColor', null, ['label' => 'Couleur arrière plan du contenu de la fiche détail', 'attr' => ['class' => 'gogo-color-picker'], 'required' => false])
+                ->add('homeBackgroundColor', null, ['label' => "Couleur arrière plan de la page d'accueil", 'attr' => ['class' => 'gogo-color-picker'], 'required' => false])
+                ->add('searchBarColor', null, ['label' => 'Couleur bar de recherche', 'attr' => ['class' => 'gogo-color-picker'], 'required' => false])
+                ->add('interactiveSectionColor', null, ['label' => 'Couleur section pour voter dans la fiche détail', 'attr' => ['class' => 'gogo-color-picker'], 'required' => false])
             ->end()
+            ->with('Couleurs avancées', ['class' => 'col-md-6'])
+                ->add('textDarkColor', null, ['label' => 'Couleur text foncé', 'attr' => ['class' => 'gogo-color-picker'], 'required' => false])
+                ->add('textDarkSoftColor', null, ['label' => 'Couleur text foncé adoucie', 'attr' => ['class' => 'gogo-color-picker'], 'required' => false])
+                ->add('textLightColor', null, ['label' => 'Couleur texte clair', 'attr' => ['class' => 'gogo-color-picker'], 'required' => false])
+                ->add('textLightSoftColor', null, ['label' => 'Couleur text clair adoucie', 'attr' => ['class' => 'gogo-color-picker'], 'required' => false])
+                ->add('errorColor', null, ['label' => "Couleur d'erreur", 'attr' => ['class' => 'gogo-color-picker'], 'required' => false])
+                ->add('disableColor', null, ['label' => 'Couleur désactivé', 'attr' => ['class' => 'gogo-color-picker'], 'required' => false])
+                ->add('pendingColor', null, ['label' => 'Couleur en attente de validation', 'attr' => ['class' => 'gogo-color-picker'], 'required' => false])
+
+            ->end()     
             ;
     }
 }
diff --git a/src/Command/MigrationCommand.php b/src/Command/MigrationCommand.php
index 329d303300b93dd7974c1cb15281b08efc4b0707..216d3ab0017a607e5d542e1dd49ff29248d6cdd3 100644
--- a/src/Command/MigrationCommand.php
+++ b/src/Command/MigrationCommand.php
@@ -6,6 +6,7 @@ use App\Document\MigrationState;
 use App\Services\AsyncService;
 use Doctrine\ODM\MongoDB\DocumentManager;
 use App\Services\DocumentManagerFactory;
+use Symfony\Component\Console\Command\Command;
 use Psr\Log\LoggerInterface;
 use Symfony\Component\Console\Input\InputInterface;
 use Symfony\Component\Console\Output\OutputInterface;
@@ -15,7 +16,7 @@ use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInt
  * Command to update database when schema need migration
  * Also provide some update message in the admin dashboard.
  */
-class MigrationCommand extends GoGoAbstractCommand
+class MigrationCommand extends Command
 {
     // -----------------------------------------------------------------
     // DO NOT REMOVE A SINGLE ELEMENT OF THOSE ARRAYS, ONLY ADD NEW ONES
@@ -35,11 +36,9 @@ class MigrationCommand extends GoGoAbstractCommand
       // v3.2
       'db.Configuration.updateMany({}, {$set: {"user.loginWithLesCommuns": true, "user.loginWithLesGoogle": true, "user.loginWithFacebook": true}});',
       'db.Option.updateMany({}, {$set: {osmTags: {}}})',
-      'db.Element.find({}).forEach(function(e) {
-        for(var prop in e.privateData) { e.data[prop] = e.privateData[prop]; }
-        delete e.privateData;
-        db.Element.save(e);
-      });'
+      'var mapping = {}; 
+       db.Element.find({ privateData: { $exists: true, $ne: {} } }).forEach(function(doc){Object.keys(doc.privateData).forEach(function(key){mapping["privateData." + key]="data." + key})}); 
+       db.Element.updateMany({ privateData: { $exists: true, $ne: {} } }, {$rename: mapping})'
     ];
 
     public static $commands = [
@@ -76,22 +75,28 @@ class MigrationCommand extends GoGoAbstractCommand
         "La connexion via un compte tiers (Google, Facebook, LesCommuns.org) est maintenant possible ! Changez la configuration dans Utilisateurs -> Configuration"
     ];
 
-    public function __construct(DocumentManagerFactory $dm, LoggerInterface $commandsLogger,
+    public function __construct(DocumentManagerFactory $dmFactory, LoggerInterface $commandsLogger,
                                TokenStorageInterface $security,
                                AsyncService $asyncService)
     {
         $this->asyncService = $asyncService;
-        parent::__construct($dm, $commandsLogger, $security);
+        $this->dm = $dmFactory->getRootManager();
+        $this->dmFactory = $dmFactory;
+        $this->logger = $commandsLogger;
+        $this->security = $security;
+        parent::__construct();
     }
 
-    protected function gogoConfigure(): void
+    protected function configure(): void
     {
         $this->setName('db:migrate')
              ->setDescription('Update datatabse each time after code update');
     }
 
-    protected function gogoExecute(DocumentManager $dm, InputInterface $input, OutputInterface $output): void
+    protected function execute(InputInterface $input, OutputInterface $output): void
     {
+        $dm = $this->dm;
+        $this->output = $output;
         $migrationState = $dm->query('MigrationState')->getQuery()->getSingleResult();
         if (null == $migrationState) { // Meaning the migration state was not yet in the place in the code
             $migrationState = new MigrationState();
@@ -109,11 +114,10 @@ class MigrationCommand extends GoGoAbstractCommand
                 $migrationsToRun = array_unique($migrationsToRun);
                 foreach ($dbs as $db) {
                     foreach ($migrationsToRun as $migration) {
-                        $this->log('run migration '.$migration.' on project '.$db);
+                        $this->log('run migration '.$migration, $db);
                         $this->runMongoCommand($dm, $db, $migration);
                     }
                 }
-                $this->log(count($migrationsToRun).' migrations performed');
             } else {
                 $this->log('No Migrations to perform');
             }
@@ -123,10 +127,9 @@ class MigrationCommand extends GoGoAbstractCommand
             if (count(self::$commands) > $migrationState->getCommandsIndex()) {
                 $commandsToRun = array_slice(self::$commands, $migrationState->getCommandsIndex());
                 $commandsToRun = array_unique($commandsToRun);
-                $this->log(count($commandsToRun).' commands to run');
                 foreach ($dbs as $db) {
                     foreach ($commandsToRun as $command) {
-                        $this->log('call command '.$command.' on project '.$db);
+                        $this->log('call command '.$command, $db);
                         $this->asyncService->callCommand($command, [], $db);
                     }
                 }
@@ -136,15 +139,13 @@ class MigrationCommand extends GoGoAbstractCommand
 
             if (count(self::$messages) > $migrationState->getMessagesIndex()) {
                 $messagesToAdd = array_slice(self::$messages, $migrationState->getMessagesIndex());
-                $this->log(count($messagesToAdd).' messages to add');
                 foreach ($dbs as $db) {
-                    $this->log('add message on project '.$db);
+                    $this->log(count($messagesToAdd).' messages to add', $db);
                     foreach ($messagesToAdd as $message) {
                         // create a GoGoLogUpdate
                         $this->asyncService->callCommand('gogolog:add:message', ['"'.$message.'"'], $db);
                     }
                 }
-                $this->log(count($messagesToAdd).' messages added to admin dashboard');
             } else {
                 $this->log('No Messages to add to dashboard');
             }
@@ -165,4 +166,18 @@ class MigrationCommand extends GoGoAbstractCommand
         $db = $mongo->selectDB($dbName);
         return $db->execute($command);
     }
+
+    protected function log($message, $db = null)
+    {
+        if ($db) $message = "DB {$db} : $message";
+        $this->logger->info($message);
+        $this->output->writeln($message);
+    }
+
+    protected function error($message, $db = null)
+    {
+        if ($db) $message = "DB {$this->db} : $message";
+        $this->logger->error($message);
+        $this->output->writeln('ERROR '.$message);        
+    }
 }
diff --git a/src/Document/Element.php b/src/Document/Element.php
index c095409b5678bd63bf80a3aaa5e409d56b5f7b40..402d86587d1148e62a0c9513eea22862915532ed 100644
--- a/src/Document/Element.php
+++ b/src/Document/Element.php
@@ -378,9 +378,7 @@ class Element
 
     public function isSynchedWithExternalDatabase()
     {
-        // TODO is should be configured on the external source (i.e the import)
-        // not all the import will want the imported data to be editable and synchronized
-        return $this->getIsExternal() && $this->getSource()->getSourceType() == 'osm';
+        return $this->getIsExternal() && $this->getSource()->getIsSynchronized();
     }
 
     public function getShowUrlFromController($router)
diff --git a/src/Services/GoGoCartoJsService.php b/src/Services/GoGoCartoJsService.php
index 97668dd442e1fe45ce402b23f4e363b44f2be0bb..a1e5ea1d1b2b93b0dbb8036d57a3df8df3915332 100644
--- a/src/Services/GoGoCartoJsService.php
+++ b/src/Services/GoGoCartoJsService.php
@@ -6,15 +6,16 @@ use Doctrine\ODM\MongoDB\DocumentManager;
 use Symfony\Component\HttpFoundation\Session\SessionInterface;
 use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
 use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
+use Symfony\Component\Routing\RouterInterface;
 
 class GoGoCartoJsService
 {
     public function __construct(DocumentManager $dm, TokenStorageInterface $securityContext, 
-                                UrlService $urlService, SessionInterface $session)
+                                RouterInterface $router, SessionInterface $session)
     {
         $this->dm = $dm;
         $this->securityContext = $securityContext;
-        $this->urlService = $urlService;
+        $this->router = $router;
         $this->session = $session;
     }
 
@@ -227,6 +228,6 @@ class GoGoCartoJsService
 
     private function getAbsolutePath($route, $params = [])
     {
-        return $this->urlService->generateUrl($route, $params);
+        return $this->router->generate($route, $params, UrlGeneratorInterface::ABSOLUTE_URL);
     }
 }
diff --git a/src/Services/UrlService.php b/src/Services/UrlService.php
index 03283f95a76f7cb4b822c89d2cc649fd0fbd5001..e7d5523f5450402828faebfb41c7af38a9234e59 100644
--- a/src/Services/UrlService.php
+++ b/src/Services/UrlService.php
@@ -37,9 +37,9 @@ class UrlService
         elseif($domainName instanceof Configuration) {
             $config = $domainName;
             $domainName = $domainName->getDbName();
-        }        
-        
-        if ($config && $config->getCustomDomain()) {
+        }     
+        // When using from a command (without REQUEST) we want to use the customDomain (for emails for example)
+        if ($config && $config->getCustomDomain() && empty($_REQUEST)) {
             $url .= rtrim($config->getCustomDomain(), '/');
         } else {
             $url .= "$this->baseProtocol://";
diff --git a/templates/admin/core_custom/custom-fields/color-picker.html.twig b/templates/admin/core_custom/custom-fields/color-picker.html.twig
index 76e7130b7ed604f28eb7f43115bb665534a749c5..a5bc371be62a2ea3f7f85d5a74b7962bee24d499 100644
--- a/templates/admin/core_custom/custom-fields/color-picker.html.twig
+++ b/templates/admin/core_custom/custom-fields/color-picker.html.twig
@@ -83,7 +83,7 @@
     .sp-preview, .sp-dd { display: none; }
 
     .default-color {
-        height: 34px;
+        height: 30px;
         position: absolute;
         width: 40px;
         border: 1px solid #ccd6de;
diff --git a/templates/admin/core_custom/custom-fields/element-data.html.twig b/templates/admin/core_custom/custom-fields/element-data.html.twig
index cbd76955cfb2a78745be77942ac0fb30b28a5ee3..e13ca461d53bcc60408e76a077b4baf8c2bdb5eb 100644
--- a/templates/admin/core_custom/custom-fields/element-data.html.twig
+++ b/templates/admin/core_custom/custom-fields/element-data.html.twig
@@ -9,15 +9,15 @@
         <th>{{ key }}</th>
         <td>
           {% set type = "text" %}
-          {% set disabled = false %}
+          {% set readonly = false %}
           {% if not is_string(value) and not is_numeric(value) %}
-            {% set disabled = true %}
+            {% set readonly = true %}
             {% set value = value|json_encode %}
           {% endif %}
           {% if key matches '/^osm\:/' %}
-            {% set disabled = true %}
+            {% set readonly = true %}
           {% endif %}
-          <input type="{{ type }}" class="form-control" {{ disabled ? 'disabled="disabled"' : '' }}
+          <input type="{{ type }}" class="form-control" {{ readonly ? 'readonly="readonly"' : '' }}
                     name="{{ 'data[' ~ key ~ ']'}}" value="{{ value }}" />
         </td>
       </tr>