diff --git a/core/modules/forum/config/rdf.mapping.node.forum.yml b/core/modules/forum/config/rdf.mapping.node.forum.yml
index ea86bc5..9ea4f45 100644
--- a/core/modules/forum/config/rdf.mapping.node.forum.yml
+++ b/core/modules/forum/config/rdf.mapping.node.forum.yml
@@ -2,27 +2,46 @@ id: node.forum
 targetEntityType: node
 bundle: forum
 types:
-  - 'schema:Discussion'
+  - local_name: 'Discussion'
+    prefix: 'schema'
+    prefix_module: 'rdf'
 fieldMappings:
   title:
     properties:
-      - 'schema:name'
+      - local_name: 'name'
+        prefix: 'schema'
+        prefix_module: 'rdf'
   created:
     properties:
-      - 'schema:dateCreated'
-    datatype_callback: 'date_iso8601'
+      - local_name: 'dateCreated'
+        prefix: 'schema'
+        prefix_module: 'rdf'
+    datatype_callback:
+      method: 'date_iso8601'
   changed:
     properties:
-      - 'schema:dateModified'
-    datatype_callback: 'date_iso8601'
+      - local_name: 'dateModified'
+        prefix: 'schema'
+        prefix_module: 'rdf'
+    datatype_callback:
+      method: 'date_iso8601'
   body:
     properties:
-      - 'schema:text'
+      - local_name: 'text'
+        prefix: 'schema'
+        prefix_module: 'rdf'
   uid:
     properties:
-      - 'schema:author'
+      - local_name: 'author'
+        prefix: 'schema'
+        prefix_module: 'rdf'
     mapping_type: 'rel'
   comment_count:
     properties:
-      - 'schema:interactionCount'
-    datatype_callback: 'Drupal\rdf\SchemaOrgDataConverter::interactionCount'
+      - local_name: 'interactionCount'
+        prefix: 'schema'
+        prefix_module: 'rdf'
+    datatype_callback:
+      method: 'Drupal\rdf\SchemaOrgDataConverter::interactionCount'
+      arguments:
+        interaction_type: 'UserComments'
diff --git a/core/modules/forum/config/rdf.mapping.taxonomy_term.forums.yml b/core/modules/forum/config/rdf.mapping.taxonomy_term.forums.yml
index aaaf536..9aa55ee 100644
--- a/core/modules/forum/config/rdf.mapping.taxonomy_term.forums.yml
+++ b/core/modules/forum/config/rdf.mapping.taxonomy_term.forums.yml
@@ -2,12 +2,20 @@ id: taxonomy_term.forums
 targetEntityType: taxonomy_term
 bundle: forums
 types:
-  - 'sioc:Container'
-  - 'sioc:Forum'
+  - local_name: 'Container'
+    prefix: 'sioc'
+    prefix_module: 'rdf'
+  - local_name: 'Forum'
+    prefix: 'sioc'
+    prefix_module: 'rdf'
 fieldMappings:
   name:
     properties:
-      - 'schema:name'
+      - local_name: 'name'
+        prefix: 'schema'
+        prefix_module: 'rdf'
   description:
     properties:
-      - 'schema:description'
+      - local_name: 'description'
+        prefix: 'schema'
+        prefix_module: 'rdf'
diff --git a/core/modules/rdf/config/rdf.namespace.rdf.content.yml b/core/modules/rdf/config/rdf.namespace.rdf.content.yml
new file mode 100644
index 0000000..15de45e
--- /dev/null
+++ b/core/modules/rdf/config/rdf.namespace.rdf.content.yml
@@ -0,0 +1,5 @@
+nsid: rdf.content
+namespace_uri: 'http://purl.org/rss/1.0/modules/content/'
+prefix: content
+module: rdf
+langcode: und
diff --git a/core/modules/rdf/config/rdf.namespace.rdf.dc.yml b/core/modules/rdf/config/rdf.namespace.rdf.dc.yml
new file mode 100644
index 0000000..e059421
--- /dev/null
+++ b/core/modules/rdf/config/rdf.namespace.rdf.dc.yml
@@ -0,0 +1,5 @@
+nsid: rdf.dc
+namespace_uri: 'http://purl.org/dc/terms/'
+prefix: dc
+module: rdf
+langcode: und
diff --git a/core/modules/rdf/config/rdf.namespace.rdf.foaf.yml b/core/modules/rdf/config/rdf.namespace.rdf.foaf.yml
new file mode 100644
index 0000000..8e19b25
--- /dev/null
+++ b/core/modules/rdf/config/rdf.namespace.rdf.foaf.yml
@@ -0,0 +1,5 @@
+nsid: rdf.foaf
+namespace_uri: 'http://xmlns.com/foaf/0.1/'
+prefix: foaf
+module: rdf
+langcode: und
diff --git a/core/modules/rdf/config/rdf.namespace.rdf.og.yml b/core/modules/rdf/config/rdf.namespace.rdf.og.yml
new file mode 100644
index 0000000..8c2c289
--- /dev/null
+++ b/core/modules/rdf/config/rdf.namespace.rdf.og.yml
@@ -0,0 +1,5 @@
+nsid: rdf.og
+namespace_uri: 'http://ogp.me/ns#'
+prefix: og
+module: rdf
+langcode: und
diff --git a/core/modules/rdf/config/rdf.namespace.rdf.rdfs.yml b/core/modules/rdf/config/rdf.namespace.rdf.rdfs.yml
new file mode 100644
index 0000000..4b8d31b
--- /dev/null
+++ b/core/modules/rdf/config/rdf.namespace.rdf.rdfs.yml
@@ -0,0 +1,5 @@
+nsid: rdf.rdfs
+namespace_uri: 'http://www.w3.org/2000/01/rdf-schema#'
+prefix: rdfs
+module: rdf
+langcode: und
diff --git a/core/modules/rdf/config/rdf.namespace.rdf.schema.yml b/core/modules/rdf/config/rdf.namespace.rdf.schema.yml
new file mode 100644
index 0000000..3caa3d2
--- /dev/null
+++ b/core/modules/rdf/config/rdf.namespace.rdf.schema.yml
@@ -0,0 +1,5 @@
+nsid: rdf.schema
+namespace_uri: 'http://schema.org/'
+prefix: schema
+module: rdf
+langcode: und
diff --git a/core/modules/rdf/config/rdf.namespace.rdf.sioc.yml b/core/modules/rdf/config/rdf.namespace.rdf.sioc.yml
new file mode 100644
index 0000000..9b22f97
--- /dev/null
+++ b/core/modules/rdf/config/rdf.namespace.rdf.sioc.yml
@@ -0,0 +1,5 @@
+nsid: rdf.sioc
+namespace_uri: 'http://rdfs.org/sioc/ns#'
+prefix: sioc
+module: rdf
+langcode: und
diff --git a/core/modules/rdf/config/rdf.namespace.rdf.sioct.yml b/core/modules/rdf/config/rdf.namespace.rdf.sioct.yml
new file mode 100644
index 0000000..0f7719a
--- /dev/null
+++ b/core/modules/rdf/config/rdf.namespace.rdf.sioct.yml
@@ -0,0 +1,5 @@
+nsid: rdf.sioct
+namespace_uri: 'http://rdfs.org/sioc/types#'
+prefix: sioct
+module: rdf
+langcode: und
diff --git a/core/modules/rdf/config/rdf.namespace.rdf.skos.yml b/core/modules/rdf/config/rdf.namespace.rdf.skos.yml
new file mode 100644
index 0000000..6c3edbe
--- /dev/null
+++ b/core/modules/rdf/config/rdf.namespace.rdf.skos.yml
@@ -0,0 +1,5 @@
+nsid: rdf.skos
+namespace_uri: 'http://www.w3.org/2004/02/skos/core#'
+prefix: skos
+module: rdf
+langcode: und
diff --git a/core/modules/rdf/config/rdf.namespace.rdf.xsd.yml b/core/modules/rdf/config/rdf.namespace.rdf.xsd.yml
new file mode 100644
index 0000000..d4cad1f
--- /dev/null
+++ b/core/modules/rdf/config/rdf.namespace.rdf.xsd.yml
@@ -0,0 +1,5 @@
+nsid: rdf.xsd
+namespace_uri: 'http://www.w3.org/2001/XMLSchema#'
+prefix: xsd
+module: rdf
+langcode: und
diff --git a/core/modules/rdf/lib/Drupal/rdf/Plugin/Core/Entity/RdfMapping.php b/core/modules/rdf/lib/Drupal/rdf/Plugin/Core/Entity/RdfMapping.php
index d9f369f..d1bb03a 100644
--- a/core/modules/rdf/lib/Drupal/rdf/Plugin/Core/Entity/RdfMapping.php
+++ b/core/modules/rdf/lib/Drupal/rdf/Plugin/Core/Entity/RdfMapping.php
@@ -11,6 +11,7 @@
 use Drupal\Core\Entity\Annotation\EntityType;
 use Drupal\Core\Annotation\Translation;
 use Drupal\rdf\RdfMappingInterface;
