diff --git a/README.md b/README.md
index c06fac98a717f78e3507fd26bfc14b178220e938..d3021ab6536d76001cba6e7f18d74abd878a3772 100644
--- a/README.md
+++ b/README.md
@@ -162,13 +162,20 @@ by harvesters or other tools and because the RRCHNM itself removed the [schema]
 from the last site.
 
 **NOTE**: Because of its limited support by harvesters, the format is not
-implemented.
+implemented in Omeka S.
 
 ### Other formats
 
 Other formats can be added or replace an existing one via a key in the config
 `['oaipmhrepository']['metadata_formats']`.
 
+### Customization
+
+The output can be customized via the filter `oaipmhrepository.values`, that is
+triggered for each term. So it is possible to remove, to update or to append
+some values, or to convert some properties from other vocabularies into the
+standard formats.
+
 
 Warning
 -------
diff --git a/src/OaiPmh/Metadata/AbstractMetadata.php b/src/OaiPmh/Metadata/AbstractMetadata.php
index fc1ccd034977befe7dae56b6543a754dd22bea7e..d1428c5d96d422d255b55e0a82f254e7e623eaa1 100644
--- a/src/OaiPmh/Metadata/AbstractMetadata.php
+++ b/src/OaiPmh/Metadata/AbstractMetadata.php
@@ -16,7 +16,6 @@ use Omeka\Api\Representation\AbstractResourceEntityRepresentation;
 use Omeka\Api\Representation\ItemRepresentation;
 use Omeka\Api\Representation\ValueRepresentation;
 use Omeka\Settings\SettingsInterface;
-use Zend\EventManager\Event;
 use Zend\EventManager\EventManagerAwareInterface;
 use Zend\EventManager\EventManagerAwareTrait;
 
@@ -159,18 +158,16 @@ abstract class AbstractMetadata
         $term,
         $values
     ) {
-        /** @var \Zend\EventManager\EventManager $eventManager */
-        $eventManager = $this->getEventManager();
-        /** @var \ArrayObject $args */
-        $args = $eventManager->prepareArgs([]);
-        $args['repository'] = self::class;
-        $args['resource'] = $resource;
+        $args = [];
+        $args['prefix'] = $this->getMetadataPrefix();
         $args['term'] = $term;
+        $args['resource'] = $resource;
         $args['values'] = $values;
 
-        $event = new Event('oaipmhrepository.values', $this, $args);
-        $eventManager->triggerEvent($event);
-
+        /** @var \ArrayObject $args */
+        $eventManager = $this->getEventManager();
+        $args = $eventManager->prepareArgs($args);
+        $eventManager->trigger('oaipmhrepository.values', $this, $args);
         return $args['values'];
     }
 
diff --git a/src/OaiPmh/Metadata/CdwaLite.php b/src/OaiPmh/Metadata/CdwaLite.php
index 8b74c7c749a43e9f95ff3867541a3f83c1af68f4..035070a637aab7ae929ed3d2c677ae0908d05d2c 100644
--- a/src/OaiPmh/Metadata/CdwaLite.php
+++ b/src/OaiPmh/Metadata/CdwaLite.php
@@ -61,6 +61,7 @@ class CdwaLite extends AbstractMetadata
          * Required.  Fill with 'Unknown' if omitted.
          */
         $types = $item->value('dcterms:type', ['all' => true, 'default' => []]);
