diff --git a/Module.php b/Module.php
index 48f58179fefbe39689715d9fe29246b1e09e0c00..be8d4a9ce948c07eec2a902abf61b66488b39fd5 100644
--- a/Module.php
+++ b/Module.php
@@ -300,18 +300,37 @@ SQL;
             return;
         }
 
+        $resource = $event->getParam('resource');
+
+        // Manage exception for mets and dcterms.
         $prefix = $event->getParam('prefix');
         if ($prefix === 'oai_dcterms') {
             return;
         }
 
+        if ($prefix === 'mets') {
+            $services = $this->getServiceLocator();
+            $settings = $services->get('Omeka\Settings');
+            switch (get_class($resource)) {
+                case \Omeka\Api\Representation\ItemRepresentation::class:
+                default:
+                    $dataFormat = $settings->get('oaipmhrepository_mets_data_item');
+                    break;
+                case \Omeka\Api\Representation\MediaRepresentation::class:
+                    $dataFormat = $settings->get('oaipmhrepository_mets_data_media');
+                    break;
+            }
+            if ($dataFormat === 'dcterms') {
+                return;
+            }
+        }
+
         $map = include __DIR__ . '/data/mappings/dc_generic.php';
         $term = $event->getParam('term');
         if (empty($map[$term])) {
             return;
         }
 
-        $resource = $event->getParam('resource');
         $values = $event->getParam('values');
 
         $single = !is_array($values);
diff --git a/config/module.config.php b/config/module.config.php
index 761df10999a5ae4520fbadb3ff3edaac2b705424..ca47db9cb4ee8e27f2d06ac0a51426a351ea6cb5 100644
--- a/config/module.config.php
+++ b/config/module.config.php
@@ -111,6 +111,8 @@ return [
             'oaipmhrepository_append_identifier_site' => 'absolute_site_url',
             'oaipmhrepository_oai_set_format' => 'basic',
             'oaipmhrepository_generic_dcterms' => true,
+            'oaipmhrepository_mets_data_item' => 'dcterms',
+            'oaipmhrepository_mets_data_media' => 'dcterms',
             'oaipmhrepository_human_interface' => true,
             'oaipmhrepository_redirect_route' => '',
             'oaipmhrepository_list_limit' => 50,
diff --git a/src/Form/ConfigForm.php b/src/Form/ConfigForm.php
index 5a6bb314cf387bb7348e0a13e14cb0b2e71d0a60..6340c984f81f138f6e330aa42a4ed7722b956e5b 100644
--- a/src/Form/ConfigForm.php
+++ b/src/Form/ConfigForm.php
@@ -175,6 +175,36 @@ class ConfigForm extends Form implements TranslatorAwareInterface
             ],
         ]);
 
