diff --git a/lib/classes/module/console/fieldsDelete.class.php b/lib/classes/module/console/fieldsDelete.class.php
new file mode 100644
index 0000000000..6d8693af53
--- /dev/null
+++ b/lib/classes/module/console/fieldsDelete.class.php
@@ -0,0 +1,97 @@
+setDescription('Delete a documentation field from a Databox');
+
+ $this->addOption('sbas_id', 's', InputOption::VALUE_REQUIRED, 'Databox sbas_id');
+
+ $this->addOption('meta_struct_id', 'm', InputOption::VALUE_REQUIRED, 'Databox meta structure Id');
+
+ return $this;
+ }
+
+ public function execute(InputInterface $input, OutputInterface $output)
+ {
+
+ if (!$input->getOption('sbas_id'))
+ throw new \Exception('Missing argument sbas_id');
+
+ if (!$input->getOption('meta_struct_id'))
+ throw new \Exception('Missing argument meta_struct_id');
+
+ try
+ {
+ $databox = \databox::get_instance((int) $input->getOption('sbas_id'));
+ }
+ catch (\Exception $e)
+ {
+ $output->writeln("Invalid databox id ");
+
+ return 1;
+ }
+
+ try
+ {
+ $field = $databox->get_meta_structure()->get_element((int) $input->getOption('meta_struct_id'));
+ }
+ catch (\Exception $e)
+ {
+ $output->writeln("Invalid meta struct id ");
+
+ return 1;
+ }
+
+
+ $dialog = $this->getHelperSet()->get('dialog');
+ $continue = mb_strtolower(
+ $dialog->ask(
+ $output
+ , "About to delete " . $field->get_name() . " (y/N)"
+ , 'n'
+ )
+ );
+
+ if($continue != 'y')
+ {
+ $output->writeln("Request canceled by user");
+ return 1;
+ }
+
+ $output->writeln("Deleting ... ");
+
+ $field->delete();
+
+ $output->writeln("Done with success !");
+
+ return 0;
+ }
+
+}
diff --git a/lib/classes/module/console/fieldsList.class.php b/lib/classes/module/console/fieldsList.class.php
new file mode 100644
index 0000000000..ad9bb497d8
--- /dev/null
+++ b/lib/classes/module/console/fieldsList.class.php
@@ -0,0 +1,70 @@
+setDescription('List all databox fields');
+
+ return $this;
+ }
+
+ public function execute(InputInterface $input, OutputInterface $output)
+ {
+
+ $appbox = \appbox::get_instance();
+
+ foreach ($appbox->get_databoxes() as $databox)
+ {
+ /* @var $databox \databox */
+ $output->writeln(
+ sprintf(
+ "\n ---------------- \nOn databox %s (sbas_id %d) :\n"
+ , $databox->get_viewname()
+ , $databox->get_sbas_id()
+ )
+ );
+
+ foreach ($databox->get_meta_structure()->get_elements() as $field)
+ {
+ $output->writeln(
+ sprintf(
+ " %2d - %s (%s) %s"
+ , $field->get_id()
+ , $field->get_name()
+ , $field->get_type()
+ , ($field->is_multi() ? 'multi' : '')
+ )
+ );
+ }
+ }
+
+ return 0;
+ }
+
+}
diff --git a/lib/classes/module/console/fieldsMerge.class.php b/lib/classes/module/console/fieldsMerge.class.php
new file mode 100644
index 0000000000..d3042a4732
--- /dev/null
+++ b/lib/classes/module/console/fieldsMerge.class.php
@@ -0,0 +1,284 @@
+setDescription('Merge databox structure fields');
+
+ $this->addOption(
+ 'source'
+ , 'f'
+ , InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY
+ , 'Metadata structure ids for source'
+ , array()
+ );
+
+ $this->addOption(
+ 'destination'
+ , 'd'
+ , InputOption::VALUE_REQUIRED
+ , 'Metadata structure id destination'
+ );
+
+ $this->addOption(
+ 'sbas_id'
+ , 's'
+ , InputOption::VALUE_REQUIRED
+ , 'Databox sbas_id'
+ );
+
+ $this->addOption(
+ 'separator'
+ , ''
+ , InputOption::VALUE_OPTIONAL
+ , 'Separator for concatenation (if destination is monovalued)'
+ , ';'
+ );
+
+ return $this;
+ }
+
+ public function execute(InputInterface $input, OutputInterface $output)
+ {
+ $output->writeln("");
+
+ if (!$input->getOption('sbas_id'))
+ throw new \Exception('Missing argument sbas_id');
+
+ try
+ {
+ $databox = \databox::get_instance((int) $input->getOption('sbas_id'));
+ }
+ catch (\Exception $e)
+ {
+ $output->writeln("Invalid databox id ");
+
+ return 1;
+ }
+
+ $sources = array();
+
+ foreach ($input->getOption('source') as $source_id)
+ {
+ $sources[] = $databox->get_meta_structure()->get_element($source_id);
+ }
+
+ if (count($sources) === 0)
+ throw new \Exception('No sources to proceed');
+
+ if (!$input->getOption('destination'))
+ throw new \Exception('Missing argument destination');
+
+ $separator = ' ' . $input->getOption('separator') . ' ';
+
+ $destination = $databox->get_meta_structure()->get_element($input->getOption('destination'));
+
+ $types = $multis = array();
+
+ foreach ($sources as $source)
+ {
+ array_push($types, $source->get_type());
+ array_push($multis, $source->is_multi());
+ }
+
+ $types = array_unique($types);
+ $multis = array_unique($multis);
+
+ if (count(array_unique($types)) > 1)
+ {
+ $output->writeln(
+ sprintf("Warning, trying to merge inconsistent types : %s\n"
+ , implode(', ', $types)
+ )
+ );
+ }
+
+ if (count(array_unique($multis)) > 1)
+ {
+ $output->writeln(
+ sprintf(
+ "Warning, trying to merge mono and multi values fields\n"
+ )
+ );
+ }
+
+ $field_names = array();
+ foreach ($sources as $source)
+ {
+ $field_names[] = $source->get_name();
+ }
+
+ if (count($multis) == 1)
+ {
+ if ($multis[0] === false && !$destination->is_multi())
+ {
+ $output->writeln(
+ sprintf(
+ "You are going to merge mono valued fields in a "
+ . "monovalued field, fields will be "
+ . "concatenated in the following order : %s"
+ , implode($separator, $field_names)
+ )
+ );
+ $this->displayHelpConcatenation($output);
+ }
+ elseif ($multis[0] === true && !$destination->is_multi())
+ {
+ $output->writeln(
+ sprintf(
+ "You are going to merge multi valued fields in a "
+ . "monovalued field, fields will be "
+ . "concatenated in the following order : %s"
+ , implode(' ', $field_names)
+ )
+ );
+ $this->displayHelpConcatenation($output);
+ }
+ elseif ($multis[0] === false && $destination->is_multi())
+ {
+ $output->writeln(
+ sprintf(
+ "You are going to merge mono valued fields in a "
+ . "multivalued field"
+ )
+ );
+ }
+ elseif ($multis[0] === true && $destination->is_multi())
+ {
+ $output->writeln(
+ sprintf(
+ "You are going to merge multi valued fields in a "
+ . "multivalued field"
+ )
+ );
+ }
+ }
+ elseif ($destination->is_multi())
+ {
+ $output->writeln(
+ sprintf(
+ "You are going to merge mixed valued fields in a "
+ . "multivalued field"
+ )
+ );
+ }
+ else
+ {
+ $output->writeln(
+ sprintf(
+ "You are going to merge mixed valued fields in a "
+ . "monovalued field, fields will be "
+ . "concatenated in the following order : %s"
+ , implode($separator, $field_names)
+ )
+ );
+ $this->displayHelpConcatenation($output);
+ }
+
+ $start = 0;
+ $quantity = 100;
+
+ do
+ {
+ $sql = 'SELECT record_id FROM record
+ ORDER BY record_id LIMIT ' . $start . ', ' . $quantity;
+ $stmt = $databox->get_connection()->prepare($sql);
+ $stmt->execute();
+ $results = $stmt->fetchAll(PDO::FETCH_ASSOC);
+ $stmt->closeCursor();
+
+ foreach ($results as $row)
+ {
+ $record = $databox->get_record($row['record_id']);
+
+ $datas = array();
+
+ foreach ($sources as $source)
+ {
+ try
+ {
+ $value = $record->get_caption()->get_field($source->get_name())->get_value();
+ }
+ catch (\Exception $e)
+ {
+ $value = array();
+ }
+ if (!is_array($value))
+ {
+ $value = array($value);
+ }
+
+ $datas = array_merge($datas, $value);
+ }
+
+ $datas = array_unique($datas);
+
+ if (!$destination->is_multi())
+ {
+ $datas = array(implode($separator, $datas));
+ }
+
+ try
+ {
+ $record->get_caption()->get_field($destination->get_name())->set_value($datas);
+ }
+ catch (\Exception $e)
+ {
+ $record->set_metadatas(
+ array(
+ array(
+ 'meta_struct_id' => $destination->get_id()
+ , 'meta_id' => null
+ , 'value' => $datas
+ )
+ )
+ , true
+ );
+ }
+ unset($record);
+ }
+
+ $start += $quantity;
+ }
+ while (count($results) > 0);
+
+ return 0;
+ }
+
+ protected function displayHelpConcatenation(OutputInterface $output)
+ {
+
+ $output->writeln("\nYou can choose the concatenation order in the "
+ . "commandline (first option is first value) and set a separator "
+ . "with the --separator option)");
+
+ return $this;
+ }
+
+}
diff --git a/lib/classes/module/console/fieldsRename.class.php b/lib/classes/module/console/fieldsRename.class.php
new file mode 100644
index 0000000000..992dd7ae10
--- /dev/null
+++ b/lib/classes/module/console/fieldsRename.class.php
@@ -0,0 +1,105 @@
+setDescription('Rename a documentation field from a Databox');
+
+ $this->addOption('sbas_id', 's', InputOption::VALUE_REQUIRED, 'Databox sbas_id');
+
+ $this->addOption('meta_struct_id', 'm', InputOption::VALUE_REQUIRED, 'Databox meta structure Id');
+
+ $this->addOption('name', 'n', InputOption::VALUE_REQUIRED, 'The new name');
+
+ return $this;
+ }
+
+ public function execute(InputInterface $input, OutputInterface $output)
+ {
+
+ if (!$input->getOption('sbas_id'))
+ throw new \Exception('Missing argument sbas_id');
+
+ if (!$input->getOption('meta_struct_id'))
+ throw new \Exception('Missing argument meta_struct_id');
+
+ if (!$input->getOption('name'))
+ throw new \Exception('Missing argument name');
+
+ $new_name = $input->getOption('name');
+
+ try
+ {
+ $databox = \databox::get_instance((int) $input->getOption('sbas_id'));
+ }
+ catch (\Exception $e)
+ {
+ $output->writeln("Invalid databox id ");
+
+ return 1;
+ }
+
+ try
+ {
+ $field = $databox->get_meta_structure()->get_element((int) $input->getArgument('meta_struct_id'));
+ }
+ catch (\Exception $e)
+ {
+ $output->writeln("Invalid meta struct id ");
+
+ return 1;
+ }
+
+
+ $dialog = $this->getHelperSet()->get('dialog');
+ $continue = mb_strtolower(
+ $dialog->ask(
+ $output
+ , "About to rename " . $field->get_name() . " into ".$new_name." (y/N)"
+ , 'n'
+ )
+ );
+
+ if($continue != 'y')
+ {
+ $output->writeln("Request canceled by user");
+ return 1;
+ }
+
+ $output->writeln("Renaming ... ");
+
+ $field->set_name($new_name);
+ $field->save();
+
+ $output->writeln("Done with success !");
+
+ return 0;
+ }
+
+}