+use Drupal\rdf\RdfUri;
 
 /**
  * Config entity for working with RDF mappings.
@@ -81,6 +82,17 @@ public function getPreparedBundleMapping() {
     if (isset($this->types)) {
       $types = $this->types;
     }
+
+    // Transform CURIE arrays into CURIEs.
+    if (!empty($types)) {
+      foreach ($types as $key => $type) {
+        if (is_array($type)) {
+          $rdf_uri = new RdfUri($type);
+          $types[$key] = $rdf_uri->getCurie();
+        }
+      }
+    }
+
     return array('types' => $types);
   }
 
@@ -118,6 +130,21 @@ public function getPreparedFieldMapping($field_name) {
     if (isset($this->fieldMappings[$field_name])) {
       $field_mapping = array_merge($field_mapping, $this->fieldMappings[$field_name]);
     }
+
+    // Transform CURIE arrays into CURIEs.
+    if (!empty($field_mapping['properties'])) {
+      foreach ($field_mapping['properties'] as $key => $property) {
+        if (is_array($property)) {
+          $rdf_uri = new RdfUri($property);
+          $field_mapping['properties'][$key] = $rdf_uri->getCurie();
+        }
+      }
+    }
+    if (!empty($field_mapping['datatype']) && is_array($field_mapping['datatype'])) {
+      $rdf_uri = new RdfUri($field_mapping['datatype']);
+      $field_mapping['datatype'] = $rdf_uri->getCurie();
+    }
+
     return $field_mapping;
   }
 
diff --git a/core/modules/rdf/lib/Drupal/rdf/Plugin/Core/Entity/RdfNamespace.php b/core/modules/rdf/lib/Drupal/rdf/Plugin/Core/Entity/RdfNamespace.php
new file mode 100644
index 0000000..a4b2ea8
--- /dev/null
+++ b/core/modules/rdf/lib/Drupal/rdf/Plugin/Core/Entity/RdfNamespace.php
@@ -0,0 +1,82 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\rdf\Plugin\Core\Entity\RdfNamespace.
+ */
+
+namespace Drupal\rdf\Plugin\Core\Entity;
+
+use Drupal\Core\Config\Entity\ConfigEntityBase;
+use Drupal\Core\Entity\Annotation\EntityType;
+use Drupal\Core\Annotation\Translation;
+
+/**
+ * Defines the RDF namespace entity.
+ *
+ * @EntityType(
+ *   id = "rdf_namespace",
+ *   label = @Translation("RDF namespace"),
+ *   module = "rdf",
+ *   controllers = {
+ *     "storage" = "Drupal\Core\Config\Entity\ConfigStorageController"
+ *   },
+ *   form_controller_class = {
+ *     "default" = "Drupal\Core\Entity\EntityFormController"
+ *   },
+ *   config_prefix = "rdf.namespace",
+ *   entity_keys = {
+ *     "id" = "nsid",
+ *     "label" = "prefix"
+ *   }
+ * )
+ */
+class RdfNamespace extends ConfigEntityBase {
+
+  /**
+   * The RDF namespace ID.
+   *
+   * @var integer
+   */
+  public $nsid;
+
+  /**
+   * The full namespace URI for this namespace.
+   *
+   * @var string
+   */
+  public $namespace_uri;
+
+  /**
+   * The preferred prefix for this vocabulary.
+   *
+   * @var string
+   */
+  public $prefix;
+
+  /**
+   * The module which defines this namespace/prefix mapping.
+   *
+   * @var string
+   */
+  public $module;
+
+
+  /**
+   * {@inheritdoc}
+   */
+  public function id() {
+    return $this->module . '.' . $this->prefix;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function save() {
+    // Build an ID if none is set.
+    if (empty($this->id)) {
+      $this->id = $this->id();
+    }
+    return parent::save();
+  }
+}
diff --git a/core/modules/rdf/lib/Drupal/rdf/RdfNamespaceManager.php b/core/modules/rdf/lib/Drupal/rdf/RdfNamespaceManager.php
new file mode 100644
index 0000000..daa7b9d
--- /dev/null
+++ b/core/modules/rdf/lib/Drupal/rdf/RdfNamespaceManager.php
@@ -0,0 +1,68 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\rdf\RdfNamespaceManager.
+ */
+
+namespace Drupal\rdf;
+
+class RdfNamespaceManager {
+
+  /**
+   * Gets the array of namespace declarations.
+   *
+   * @return array
+   *   Array of namespace URIs keyed by prefix, e.g. schema => http://schema.org
+   */
+  public function getNamespaceDeclarations() {
+    $ns = array();
+    foreach ($this->getNamespaceDefinitions() as $definitions) {
+      foreach ($definitions as $namespace) {
+        $ns[$namespace->prefix] = $namespace->namespace_uri;
+      }
+    }
+    return $ns;
+  }
+
+  /**
+   * Gets a nested array of RdfNamespace config entities.
+   *
+   * Multiple modules may use the same prefix to correspond to different URIs.
+   * To disambiguate between multiple definitions, prefixes that conflict are
+   * appended with a number, e.g. schema1.
+   *
+   * @return array
+   *   A nested array of namespace objects, keyed first by prefix, then by
+   *   defining module.
+   */
+  public function getNamespaceDefinitions() {
+    $prefixes = array();
+
+    // Compile the definitions into a nested array, keyed by prefix and then
+    // defining module.
+    foreach (entity_load_multiple('rdf_namespace') as $namespace) {
+      $prefixes[$namespace->prefix][$namespace->module] = $namespace;
+    }
+
+    // If there is more than one definition for a prefix, then the additional
+    // definitions should use a different prefix.
+    foreach ($prefixes as $prefix => $definitions) {
+      if (count($definitions) > 1) {
+        $i = 1;
+        foreach ($definitions as $module => $namespace) {
+          if ($module == 'rdf') {
+            continue;
+          }
+          else {
+            $namespace->prefix = $prefix . $i;
+            $i++;
+          }
+        }
+      }
+    }
+
+    return $prefixes;
+  }
+
+}
diff --git a/core/modules/rdf/lib/Drupal/rdf/RdfUri.php b/core/modules/rdf/lib/Drupal/rdf/RdfUri.php
new file mode 100644
index 0000000..1c0c17d
--- /dev/null
+++ b/core/modules/rdf/lib/Drupal/rdf/RdfUri.php
@@ -0,0 +1,88 @@
+<?php
+/**
+ * @file
+ * Contains \Drupal\rdf\RdfUri.
+ */
+
+namespace Drupal\rdf;
+
+/**
+ * Manages the generation of URIs and CURIEs.
+ */
+class RdfUri {
+
+  /**
+   * The term name. E.g. name in schema:name.
+   *
+   * @var string
+   */
+  protected $localName;
+
+  /**
+   * The prefix. E.g. schema in schema:name.
+   *
+   * @var string
+   */
+  protected $prefix;
+
+  /**
+   * The module that defines the mapping between the prefix and its full URI.
+   *
+   * @var string
+   */
+  protected $prefixModule;
+
+  /**
+   * An absolute URI.
+   *
+   * @var string
+   */
+  protected $uri;
+
+  /**
+   * Constructor.
+   *
+   * @param array|string $uri_info
+   *   Either a URI string or a CURIE array in the following structure:
+   *     - local_name: The term name. E.g. name in schema:name.
+   *     - prefix: The prefix. E.g. schema in schema:name.
+   *     - prefix_module: The module that defines the mapping between the
+   *       prefix and its full URI.
+   */
+  public function __construct($uri_info) {
+    if (is_array($uri_info)) {
+      $this->localName = $uri_info['local_name'];
+      $this->prefix = $uri_info['prefix'];
+      $this->prefixModule = $uri_info['prefix_module'];
+    }
+    else {
+      $this->uri = $uri_info;
+    }
+    $this->namespaceManager = \Drupal::service('rdf.namespace_manager');
+  }
+
+  /**
+   * Get a CURIE for the URI.
+   *
+   * @return string
+   *   The CURIE.
+   *
+   * @throws \UnexpectedValueException
+   */
+  public function getCurie() {
+    // If there is no localName, the CURIE parts were not provided, so just
+    // return the URI.
+    // @todo Consider reg-exing to see whether the URI can be compacted.
+    if (!isset($this->localName)) {
+      return $this->uri;
+    }
+    // Get the list of namespaces, keyed by prefix and defining module.
+    $definitions = $this->namespaceManager->getNamespaceDefinitions();
+    if (!isset($definitions[$this->prefix][$this->prefixModule])) {
+      throw new \UnexpectedValueException(sprintf('Prefix %s is not defined in module %s.', $this->prefix, $this->prefixModule));
+    }
+    // Construct the CURIE.
+    $namespace = $definitions[$this->prefix][$this->prefixModule];
+    return $namespace->prefix . ':' . $this->localName;
+  }
+}
diff --git a/core/modules/rdf/lib/Drupal/rdf/SchemaOrgDataConverter.php b/core/modules/rdf/lib/Drupal/rdf/SchemaOrgDataConverter.php
index b646d5b..25991ea 100644
--- a/core/modules/rdf/lib/Drupal/rdf/SchemaOrgDataConverter.php
+++ b/core/modules/rdf/lib/Drupal/rdf/SchemaOrgDataConverter.php
@@ -6,7 +6,6 @@
 
 namespace Drupal\rdf;
 
-
 class SchemaOrgDataConverter {
 
   /**
@@ -16,14 +15,19 @@ class SchemaOrgDataConverter {
    *
    * @param int $count
    *   The interaction count.
+   * @param array $args
+   *   An array of arguments defined in the mapping.
+   *   Expected keys are:
+   *     - interaction_type: The string to use for the type of interaction
+   *       (e.g. UserComments).
    *
    * @return string
    *   The formatted string.
    *
    * @see http://schema.org/UserInteraction
-   * @todo Support other interaction types, see https://drupal.org/node/2020001
    */
-  static function interactionCount($count) {
-    return "UserComment:$count";
+  static function interactionCount($count, $args) {
+    $interaction_type = $args['interaction_type'];
+    return "$interaction_type:$count";
   }
 }
diff --git a/core/modules/rdf/lib/Drupal/rdf/Tests/CommentAttributesTest.php b/core/modules/rdf/lib/Drupal/rdf/Tests/CommentAttributesTest.php
index 61b4b3d..4add462 100644
--- a/core/modules/rdf/lib/Drupal/rdf/Tests/CommentAttributesTest.php
+++ b/core/modules/rdf/lib/Drupal/rdf/Tests/CommentAttributesTest.php
@@ -54,7 +54,7 @@ public function setUp() {
     $comment_count_mapping = array(
       'properties' => array('sioc:num_replies'),
       'datatype' => 'xsd:integer',
-      'datatype_callback' => 'Drupal\rdf\CommonDataConverter::rawValue',
+      'datatype_callback' => array('method' => 'Drupal\rdf\CommonDataConverter::rawValue'),
     );
     $article_mapping->setFieldMapping('comment_count', $comment_count_mapping)->save();
 
@@ -76,12 +76,12 @@ public function setUp() {
       'created' => array(
         'properties' => array('dc:date', 'dc:created'),
         'datatype' => 'xsd:dateTime',
-        'datatype_callback' => 'date_iso8601',
+        'datatype_callback' => array('method' => 'date_iso8601'),
       ),
       'changed' => array(
         'properties' => array('dc:modified'),
         'datatype' => 'xsd:dateTime',
-        'datatype_callback' => 'date_iso8601',
+        'datatype_callback' => array('method' => 'date_iso8601'),
       ),
       'comment_body' => array(
         'properties' => array('content:encoded'),
diff --git a/core/modules/rdf/lib/Drupal/rdf/Tests/CrudTest.php b/core/modules/rdf/lib/Drupal/rdf/Tests/CrudTest.php
index 06f5d68..c722520 100644
--- a/core/modules/rdf/lib/Drupal/rdf/Tests/CrudTest.php
+++ b/core/modules/rdf/lib/Drupal/rdf/Tests/CrudTest.php
@@ -53,7 +53,18 @@ function testMappingCreation() {
    */
   function testBundleMapping() {
     // Test that the bundle mapping can be saved.
-    $types = array('sioc:Post', 'foaf:Document');
+    $types = array(
+      array(
+        'local_name' => 'Post',
+        'prefix' => 'sioc',
+        'prefix_module' => 'rdf',
+      ),
+      array(
+        'local_name' => 'Document',
+        'prefix' => 'foaf',
+        'prefix_module' => 'rdf',
+      ),
+    );
     rdf_get_mapping($this->entity_type, $this->bundle)
       ->setBundleMapping(array('types' => $types))
       ->save();
@@ -62,7 +73,13 @@ function testBundleMapping() {
     $this->assertEqual($types, $bundle_mapping['types'], 'Bundle mapping saved.');
 
     // Test that the bundle mapping can be edited.
-    $types = array('schema:BlogPosting');
+    $types = array(
+      array(
+        'local_name' => 'BlogPosting',
+        'prefix' => 'schema',
+        'prefix_module' => 'rdf',
+      ),
+    );
     rdf_get_mapping($this->entity_type, $this->bundle)
       ->setBundleMapping(array('types' => $types))
       ->save();
@@ -79,9 +96,15 @@ function testFieldMapping() {
 
     // Test that the field mapping can be saved.
     $mapping = array(
-      'properties' => array('dc:created'),
+      'properties' => array(
+        array(
+          'local_name' => 'created',
+          'prefix' => 'dc',
+          'prefix_module' => 'rdf',
+        ),
+      ),
       'datatype' => 'xsd:dateTime',
-      'datatype_callback' => 'date_iso8601',
+      'datatype_callback' => array('method' => 'date_iso8601'),
     );
     rdf_get_mapping($this->entity_type, $this->bundle)
       ->setFieldMapping($field_name, $mapping)
@@ -92,9 +115,15 @@ function testFieldMapping() {
 
     // Test that the field mapping can be edited.
     $mapping = array(
-      'properties' => array('dc:date'),
+      'properties' => array(
+        array(
+          'local_name' => 'date',
+          'prefix' => 'dc',
+          'prefix_module' => 'rdf',
+        ),
+      ),
       'datatype' => 'foo:bar',
-      'datatype_callback' => 'date_iso8601',
+      'datatype_callback' => array('method' => 'date_iso8601'),
     );
     rdf_get_mapping($this->entity_type, $this->bundle)
       ->setFieldMapping($field_name, $mapping)
diff --git a/core/modules/rdf/lib/Drupal/rdf/Tests/GetNamespacesTest.php b/core/modules/rdf/lib/Drupal/rdf/Tests/GetNamespacesTest.php
index 0457ee4..5844fac 100644
--- a/core/modules/rdf/lib/Drupal/rdf/Tests/GetNamespacesTest.php
+++ b/core/modules/rdf/lib/Drupal/rdf/Tests/GetNamespacesTest.php
@@ -47,11 +47,6 @@ function testGetRdfNamespaces() {
     $this->assertTrue(!empty($element), 'The same prefix declared in several implementations of hook_rdf_namespaces() is valid as long as all the namespaces are the same.');
 
     $element = $this->xpath('//html[contains(@prefix, :prefix_binding)]', array(
-      ':prefix_binding' => 'foaf1: http://xmlns.com/foaf/0.1/',
-    ));
-    $this->assertTrue(!empty($element), 'Two prefixes can be assigned the same namespace.');
-
-    $element = $this->xpath('//html[contains(@prefix, :prefix_binding)]', array(
       ':prefix_binding' => 'dc: http://purl.org/dc/terms/',
     ));
     $this->assertTrue(!empty($element), 'When a prefix has conflicting namespaces, the first declared one is used.');
diff --git a/core/modules/rdf/lib/Drupal/rdf/Tests/GetRdfNamespacesTest.php b/core/modules/rdf/lib/Drupal/rdf/Tests/GetRdfNamespacesTest.php
index b2e881c..5def52a 100644
--- a/core/modules/rdf/lib/Drupal/rdf/Tests/GetRdfNamespacesTest.php
+++ b/core/modules/rdf/lib/Drupal/rdf/Tests/GetRdfNamespacesTest.php
@@ -36,9 +36,15 @@ function testGetRdfNamespaces() {
     // Get all RDF namespaces.
     $ns = rdf_get_namespaces();
 
-    $this->assertEqual($ns['rdfs'], 'http://www.w3.org/2000/01/rdf-schema#', 'A prefix declared once is included.');
-    $this->assertEqual($ns['foaf'], 'http://xmlns.com/foaf/0.1/', 'The same prefix declared in several implementations of hook_rdf_namespaces() is valid as long as all the namespaces are the same.');
-    $this->assertEqual($ns['foaf1'], 'http://xmlns.com/foaf/0.1/', 'Two prefixes can be assigned the same namespace.');
-    $this->assertEqual($ns['dc'], 'http://purl.org/dc/terms/', 'When a prefix has conflicting namespaces, the first declared one is used.');
+    // Test mapping defined in RDF with no conflicts.
+    $this->assertEqual($ns['rdfs'], 'http://www.w3.org/2000/01/rdf-schema#', 'A prefix declared in RDF module is included.');
+
+    // Test mapping defined in RDF with conflict from test module.
+    $this->assertEqual($ns['schema'], 'http://schema.org/', 'Namespace mapping declared by RDF module takes precedence when registered twice.');
+    // Test conflicting mapping.
+    $this->assertEqual($ns['schema1'], 'http://test.org/', 'Namespace mapping from other module is appended with "1" when conflicting with RDF module.');
+
+    // Test mapping defined in test module with no conflicts.
+    $this->assertEqual($ns['test_prefix'], 'http://test-prefix.org/', 'Namespace mapping from other module is not appended with "1" when there is no conflicting prefix');
   }
 }
diff --git a/core/modules/rdf/lib/Drupal/rdf/Tests/NodeAttributesTest.php b/core/modules/rdf/lib/Drupal/rdf/Tests/NodeAttributesTest.php
index bf18a63..cb00547 100644
--- a/core/modules/rdf/lib/Drupal/rdf/Tests/NodeAttributesTest.php
+++ b/core/modules/rdf/lib/Drupal/rdf/Tests/NodeAttributesTest.php
@@ -42,7 +42,7 @@ public function setUp() {
       ->setFieldMapping('created', array(
         'properties' => array('dc:date', 'dc:created'),
         'datatype' => 'xsd:dateTime',
-        'datatype_callback' => 'date_iso8601',
+        'datatype_callback' => array('method' => 'date_iso8601'),
       ))
       ->save();
   }
diff --git a/core/modules/rdf/lib/Drupal/rdf/Tests/PrepareCuriesTest.php b/core/modules/rdf/lib/Drupal/rdf/Tests/PrepareCuriesTest.php
new file mode 100644
index 0000000..b9c65fb
--- /dev/null
+++ b/core/modules/rdf/lib/Drupal/rdf/Tests/PrepareCuriesTest.php
@@ -0,0 +1,92 @@
+<?php
+
+/**
+ * @file
+ * Contains Drupal\rdf\Tests\PrepareCuriesTest.
+ */
+
+namespace Drupal\rdf\Tests;
+
+use Drupal\rdf\RdfNamespaceManager;
+use Drupal\rdf\RdfUri;
+use Drupal\simpletest\DrupalUnitTestBase;
+
+/**
+ * Tests that CURIEs from conflicting namespace mappings are properly handled.
+ */
+class PrepareCuriesTest extends DrupalUnitTestBase {
+
+  public static $modules = array('system', 'rdf', 'rdf_test_namespaces');
+
+  public static function getInfo() {
+    return array(
+      'name' => 'CURIE handling',
+      'description' => 'Test that CURIEs from conflicting namespace mappings are properly handled..',
+      'group' => 'RDF',
+    );
+  }
+
+  /**
+   * Overrides \Drupal\simpletest\DrupalUnitTestBase::setUp().
+   */
+  public function setUp() {
+    parent::setUp();
+    $this->installConfig(array('rdf', 'rdf_test_namespaces'));
+    $this->namespaceManager = new RdfNamespaceManager();
+  }
+
+  /**
+   * Tests CURIE generation when a module's namespace conflicts with core's.
+   */
+  function testCoreConflict() {
+    $core_defined = array(
+      'local_name' => 'Foo',
+      'prefix' => 'core-conflict',
+      'prefix_module' => 'rdf',
+    );
+    $rdf_uri = new RdfUri($core_defined);
+    $this->assertEqual($rdf_uri->getCurie(), 'core-conflict:Foo', 'CURIE using core-defined prefix generated correctly in case of core/contrib conflict.');
+
+    $contrib_defined = array(
+      'local_name' => 'Bar',
+      'prefix' => 'core-conflict',
+      'prefix_module' => 'core_conflict2',
+    );
+    $rdf_uri = new RdfUri($contrib_defined);
+    $this->assertEqual($rdf_uri->getCurie(), 'core-conflict1:Bar', 'CURIE using contrib-defined prefix generated correctly in case of core/contrib conflict.');
+  }
+
+  /**
+   * Tests CURIE generation when a module declares a non-conflicting namespace.
+   */
+  function testContribNoConflict() {
+    $contrib_defined = array(
+      'local_name' => 'Foo',
+      'prefix' => 'no-conflict',
+      'prefix_module' => 'no_conflict',
+    );
+    $rdf_uri = new RdfUri($contrib_defined);
+    $this->assertEqual($rdf_uri->getCurie(), 'no-conflict:Foo', 'CURIE generated correctly when contrib prefix has no conflicts.');
+  }
+
+  /**
+   * Tests CURIE generation when contrib modules declare conflicting namespaces.
+   */
+  function testContribConflict() {
+    $contrib_defined1 = array(
+      'local_name' => 'Foo',
+      'prefix' => 'contrib-conflict',
+      'prefix_module' => 'contrib_conflict',
+    );
+    $rdf_uri = new RdfUri($contrib_defined1);
+    $this->assertEqual($rdf_uri->getCurie(), 'contrib-conflict1:Foo', 'CURIE generated correctly when contrib prefix has no conflicts.');
+
+    $contrib_defined2 = array(
+      'local_name' => 'Foo',
+      'prefix' => 'contrib-conflict',
+      'prefix_module' => 'contrib_conflict2',
+    );
+    $rdf_uri = new RdfUri($contrib_defined2);
+    $this->assertEqual($rdf_uri->getCurie(), 'contrib-conflict2:Foo', 'CURIE generated correctly when contrib prefix has no conflicts.');
+  }
+}
diff --git a/core/modules/rdf/lib/Drupal/rdf/Tests/RdfMappingUpgradePathTest.php b/core/modules/rdf/lib/Drupal/rdf/Tests/RdfMappingUpgradePathTest.php
index 0474519..4d23c82 100644
--- a/core/modules/rdf/lib/Drupal/rdf/Tests/RdfMappingUpgradePathTest.php
+++ b/core/modules/rdf/lib/Drupal/rdf/Tests/RdfMappingUpgradePathTest.php
@@ -69,7 +69,7 @@ protected function _testUnalteredMappingUpgrade() {
     $expected_mapping = array(
       'properties' => array('dc:date', 'dc:created'),
       'datatype' => 'xsd:dateTime',
-      'datatype_callback' => 'date_iso8601',
+      'datatype_callback' => array('method' => 'date_iso8601'),
     );
     $this->assertEqual($mapping, $expected_mapping, 'Unaltered field mapping with datatype and datatype callback upgraded correctly.');
 
diff --git a/core/modules/rdf/lib/Drupal/rdf/Tests/RdfaAttributesTest.php b/core/modules/rdf/lib/Drupal/rdf/Tests/RdfaAttributesTest.php
index e2de46a..f525af8 100644
--- a/core/modules/rdf/lib/Drupal/rdf/Tests/RdfaAttributesTest.php
+++ b/core/modules/rdf/lib/Drupal/rdf/Tests/RdfaAttributesTest.php
@@ -29,6 +29,11 @@ public static function getInfo() {
     );
   }
 
+  public function setUp() {
+    parent::setUp();
+    $this->installConfig(array('rdf'));
+  }
+
   /**
    * Test attribute creation for mappings which use 'property'.
    */
@@ -45,8 +50,8 @@ function testProperty() {
    * Test attribute creation for mappings which use 'datatype'.
    */
   function testDatatype() {
-    $properties = array('foo:bar1');
-    $datatype = 'foo:bar1type';
+    $properties = array('dc:bar1');
+    $datatype = 'dc:bar1type';
 
     $mapping = array(
       'datatype' => $datatype,
@@ -73,7 +78,7 @@ function testDatatypeCallback() {
     $mapping = array(
       'datatype' => $datatype,
       'properties' => $properties,
-      'datatype_callback' => 'date_iso8601',
+      'datatype_callback' => array('method' => 'date_iso8601'),
     );
     $expected_attributes = array(
       'datatype' => $datatype,
@@ -92,11 +97,14 @@ function testDatatypeCallbackWithConverter() {
     $properties = array('schema:interactionCount');
 
     $data = "23";
-    $content = "UserComment:23";
+    $content = "UserComments:23";
 
     $mapping = array(
       'properties' => $properties,
-      'datatype_callback' => 'Drupal\rdf\SchemaOrgDataConverter::interactionCount',
+      'datatype_callback' => array(
+        'method' => 'Drupal\rdf\SchemaOrgDataConverter::interactionCount',
+        'arguments' => array('interaction_type' => 'UserComments'),
+      ),
     );
     $expected_attributes = array(
       'property' => $properties,
diff --git a/core/modules/rdf/lib/Drupal/rdf/Tests/StandardProfileTest.php b/core/modules/rdf/lib/Drupal/rdf/Tests/StandardProfileTest.php
index f7b797c..516ad50 100644
--- a/core/modules/rdf/lib/Drupal/rdf/Tests/StandardProfileTest.php
+++ b/core/modules/rdf/lib/Drupal/rdf/Tests/StandardProfileTest.php
@@ -136,7 +136,7 @@ protected function _testFrontPageRDFa() {
     // Test interaction count.
     $expected_value = array(
       'type' => 'literal',
-      'value' => 'UserComment:1',
+      'value' => 'UserComments:1',
       'lang' => 'en',
     );
     $this->assertTrue($graph->hasProperty($this->articleUri, 'http://schema.org/interactionCount', $expected_value), "Teaser comment count was found (schema:interactionCount).");
diff --git a/core/modules/rdf/lib/Drupal/rdf/Tests/TrackerAttributesTest.php b/core/modules/rdf/lib/Drupal/rdf/Tests/TrackerAttributesTest.php
index d2d1cdd..8dae552 100644
--- a/core/modules/rdf/lib/Drupal/rdf/Tests/TrackerAttributesTest.php
+++ b/core/modules/rdf/lib/Drupal/rdf/Tests/TrackerAttributesTest.php
@@ -47,12 +47,12 @@ function setUp() {
       'created' => array(
         'properties' => array('dc:date', 'dc:created'),
         'datatype' => 'xsd:dateTime',
-        'datatype_callback' => 'date_iso8601',
+        'datatype_callback' => array('method' => 'date_iso8601'),
       ),
       'changed' => array(
         'properties' => array('dc:modified'),
         'datatype' => 'xsd:dateTime',
-        'datatype_callback' => 'date_iso8601',
+        'datatype_callback' => array('method' => 'date_iso8601'),
       ),
       'body' => array(
         'properties' => array('content:encoded'),
@@ -71,7 +71,7 @@ function setUp() {
       'last_activity' => array(
         'properties' => array('sioc:last_activity_date'),
         'datatype' => 'xsd:dateTime',
-        'datatype_callback' => 'date_iso8601',
+        'datatype_callback' => array('method' => 'date_iso8601'),
       ),
     );
     // Iterate over field mappings and save.
diff --git a/core/modules/rdf/rdf.install b/core/modules/rdf/rdf.install
index 64c3a52..0d99ac5 100644
--- a/core/modules/rdf/rdf.install
+++ b/core/modules/rdf/rdf.install
@@ -49,7 +49,7 @@ function rdf_update_8000() {
         }
         !empty($value['predicates']) ? $field_mappings[$key]['properties'] = $value['predicates'] : NULL;
         !empty($value['datatype']) ? $field_mappings[$key]['datatype'] = $value['datatype'] : NULL;
-        !empty($value['callback']) ? $field_mappings[$key]['datatype_callback'] = $value['callback'] : NULL;
+        !empty($value['callback']) ? $field_mappings[$key]['datatype_callback']['method'] = $value['callback'] : NULL;
       }
     }
     $config->set('fieldMappings', $field_mappings);
diff --git a/core/modules/rdf/rdf.module b/core/modules/rdf/rdf.module
index 3c03d80..6a9e740 100644
--- a/core/modules/rdf/rdf.module
+++ b/core/modules/rdf/rdf.module
@@ -83,40 +83,12 @@ function rdf_get_mapping($entity_type, $bundle) {
 }
 
 /**
- * Implements hook_rdf_namespaces().
- */
-function rdf_rdf_namespaces() {
-  return array(
-    'content'  => 'http://purl.org/rss/1.0/modules/content/',
-    'dc'       => 'http://purl.org/dc/terms/',
-    'foaf'     => 'http://xmlns.com/foaf/0.1/',
-    'og'       => 'http://ogp.me/ns#',
-    'rdfs'     => 'http://www.w3.org/2000/01/rdf-schema#',
-    'schema'   => 'http://schema.org/',
-    'sioc'     => 'http://rdfs.org/sioc/ns#',
-    'sioct'    => 'http://rdfs.org/sioc/types#',
-    'skos'     => 'http://www.w3.org/2004/02/skos/core#',
-    'xsd'      => 'http://www.w3.org/2001/XMLSchema#',
-  );
-}
-
-/**
  * Retrieves RDF namespaces.
- *
- * Invokes hook_rdf_namespaces() and collects RDF namespaces from modules that
- * implement it.
  */
 function rdf_get_namespaces() {
-  $namespaces = array();
-  // In order to resolve duplicate namespaces by using the earliest defined
-  // namespace, do not use module_invoke_all().
-  foreach (module_implements('rdf_namespaces') as $module) {
-    $function = $module . '_rdf_namespaces';
-    if (function_exists($function)) {
-      $namespaces = NestedArray::mergeDeep($function(), $namespaces);
-    }
-  }
-  return $namespaces;
+  // @todo Fix this.
+  $namespace_manager = new \Drupal\rdf\RdfNamespaceManager();
+  return $namespace_manager->getNamespaceDeclarations();
 }
 
 /**
@@ -143,7 +115,8 @@ function rdf_get_namespaces() {
  *     array(
  *       'properties' => array('dc:created'),
  *       'datatype' => 'xsd:dateTime',
- *       'datatype_callback' => 'date_iso8601',
+ *       'datatype_callback' => array(
+ *         'method' => 'date_iso8601',
  *       ),
  *     );
  *   @endcode
@@ -174,8 +147,9 @@ function rdf_rdfa_attributes($mapping, $data = NULL) {
         $attributes['property'] = $mapping['properties'];
         // Convert $data to a specific format as per the callback function.
         if (isset($data) && !empty($mapping['datatype_callback'])) {
-          $callback = $mapping['datatype_callback'];
-          $attributes['content'] = call_user_func($callback, $data);
+          $callback = $mapping['datatype_callback']['method'];
+          $arguments = isset($mapping['datatype_callback']['arguments']) ? $mapping['datatype_callback']['arguments'] : NULL;
+          $attributes['content'] = call_user_func($callback, $data, $arguments);
         }
         if (isset($mapping['datatype'])) {
           $attributes['datatype'] = $mapping['datatype'];
diff --git a/core/modules/rdf/rdf.services.yml b/core/modules/rdf/rdf.services.yml
new file mode 100644
index 0000000..90bee6c
--- /dev/null
+++ b/core/modules/rdf/rdf.services.yml
@@ -0,0 +1,3 @@
+services:
+  rdf.namespace_manager:
+    class: Drupal\rdf\RdfNamespaceManager
diff --git a/core/modules/rdf/tests/rdf_test_namespaces/config/rdf.namespace.contrib_conflict.contrib-conflict.yml b/core/modules/rdf/tests/rdf_test_namespaces/config/rdf.namespace.contrib_conflict.contrib-conflict.yml
new file mode 100644
index 0000000..de1b910
--- /dev/null
+++ b/core/modules/rdf/tests/rdf_test_namespaces/config/rdf.namespace.contrib_conflict.contrib-conflict.yml
@@ -0,0 +1,4 @@
+nsid: contrib_conflict.contrib-conflict
+namespace_uri: 'http://contrib-conflict.org/'
+prefix: contrib-conflict
+module: contrib_conflict
diff --git a/core/modules/rdf/tests/rdf_test_namespaces/config/rdf.namespace.contrib_conflict2.contrib-conflict.yml b/core/modules/rdf/tests/rdf_test_namespaces/config/rdf.namespace.contrib_conflict2.contrib-conflict.yml
new file mode 100644
index 0000000..f0a615d
--- /dev/null
+++ b/core/modules/rdf/tests/rdf_test_namespaces/config/rdf.namespace.contrib_conflict2.contrib-conflict.yml
@@ -0,0 +1,4 @@
+nsid: contrib_conflict2.contrib-conflict
+namespace_uri: 'http://contrib-conflict2.org/'
+prefix: contrib-conflict
+module: contrib_conflict2
diff --git a/core/modules/rdf/tests/rdf_test_namespaces/config/rdf.namespace.core_conflict2.core-conflict.yml b/core/modules/rdf/tests/rdf_test_namespaces/config/rdf.namespace.core_conflict2.core-conflict.yml
new file mode 100644
index 0000000..8c0fc76
--- /dev/null
+++ b/core/modules/rdf/tests/rdf_test_namespaces/config/rdf.namespace.core_conflict2.core-conflict.yml
@@ -0,0 +1,4 @@
+nsid: core_conflict2.core-conflict
+namespace_uri: 'http://core-conflict2.org/'
+prefix: core-conflict
+module: core_conflict2
diff --git a/core/modules/rdf/tests/rdf_test_namespaces/config/rdf.namespace.no_conflict.no-conflict.yml b/core/modules/rdf/tests/rdf_test_namespaces/config/rdf.namespace.no_conflict.no-conflict.yml
new file mode 100644
index 0000000..252f82d
--- /dev/null
+++ b/core/modules/rdf/tests/rdf_test_namespaces/config/rdf.namespace.no_conflict.no-conflict.yml
@@ -0,0 +1,4 @@
+nsid: no_conflict.no-conflict
+namespace_uri: 'http://no-conflict.org/'
+prefix: no-conflict
+module: no_conflict
diff --git a/core/modules/rdf/tests/rdf_test_namespaces/config/rdf.namespace.rdf.core-conflict.yml b/core/modules/rdf/tests/rdf_test_namespaces/config/rdf.namespace.rdf.core-conflict.yml
new file mode 100644
index 0000000..5c82e4a
--- /dev/null
+++ b/core/modules/rdf/tests/rdf_test_namespaces/config/rdf.namespace.rdf.core-conflict.yml
@@ -0,0 +1,4 @@
+nsid: rdf.core-conflict
+namespace_uri: 'http://core-conflict.org/'
+prefix: core-conflict
+module: rdf
diff --git a/core/modules/rdf/tests/rdf_test_namespaces/config/rdf.namespace.rdf_test_mapping.schema.yml b/core/modules/rdf/tests/rdf_test_namespaces/config/rdf.namespace.rdf_test_mapping.schema.yml
new file mode 100644
index 0000000..0d721d7
--- /dev/null
+++ b/core/modules/rdf/tests/rdf_test_namespaces/config/rdf.namespace.rdf_test_mapping.schema.yml
@@ -0,0 +1,4 @@
+nsid: rdf_test_mapping.schema
+namespace_uri: 'http://test.org/'
+prefix: schema
+module: rdf_test_mapping
diff --git a/core/modules/rdf/tests/rdf_test_namespaces/config/rdf.namespace.rdf_test_mapping.test_prefix.yml b/core/modules/rdf/tests/rdf_test_namespaces/config/rdf.namespace.rdf_test_mapping.test_prefix.yml
new file mode 100644
index 0000000..af0e2ed
--- /dev/null
+++ b/core/modules/rdf/tests/rdf_test_namespaces/config/rdf.namespace.rdf_test_mapping.test_prefix.yml
@@ -0,0 +1,4 @@
+nsid: rdf_test_mapping.test_prefix
+namespace_uri: 'http://test-prefix.org/'
+prefix: test_prefix
+module: rdf_test_mapping
diff --git a/core/modules/user/config/rdf.mapping.user.user.yml b/core/modules/user/config/rdf.mapping.user.user.yml
index ad082a9..7897c59 100644
--- a/core/modules/user/config/rdf.mapping.user.user.yml
+++ b/core/modules/user/config/rdf.mapping.user.user.yml
@@ -2,8 +2,12 @@ id: user.user
 targetEntityType: user
 bundle: user
 types:
-  - 'schema:Person'
+  - local_name: 'Person'
+    prefix: 'schema'
+    prefix_module: 'rdf'
 fieldMappings:
   name:
     properties:
-      - 'schema:name'
+      - local_name: 'name'
+        prefix: 'schema'
+        prefix_module: 'rdf'
diff --git a/core/profiles/standard/config/rdf.mapping.comment.comment_node_article.yml b/core/profiles/standard/config/rdf.mapping.comment.comment_node_article.yml
index 3a7ecaa..e0c9117 100644
--- a/core/profiles/standard/config/rdf.mapping.comment.comment_node_article.yml
+++ b/core/profiles/standard/config/rdf.mapping.comment.comment_node_article.yml
@@ -2,23 +2,37 @@ id: comment.comment_node_article
 targetEntityType: comment
 bundle: comment_node_article
 types:
-  - 'schema:Comment'
+  - local_name: 'Comment'
+    prefix: 'schema'
+    prefix_module: 'rdf'
 fieldMappings:
   subject:
     properties:
-      - 'schema:name'
+      - local_name: 'name'
+        prefix: 'schema'
+        prefix_module: 'rdf'
   created:
     properties:
-      - 'schema:dateCreated'
-    datatype_callback: 'date_iso8601'
+      - local_name: 'dateCreated'
+        prefix: 'schema'
+        prefix_module: 'rdf'
+    datatype_callback:
+      method: 'date_iso8601'
   changed:
     properties:
-      - 'schema:dateModified'
-    datatype_callback: 'date_iso8601'
+      - local_name: 'dateModified'
+        prefix: 'schema'
+        prefix_module: 'rdf'
+    datatype_callback:
+      method: 'date_iso8601'
   comment_body:
     properties:
-      - 'schema:text'
+      - local_name: 'text'
+        prefix: 'schema'
+        prefix_module: 'rdf'
   uid:
     properties:
-      - 'schema:author'
+      - local_name: 'author'
+        prefix: 'schema'
+        prefix_module: 'rdf'
     mapping_type: 'rel'
diff --git a/core/profiles/standard/config/rdf.mapping.comment.comment_node_page.yml b/core/profiles/standard/config/rdf.mapping.comment.comment_node_page.yml
index d36438f..1537229 100644
--- a/core/profiles/standard/config/rdf.mapping.comment.comment_node_page.yml
+++ b/core/profiles/standard/config/rdf.mapping.comment.comment_node_page.yml
@@ -2,23 +2,37 @@ id: comment.comment_node_page
 targetEntityType: comment
 bundle: comment_node_page
 types:
-  - 'schema:Comment'
+  - local_name: 'Comment'
+    prefix: 'schema'
+    prefix_module: 'rdf'
 fieldMappings:
   subject:
     properties:
-      - 'schema:name'
+      - local_name: 'name'
+        prefix: 'schema'
+        prefix_module: 'rdf'
   created:
     properties:
-      - 'schema:dateCreated'
-    datatype_callback: 'date_iso8601'
+      - local_name: 'dateCreated'
+        prefix: 'schema'
+        prefix_module: 'rdf'
+    datatype_callback:
+      method: 'date_iso8601'
   changed:
     properties:
-      - 'schema:dateModified'
-    datatype_callback: 'date_iso8601'
+      - local_name: 'dateModified'
+        prefix: 'schema'
+        prefix_module: 'rdf'
+    datatype_callback:
+      method: 'date_iso8601'
   comment_body:
     properties:
-      - 'schema:text'
+      - local_name: 'text'
+        prefix: 'schema'
+        prefix_module: 'rdf'
   uid:
     properties:
-      - 'schema:author'
+      - local_name: 'author'
+        prefix: 'schema'
+        prefix_module: 'rdf'
     mapping_type: 'rel'
diff --git a/core/profiles/standard/config/rdf.mapping.node.article.yml b/core/profiles/standard/config/rdf.mapping.node.article.yml
index b5413de..ae49d0e 100644
--- a/core/profiles/standard/config/rdf.mapping.node.article.yml
+++ b/core/profiles/standard/config/rdf.mapping.node.article.yml
@@ -2,35 +2,58 @@ id: node.article
 targetEntityType: node
 bundle: article
 types:
-  - 'schema:Article'
+  - local_name: 'Article'
+    prefix: 'schema'
+    prefix_module: 'rdf'
 fieldMappings:
   title:
     properties:
-      - 'schema:name'
+      - local_name: 'name'
+        prefix: 'schema'
+        prefix_module: 'rdf'
   created:
     properties:
-      - 'schema:dateCreated'
-    datatype_callback: 'date_iso8601'
+      - local_name: 'dateCreated'
+        prefix: 'schema'
+        prefix_module: 'rdf'
+    datatype_callback:
+      method: 'date_iso8601'
   changed:
     properties:
-      - 'schema:dateModified'
-    datatype_callback: 'date_iso8601'
+      - local_name: 'dateModified'
+        prefix: 'schema'
+        prefix_module: 'rdf'
+    datatype_callback:
+      method: 'date_iso8601'
   body:
     properties:
-      - 'schema:text'
+      - local_name: 'text'
+        prefix: 'schema'
+        prefix_module: 'rdf'
   uid:
     properties:
-      - 'schema:author'
+      - local_name: 'author'
+        prefix: 'schema'
+        prefix_module: 'rdf'
     mapping_type: 'rel'
   comment_count:
     properties:
-      - 'schema:interactionCount'
-    datatype_callback: 'Drupal\rdf\SchemaOrgDataConverter::interactionCount'
+      - local_name: 'interactionCount'
+        prefix: 'schema'
+        prefix_module: 'rdf'
+    datatype_callback:
+      method: 'Drupal\rdf\SchemaOrgDataConverter::interactionCount'
+      arguments:
+        interaction_type: 'UserComments'
   field_image:
     properties:
-      - 'schema:image'
+      - local_name: 'image'
+        prefix: 'schema'
+        prefix_module: 'rdf'
     mapping_type: 'rel'
   field_tags:
     properties:
-      - 'schema:about'
+      - local_name: 'about'
+        prefix: 'schema'
+        prefix_module: 'rdf'
     mapping_type: 'rel'
diff --git a/core/profiles/standard/config/rdf.mapping.node.page.yml b/core/profiles/standard/config/rdf.mapping.node.page.yml
index 91330c7..2d343d1 100644
--- a/core/profiles/standard/config/rdf.mapping.node.page.yml
+++ b/core/profiles/standard/config/rdf.mapping.node.page.yml
@@ -2,27 +2,46 @@ id: node.page
 targetEntityType: node
 bundle: page
 types:
-  - 'schema:WebPage'
+  - local_name: 'WebPage'
+    prefix: 'schema'
+    prefix_module: 'rdf'
 fieldMappings:
   title:
     properties:
-      - 'schema:name'
+      - local_name: 'name'
+        prefix: 'schema'
+        prefix_module: 'rdf'
   created:
     properties:
-      - 'schema:dateCreated'
-    datatype_callback: 'date_iso8601'
+      - local_name: 'dateCreated'
+        prefix: 'schema'
+        prefix_module: 'rdf'
+    datatype_callback:
+      method: 'date_iso8601'
   changed:
     properties:
-      - 'schema:dateModified'
-    datatype_callback: 'date_iso8601'
+      - local_name: 'dateModified'
+        prefix: 'schema'
+        prefix_module: 'rdf'
+    datatype_callback:
+      method: 'date_iso8601'
   body:
     properties:
-      - 'schema:text'
+      - local_name: 'text'
+        prefix: 'schema'
+        prefix_module: 'rdf'
   uid:
     properties:
-      - 'schema:author'
+      - local_name: 'author'
+        prefix: 'schema'
+        prefix_module: 'rdf'
     mapping_type: 'rel'
   comment_count:
     properties:
-      - 'schema:interactionCount'
-    datatype_callback: 'Drupal\rdf\SchemaOrgDataConverter::interactionCount'
+      - local_name: 'interactionCount'
+        prefix: 'schema'
+        prefix_module: 'rdf'
+    datatype_callback:
+      method: 'Drupal\rdf\SchemaOrgDataConverter::interactionCount'
+      arguments:
+        interaction_type: 'UserComments'
diff --git a/core/profiles/standard/config/rdf.mapping.taxonomy_term.tags.yml b/core/profiles/standard/config/rdf.mapping.taxonomy_term.tags.yml
index 051795c..c2a2559 100644
--- a/core/profiles/standard/config/rdf.mapping.taxonomy_term.tags.yml
+++ b/core/profiles/standard/config/rdf.mapping.taxonomy_term.tags.yml
@@ -2,11 +2,17 @@ id: taxonomy_term.tags
 targetEntityType: taxonomy_term
 bundle: tags
 types:
-  - 'schema:Thing'
+  - local_name: 'Thing'
+    prefix: 'schema'
+    prefix_module: 'rdf'
 fieldMappings:
   name:
     properties:
-      - 'schema:name'
+      - local_name: 'name'
+        prefix: 'schema'
+        prefix_module: 'rdf'
   description:
     properties:
-      - 'schema:description'
+      - local_name: 'description'
+        prefix: 'schema'
+        prefix_module: 'rdf'