+        $types = $this->filterValues($item, 'dcterms:type', $types);
         $objectWorkTypeWrap = $this->appendNewElement($descriptive, 'cdwalite:objectWorkTypeWrap');
         if (empty($types)) {
             $types[] = 'Unknown';
@@ -74,6 +75,7 @@ class CdwaLite extends AbstractMetadata
          * Required.  Fill with 'Unknown' if omitted.
          */
         $titles = $item->value('dcterms:title', ['all' => true, 'default' => []]);
+        $titles = $this->filterValues($item, 'dcterms:title', $titles);
         $titleWrap = $this->appendNewElement($descriptive, 'cdwalite:titleWrap');
 
         foreach ($titles as $title) {
@@ -86,6 +88,7 @@ class CdwaLite extends AbstractMetadata
          * Non-repeatable, implode for inclusion of many creators.
          */
         $creators = $item->value('dcterms:creator', ['all' => true, 'default' => []]);
+        $creators = $this->filterValues($item, 'dcterms:creator', $creators);
 
         $creatorTexts = [];
         foreach ($creators as $creator) {
@@ -121,6 +124,7 @@ class CdwaLite extends AbstractMetadata
          * Non-repeatable, include only first date.
          */
         $date = $item->value('dcterms:date');
+        $date = $this->filterValues($item, 'dcterms:date', $date);
         $dateText = $date ? (string) $date : 'Unknown';
         $this->appendNewElement($descriptive, 'cdwalite:displayCreationDate', $dateText);
 
@@ -130,6 +134,7 @@ class CdwaLite extends AbstractMetadata
          */
         $indexingDatesWrap = $this->appendNewElement($descriptive, 'cdwalite:indexingDatesWrap');
         $dates = $item->value('dcterms:date', ['all' => true, 'default' => []]);
+        $dates = $this->filterValues($item, 'dcterms:date', $dates);
         foreach ($dates as $date) {
             $indexingDatesSet = $this->appendNewElement($indexingDatesWrap, 'cdwalite:indexingDatesSet');
             $this->appendNewElement($indexingDatesSet, 'cdwalite:earliestDate', (string) $date);
@@ -147,6 +152,7 @@ class CdwaLite extends AbstractMetadata
          * Not required.
          */
         $subjects = $item->value('dcterms:subject', ['all' => true, 'default' => []]);
+        $subjects = $this->filterValues($item, 'dcterms:subject', $subjects);
         $classWrap = $this->appendNewElement($descriptive, 'cdwalite:classWrap');
         foreach ($subjects as $subject) {
             $this->appendNewElement($classWrap, 'cdwalite:classification', (string) $subject);
@@ -156,6 +162,7 @@ class CdwaLite extends AbstractMetadata
          * Not required.
          */
         $descriptions = $item->value('dcterms:description', ['all' => true, 'default' => []]);
+        $descriptions = $this->filterValues($item, 'dcterms:description', $descriptions);
         if (!empty($descriptions)) {
             $descriptiveNoteWrap = $this->appendNewElement($descriptive, 'cdwalite:descriptiveNoteWrap');
             foreach ($descriptions as $description) {
@@ -175,6 +182,7 @@ class CdwaLite extends AbstractMetadata
          * Not required.
          */
         $rights = $item->value('dcterms:rights', ['all' => true, 'default' => []]);
+        $rights = $this->filterValues($item, 'dcterms:rights', $rights);
         foreach ($rights as $right) {
             $this->appendNewElement($administrative, 'cdwalite:rightsWork', (string) $right);
         }
diff --git a/src/OaiPmh/Metadata/Mets.php b/src/OaiPmh/Metadata/Mets.php
index bb51cf5b91f10d534c89c14e4e24e07a2cdcd7d9..8989bff2a683df87e961a739245c028b81530679 100755
--- a/src/OaiPmh/Metadata/Mets.php
+++ b/src/OaiPmh/Metadata/Mets.php
@@ -66,7 +66,9 @@ class Mets extends AbstractMetadata
         ];
 
         foreach ($dcElementNames as $elementName) {
-            $values = $item->value("dcterms:$elementName", ['all' => true, 'default' => []]);
+            $term = 'dcterms:' . $elementName;
+            $values = $item->value($term, ['all' => true, 'default' => []]);
+            $values = $this->filterValues($item, $term, $values);
             foreach ($values as $value) {
                 $this->appendNewElement($dcXml, "dc:$elementName", (string) $value);
             }
@@ -111,9 +113,11 @@ class Mets extends AbstractMetadata
                     $fileIds[] = $fileId;
 
                     foreach ($dcElementNames as $elementName) {
-                        $dcElements = $media->value("dcterms:$elementName", ['all' => true, 'default' => []]);
-                        foreach ($dcElements as $value) {
-                            $this->appendNewElement($fileDcXml, "dc:$elementName", (string) $value);
+                        $term = 'dcterms:' . $elementName;
+                        $values = $media->value($term, ['all' => true, 'default' => []]);
+                        $values = $this->filterValues($media, $term, $values);
+                        foreach ($values as $value) {
+                            $this->appendNewElement($fileDcXml, 'dc:' . $elementName, (string) $value);
                         }
                     }
                 }
diff --git a/src/OaiPmh/Metadata/Mods.php b/src/OaiPmh/Metadata/Mods.php
index 46bccaed25e4e1154ef6a60d67f4f2022ceb0337..f89e653f7240e38a8b4214258cd0f77c81a0ae63 100644
--- a/src/OaiPmh/Metadata/Mods.php
+++ b/src/OaiPmh/Metadata/Mods.php
@@ -49,12 +49,14 @@ class Mods extends AbstractMetadata
             . ' ' . self::METADATA_SCHEMA);
 
         $titles = $item->value('dcterms:title', ['all' => true, 'default' => []]);
+        $titles = $this->filterValues($item, 'dcterms:title', $titles);
         foreach ($titles as $title) {
             $titleInfo = $this->appendNewElement($mods, 'titleInfo');
             $this->appendNewElement($titleInfo, 'title', (string) $title);
         }
 
         $creators = $item->value('dcterms:creator', ['all' => true, 'default' => []]);
+        $creators = $this->filterValues($item, 'dcterms:creator', $creators);
         foreach ($creators as $creator) {
             $name = $this->appendNewElement($mods, 'name');
             $this->appendNewElement($name, 'namePart', (string) $creator);
@@ -64,6 +66,7 @@ class Mods extends AbstractMetadata
         }
 
         $contributors = $item->value('dcterms:contributor', ['all' => true, 'default' => []]);
+        $contributors = $this->filterValues($item, 'dcterms:contributor', $contributors);
         foreach ($contributors as $contributor) {
             $name = $this->appendNewElement($mods, 'name');
             $this->appendNewElement($name, 'namePart', (string) $contributor);
@@ -73,23 +76,27 @@ class Mods extends AbstractMetadata
         }
 
         $subjects = $item->value('dcterms:subject', ['all' => true, 'default' => []]);
+        $subjects = $this->filterValues($item, 'dcterms:subject', $subjects);
         foreach ($subjects as $subject) {
             $subjectTag = $this->appendNewElement($mods, 'subject');
             $this->appendNewElement($subjectTag, 'topic', (string) $subject);
         }
 
         $descriptions = $item->value('dcterms:description', ['all' => true, 'default' => []]);
+        $descriptions = $this->filterValues($item, 'dcterms:description', $descriptions);
         foreach ($descriptions as $description) {
             $this->appendNewElement($mods, 'note', (string) $description);
         }
 
         $formats = $item->value('dcterms:format', ['all' => true, 'default' => []]);
+        $formats = $this->filterValues($item, 'dcterms:format', $formats);
         foreach ($formats as $format) {
             $physicalDescription = $this->appendNewElement($mods, 'physicalDescription');
             $this->appendNewElement($physicalDescription, 'form', (string) $format);
         }
 
         $languages = $item->value('dcterms:language', ['all' => true, 'default' => []]);
+        $languages = $this->filterValues($item, 'dcterms:language', $languages);
         foreach ($languages as $language) {
             $languageElement = $this->appendNewElement($mods, 'language');
             $languageTerm = $this->appendNewElement($languageElement, 'languageTerm', (string) $language);
@@ -97,16 +104,19 @@ class Mods extends AbstractMetadata
         }
 
         $rights = $item->value('dcterms:rights', ['all' => true, 'default' => []]);
+        $rights = $this->filterValues($item, 'dcterms:rights', $rights);
         foreach ($rights as $right) {
             $this->appendNewElement($mods, 'accessCondition', (string) $right);
         }
 
         $types = $item->value('dcterms:type', ['all' => true, 'default' => []]);
+        $types = $this->filterValues($item, 'dcterms:type', $types);
         foreach ($types as $type) {
             $this->appendNewElement($mods, 'genre', (string) $type);
         }
 
         $identifiers = $item->value('dcterms:identifier', ['all' => true, 'default' => []]);
+        $identifiers = $this->filterValues($item, 'dcterms:identifier', $identifiers);
         foreach ($identifiers as $identifier) {
             $text = (string) $identifier;
             $idElement = $this->appendNewElement($mods, 'identifier', $text);
@@ -118,11 +128,13 @@ class Mods extends AbstractMetadata
         }
 
         $sources = $item->value('dcterms:source', ['all' => true, 'default' => []]);
+        $sources = $this->filterValues($item, 'dcterms:source', $sources);
         foreach ($sources as $source) {
             $this->_addRelatedItem($mods, (string) $source, true);
         }
 
         $relations = $item->value('dcterms:relation', ['all' => true, 'default' => []]);
+        $relations = $this->filterValues($item, 'dcterms:relation', $relations);
         foreach ($relations as $relation) {
             $this->_addRelatedItem($mods, (string) $relation);
         }
@@ -146,7 +158,9 @@ class Mods extends AbstractMetadata
         $url->setAttribute('usage', 'primary display');
 
         $publishers = $item->value('dcterms:publisher', ['all' => true, 'default' => []]);
+        $publishers = $this->filterValues($item, 'dcterms:publishers', $publishers);
         $dates = $item->value('dcterms:date', ['all' => true, 'default' => []]);
+        $dates = $this->filterValues($item, 'dcterms:date', $dates);
 
         // Empty originInfo sections are illegal
         if (count($publishers) + count($dates) > 0) {
diff --git a/src/OaiPmh/Metadata/OaiDc.php b/src/OaiPmh/Metadata/OaiDc.php
index 1a8299842bdaeb28c55fbcf70a255b00de90b1f6..6ef13853826b0f61b2b8520504b8618136693071 100644
--- a/src/OaiPmh/Metadata/OaiDc.php
+++ b/src/OaiPmh/Metadata/OaiDc.php
@@ -63,7 +63,9 @@ class OaiDc extends AbstractMetadata
          * compliant per-node declarations.
          */
         foreach ($dcElementNames as $elementName) {
-            $values = $item->value("dcterms:$elementName", ['all' => true, 'default' => []]);
+            $term = 'dcterms:' . $elementName;
+            $values = $item->value($term, ['all' => true, 'default' => []]);
+            $values = $this->filterValues($item, $term, $values);
             foreach ($values as $value) {
                 $this->appendNewElement($oai_dc, "dc:$elementName", (string) $value);
             }
diff --git a/src/Service/OaiPmh/Metadata/CdwaLiteFactory.php b/src/Service/OaiPmh/Metadata/CdwaLiteFactory.php
index c3e3f77d986e9f1fc1b4e7a19675048a598816a4..b5a553e4a9ef71c816d1864268ed2d39a1a83bf3 100644
--- a/src/Service/OaiPmh/Metadata/CdwaLiteFactory.php
+++ b/src/Service/OaiPmh/Metadata/CdwaLiteFactory.php
@@ -19,6 +19,7 @@ class CdwaLiteFactory implements FactoryInterface
         $oaiSetManager = $services->get('OaiPmhRepository\OaiPmh\OaiSetManager');
         $oaiSet = $oaiSetManager->get($settings->get('oaipmhrepository_oai_set_format', 'base'));
         $metadataFormat = new CdwaLite();
+        $metadataFormat->setEventManager($services->get('EventManager'));
         $metadataFormat->setSettings($settings);
         $metadataFormat->setOaiSet($oaiSet);
         $isGlobalRepository = !$services->get('ControllerPluginManager')
diff --git a/src/Service/OaiPmh/Metadata/MetsFactory.php b/src/Service/OaiPmh/Metadata/MetsFactory.php
index e041c48bc93adf4a18c0434d73f5d58545c1fd5b..1844aaf1867d96b1cfb2e17eec5fe13fc7bc35c3 100644
--- a/src/Service/OaiPmh/Metadata/MetsFactory.php
+++ b/src/Service/OaiPmh/Metadata/MetsFactory.php
@@ -19,6 +19,7 @@ class MetsFactory implements FactoryInterface
         $oaiSetManager = $services->get('OaiPmhRepository\OaiPmh\OaiSetManager');
         $oaiSet = $oaiSetManager->get($settings->get('oaipmhrepository_oai_set_format', 'base'));
         $metadataFormat = new Mets();
+        $metadataFormat->setEventManager($services->get('EventManager'));
         $metadataFormat->setSettings($settings);
         $metadataFormat->setOaiSet($oaiSet);
         $isGlobalRepository = !$services->get('ControllerPluginManager')
diff --git a/src/Service/OaiPmh/Metadata/ModsFactory.php b/src/Service/OaiPmh/Metadata/ModsFactory.php
index 9797ad6024978c259532c253c97cc5f32b0f8375..a9882b51f80bdd5b64fa5cbe8d3b51468d1f2c1c 100644
--- a/src/Service/OaiPmh/Metadata/ModsFactory.php
+++ b/src/Service/OaiPmh/Metadata/ModsFactory.php
@@ -19,6 +19,7 @@ class ModsFactory implements FactoryInterface
         $oaiSetManager = $services->get('OaiPmhRepository\OaiPmh\OaiSetManager');
         $oaiSet = $oaiSetManager->get($settings->get('oaipmhrepository_oai_set_format', 'base'));
         $metadataFormat = new Mods();
+        $metadataFormat->setEventManager($services->get('EventManager'));
         $metadataFormat->setSettings($settings);
         $metadataFormat->setOaiSet($oaiSet);
         $isGlobalRepository = !$services->get('ControllerPluginManager')
diff --git a/src/Service/OaiPmh/Metadata/OaiDcFactory.php b/src/Service/OaiPmh/Metadata/OaiDcFactory.php
index 12e9b6f9ac659fbb0afffebc9fb5976502f00a86..a0f719f34dccc2d74ba295b07392f5f875fd5de9 100644
--- a/src/Service/OaiPmh/Metadata/OaiDcFactory.php
+++ b/src/Service/OaiPmh/Metadata/OaiDcFactory.php
@@ -19,6 +19,7 @@ class OaiDcFactory implements FactoryInterface
         $oaiSetManager = $services->get('OaiPmhRepository\OaiPmh\OaiSetManager');
         $oaiSet = $oaiSetManager->get($settings->get('oaipmhrepository_oai_set_format', 'base'));
         $metadataFormat = new OaiDc();
+        $metadataFormat->setEventManager($services->get('EventManager'));
         $metadataFormat->setSettings($settings);
         $metadataFormat->setOaiSet($oaiSet);
         $isGlobalRepository = !$services->get('ControllerPluginManager')