diff --git a/API.txt b/API.txt
index 8b07eb5..5fc7bac 100644
--- a/API.txt
+++ b/API.txt
@@ -145,3 +145,6 @@ API version 1.14
 * The page_title, dc.title and og:title tags are all set to work on all pages
   except:
     * NODEWORDS_TYPE_DEFAULT
+* Meta tags may define a boolean attribute 'multiple' as TRUE; meta tags with
+  this setting can have multiple values, each on a separate line, which are
+  then output with a separate HTML tag for each one.
diff --git a/nodewords.api.php b/nodewords.api.php
index 8b0612a..5d3f937 100644
--- a/nodewords.api.php
+++ b/nodewords.api.php
@@ -19,7 +19,7 @@
  *     NODEWORDS_API_VERSION.
  */
 function hook_nodewords_api() {
-  return array('version' => '1.1');
+  return array('version' => '1.14');
 }
 
 /**
@@ -27,14 +27,17 @@ function hook_nodewords_api() {
  *
  *
  * @return
- *   An array containing the following values:
+ *   A nested array containing the following values:
  *
- *  - attributes - the tag attributes used when outputing the tag on HTML HEAD.
+ *  - attributes - the tag attributes used when outputting the tag.
  *  - callback - the string used to built the name of the functions called for 
  *    any meta tags operations.
  *  - context - the contexts in which the meta tags are allowed (and denied).
  *  - label - the label used as title in the fieldset for the form field
  *    shown in the form to edit the meta tags values.
+ *  - multiple - if set to TRUE, splits the tag value on each line break and
+ *    outputs each item as a fully separate copy of the tag; best used when the
+ *    form uses a textarea instead of a textfield.
  *  - permission - the permission associated with the form fields used to
  *    edit the meta tags values; this permission is used only when the meta tag
  *    edit form fields are shown in a form that is accessible not only from the
diff --git a/nodewords.module b/nodewords.module
index daa321d..1623ba8 100644
--- a/nodewords.module
+++ b/nodewords.module
@@ -1439,13 +1439,12 @@ function _nodewords_output_tags($tags, $output_type = 'head') {
 
     if ($output_type == 'update index') {
       $bool = (
-        isset($tags_info[$parts[0]]['templates']['search index'][$parts[1]]) &&
-        ($meta_content = trim(check_plain(decode_entities(strip_tags($content)))))
+        isset($tags_info[$parts[0]]['templates']['search index'][$parts[1]])
       );
 
       if ($bool) {
+        // The '%content' element will be added later.
         $replace = array(
-          '%content' => $meta_content,
           '%attributes' => empty($tags_info[$parts[0]]['attributes'][$parts[1]]) ? '' : drupal_attributes($tags_info[$parts[0]]['attributes'][$parts[1]]),
         );
         $template = $tags_info[$parts[0]]['templates']['search index'][$parts[1]];
@@ -1455,14 +1454,13 @@ function _nodewords_output_tags($tags, $output_type = 'head') {
     else {
       $bool = (
         isset($tags_info[$parts[0]]['templates']['head'][$parts[1]]) &&
-        ($meta_name = check_plain(decode_entities(strip_tags($parts[1])))) &&
-        ($meta_content = trim(check_plain(decode_entities(strip_tags($content)))))
+        ($meta_name = check_plain(decode_entities(strip_tags($parts[1]))))
       );
 
       if ($bool) {
+        // The '%content' element will be added later.
         $replace = array(
           '%name' => $meta_name,
-          '%content' => $meta_content,
           '%attributes' => empty($tags_info[$parts[0]]['attributes'][$parts[1]]) ? '' : drupal_attributes($tags_info[$parts[0]]['attributes'][$parts[1]]),
         );
         $template = $tags_info[$parts[0]]['templates']['head'][$parts[1]];
@@ -1502,8 +1500,22 @@ function _nodewords_output_tags($tags, $output_type = 'head') {
     }
 
     if (!empty($template)) {
-      $output[] = strtr($template, $replace);
-      $weights[] = $weight;
+      // Allow the meta tags to have multiple values.
+      if (!empty($tags_info[$name])) {
+        $content = explode("\n", $content);
+      }
+
+      // Simplify the output handling.
+      if (!is_array($content)) {
+        $content = array($content);
+      }
+
+      // Now add the content element(s) to the replacement array.
+      foreach ($content as $content_item) {
+        $replace['%content'] = trim(check_plain(decode_entities(strip_tags($content_item))));
+        $output[] = strtr($template, $replace);
+        $weights[] = $weight;
+      }
     }
   }
 
diff --git a/nodewords_extra/nodewords_extra.module b/nodewords_extra/nodewords_extra.module
index 008c3af..3b128b9 100644
--- a/nodewords_extra/nodewords_extra.module
+++ b/nodewords_extra/nodewords_extra.module
@@ -37,6 +37,7 @@ function nodewords_extra_nodewords_tags_info() {
         ),
       ),
       'label' => t('Dublin Core: Contributor'),
+      'multiple' => TRUE,
       'permission' => 'edit meta tag Dublin Core CONTRIBUTOR',
       'templates' => array(
         'head' => array(
@@ -204,12 +205,13 @@ function nodewords_extra_dc_contributor_form(&$form, $content, $options) {
   );
 
   $form['dc.contributor']['value'] = array(
-    '#type' => 'textfield',
+    '#type' => 'textarea',
     '#title' => t('Dublin Core: Contributor'),
-    '#description' => t('Enter the name of an entity responsible for making contributions to the resource. Examples of a contributor include a person, an organization, or a service.'),
+    '#description' => t('Enter the name(s) of an entity responsible for making contributions to the resource. Examples of a contributor include a person, an organization, or a service. Multiple names may be added, one per line, up to a maximum of %count characters.', array('%count' => variable_get('nodewords_max_size', 350))),
     '#default_value' => empty($content['value']) ? (!empty($options['default']['dc.contributor']['value']) ? $options['default']['dc.contributor']['value'] : '') : $content['value'],
-    '#size' => 60,
-    '#maxlength' => variable_get('nodewords_max_size', 350),
+    '#cols' => 60,
+    '#rows' => 2,
+    '#wysiwyg' => FALSE,
   );
 }
 