+        $this->add([
+            'name' => 'oaipmhrepository_mets_data_item',
+            'type' => Element\Select::class,
+            'options' => [
+                'label' => 'Mets: data format for item', // @translate
+                'info' => 'The format of the metadata of item.', // @translate
+                'value_options' => [
+                    'dc' => 'Dublin Core',
+                    'dcterms' => 'Dublin Core terms',
+                    // TODO Use mods inside mets.
+                    // 'mods' => 'Mods',
+                ],
+            ],
+        ]);
+
+        $this->add([
+            'name' => 'oaipmhrepository_mets_data_media',
+            'type' => Element\Select::class,
+            'options' => [
+                'label' => 'Mets: data format for media', // @translate
+                'info' => 'The format of the metadata of media.', // @translate
+                'value_options' => [
+                    'dc' => 'Dublin Core',
+                    'dcterms' => 'Dublin Core terms',
+                    // TODO Use mods inside mets.
+                    // 'mods' => 'Mods',
+                ],
+            ],
+        ]);
+
         $this->add([
             'name' => 'oaipmhrepository_human_interface',
             'type' => Element\Checkbox::class,
diff --git a/src/OaiPmh/Metadata/Mets.php b/src/OaiPmh/Metadata/Mets.php
index a11e238d5e88e7fc9404e0a6a57c6c9c843b79e0..85aa14b9567e15e2c34a728059b5737881f5b1e4 100755
--- a/src/OaiPmh/Metadata/Mets.php
+++ b/src/OaiPmh/Metadata/Mets.php
@@ -30,6 +30,9 @@ class Mets extends AbstractMetadata
     /** XML namespace for unqualified Dublin Core */
     const DC_NAMESPACE_URI = 'http://purl.org/dc/elements/1.1/';
 
+    /** XML namespace for Dublin Core */
+    const DCTERMS_NAMESPACE_URI = 'http://purl.org/dc/terms/';
+
     /**
      * Appends METS metadata.
      *
@@ -53,43 +56,27 @@ class Mets extends AbstractMetadata
         $metadataSection = $this->appendNewElement($mets, 'dmdSec');
         $itemDmdId = 'dmd-' . $item->id();
         $metadataSection->setAttribute('ID', $itemDmdId);
-        $dcWrap = $this->appendNewElement($metadataSection, 'mdWrap');
-        $dcWrap->setAttribute('MDTYPE', 'DC');
-
-        $dcXml = $this->appendNewElement($dcWrap, 'xmlData');
-        $dcXml->setAttribute('xmlns:dc', self::DC_NAMESPACE_URI);
+        $dataWrap = $this->appendNewElement($metadataSection, 'mdWrap');
 
-        $localNames = [
-            'title',
-            'creator',
-            'subject',
-            'description',
-            'publisher',
-            'contributor',
-            'date',
-            'type',
-            'format',
-            'identifier',
-            'source',
-            'language',
-            'relation',
-            'coverage',
-            'rights',
-        ];
-
-        foreach ($localNames as $localName) {
-            $term = 'dcterms:' . $localName;
-            $values = $item->value($term, ['all' => true, 'default' => []]);
-            $values = $this->filterValues($item, $term, $values);
-            foreach ($values as $value) {
-                $this->appendNewElement($dcXml, 'dc:' . $localName, (string) $value);
-            }
+        $itemDataFormat = $this->settings->get('oaipmhrepository_mets_data_item');
+        switch ($itemDataFormat) {
+            case 'dc':
+            default:
+                $this->mdtypeDc($dataWrap, $item);
+                break;
+            case 'dcterms':
+                $this->mdtypeDcterms($dataWrap, $item);
+                break;
+            // case 'mods':
+            //    break;
         }
 
         $fileIds = [];
         if ($this->settings->get('oaipmhrepository_expose_media', false)) {
             $mediaList = $item->media();
             if (count($mediaList)) {
+                $mediaDataFormat = $this->settings->get('oaipmhrepository_mets_data_media');
+
                 $fileSection = $this->appendNewElement($mets, 'fileSec');
                 $fileGroup = $this->appendNewElement($fileSection, 'fileGrp');
                 $fileGroup->setAttribute('USE', 'ORIGINAL');
@@ -97,6 +84,7 @@ class Mets extends AbstractMetadata
                 foreach ($mediaList as $media) {
                     $fileDmdId = 'dmd-file-' . $media->id();
                     $fileId = 'file-' . $media->id();
+                    $fileIds[] = $fileId;
 
                     $fileElement = $this->appendNewElement($fileGroup, 'file');
                     $fileElement->setAttribute('xmlns:dc', self::DC_NAMESPACE_URI);
@@ -116,21 +104,17 @@ class Mets extends AbstractMetadata
                     $fileContentMetadata = $this->appendNewElement($mets, 'dmdSec');
                     $fileContentMetadata->setAttribute('ID', $fileDmdId);
 
-                    $fileDcWrap = $this->appendNewElement($fileContentMetadata, 'mdWrap');
-                    $fileDcWrap->setAttribute('MDTYPE', 'DC');
-
-                    $fileDcXml = $this->appendNewElement($fileDcWrap, 'xmlData');
-                    $fileDcXml->setAttribute('xmlns:dc', self::DC_NAMESPACE_URI);
-
-                    $fileIds[] = $fileId;
-
-                    foreach ($localNames as $localName) {
-                        $term = 'dcterms:' . $localName;
-                        $values = $media->value($term, ['all' => true, 'default' => []]);
-                        $values = $this->filterValues($media, $term, $values);
-                        foreach ($values as $value) {
-                            $this->appendNewElement($fileDcXml, 'dc:' . $localName, (string) $value);
-                        }
+                    $fileDataWrap = $this->appendNewElement($fileContentMetadata, 'mdWrap');
+                    switch ($mediaDataFormat) {
+                        case 'dc':
+                        default:
+                            $this->mdtypeDc($fileDataWrap, $media);
+                            break;
+                        case 'dcterms':
+                            $this->mdtypeDcterms($fileDataWrap, $media);
+                            break;
+                            // case 'mods':
+                            //    break;
                     }
                 }
             }
@@ -159,4 +143,116 @@ class Mets extends AbstractMetadata
     {
         return self::METADATA_NAMESPACE;
     }
+
+    protected function mdtypeDc($dataWrap, $resource)
+    {
+        $dataWrap->setAttribute('MDTYPE', 'DC');
+        $dataXml = $this->appendNewElement($dataWrap, 'xmlData');
+        $dataXml->setAttribute('xmlns:dc', self::DC_NAMESPACE_URI);
+
+        $localNames = [
+            'title',
+            'creator',
+            'subject',
+            'description',
+            'publisher',
+            'contributor',
+            'date',
+            'type',
+            'format',
+            'identifier',
+            'source',
+            'language',
+            'relation',
+            'coverage',
+            'rights',
+        ];
+
+        foreach ($localNames as $localName) {
+            $term = 'dcterms:' . $localName;
+            $values = $resource->value($term, ['all' => true, 'default' => []]);
+            $values = $this->filterValues($resource, $term, $values);
+            foreach ($values as $value) {
+                $this->appendNewElement($dataXml, 'dc:' . $localName, (string) $value);
+            }
+        }
+    }
+
+    protected function mdtypeDcterms($dataWrap, $resource)
+    {
+        $dataWrap->setAttribute('MDTYPE', 'DC');
+        $dataWrap->setAttribute('MDTYPEVERSION', 'DCMI Metadata Terms');
+        $dataXml = $this->appendNewElement($dataWrap, 'xmlData');
+        $dataXml->setAttribute('xmlns:dcterms', self::DCTERMS_NAMESPACE_URI);
+
+        // Each of the 55 Dublin Core terms, in the Omeka order.
+        $localNames = [
+            // Dublin Core Elements.
+            'title',
+            'creator',
+            'subject',
+            'description',
+            'publisher',
+            'contributor',
+            'date',
+            'type',
+            'format',
+            'identifier',
+            'source',
+            'language',
+            'relation',
+            'coverage',
+            'rights',
+            // Dublin Core terms.
+            'audience',
+            'alternative',
+            'tableOfContents',
+            'abstract',
+            'created',
+            'valid',
+            'available',
+            'issued',
+            'modified',
+            'extent',
+            'medium',
+            'isVersionOf',
+            'hasVersion',
+            'isReplacedBy',
+            'replaces',
+            'isRequiredBy',
+            'requires',
+            'isPartOf',
+            'hasPart',
+            'isReferencedBy',
+            'references',
+            'isFormatOf',
+            'hasFormat',
+            'conformsTo',
+            'spatial',
+            'temporal',
+            'mediator',
+            'dateAccepted',
+            'dateCopyrighted',
+            'dateSubmitted',
+            'educationLevel',
+            'accessRights',
+            'bibliographicCitation',
+            'license',
+            'rightsHolder',
+            'provenance',
+            'instructionalMethod',
+            'accrualMethod',
+            'accrualPeriodicity',
+            'accrualPolicy',
+        ];
+
+        foreach ($localNames as $localName) {
+            $term = 'dcterms:' . $localName;
+            $values = $resource->value($term, ['all' => true, 'default' => []]);
+            $values = $this->filterValues($resource, $term, $values);
+            foreach ($values as $value) {
+                $this->appendNewElement($dataXml, $term, (string) $value);
+            }
+        }
+    }
 }