From 1f06314d6e2f1f90173a541f7bec3b366f8c01a9 Mon Sep 17 00:00:00 2001
From: Melissa Miller <miller.2676@osu.edu>
Date: Fri, 12 Oct 2018 15:58:40 -0700
Subject: [PATCH] 7.x-1.9 Release Candidate 4

---
 profiles/wcm_base/CHANGELOG.txt               |    9 +
 .../contrib/redirect/redirect.admin.inc       |    5 +
 .../modules/contrib/redirect/redirect.info    |    5 +-
 .../modules/contrib/redirect/redirect.module  |   21 +-
 .../contrib/search_api_solr/CHANGELOG.txt     |   20 +
 .../search_api_solr/includes/document.inc     |  118 +-
 .../search_api_solr/includes/service.inc      |  294 ++-
 .../search_api_solr/search_api_solr.info      |    7 +-
 .../search_api_solr/search_api_solr.module    |    2 +-
 .../solr-conf/5.x/solrconfig.xml              |    2 +-
 .../search_api_solr/solr-conf/7.x/elevate.xml |   31 +
 .../solr-conf/7.x/mapping-ISOLatin1Accent.txt |   14 +
 .../solr-conf/7.x/protwords.txt               |    7 +
 .../search_api_solr/solr-conf/7.x/schema.xml  |  693 +++++++
 .../solr-conf/7.x/schema_extra_fields.xml     |   23 +
 .../solr-conf/7.x/schema_extra_types.xml      |   34 +
 .../solr-conf/7.x/solrconfig.xml              | 1793 +++++++++++++++++
 .../solr-conf/7.x/solrconfig_extra.xml        |   80 +
 .../solr-conf/7.x/solrcore.properties         |   20 +
 .../solr-conf/7.x/stopwords.txt               |    4 +
 .../solr-conf/7.x/synonyms.txt                |    3 +
 .../modules/custom/ocio_news/ocio_news.module |    2 +-
 .../custom/ocio_web_form/ocio_web_form.module |    4 +-
 .../custom/wcm_suppress_headers/README.md     |    5 +
 .../wcm_suppress_headers.info                 |    4 +
 .../wcm_suppress_headers.module               |   10 +
 .../panopoly/panopoly_admin/CHANGELOG.txt     |    4 +
 .../panopoly_admin/panopoly_admin.info        |    6 +-
 .../panopoly/panopoly_core/CHANGELOG.txt      |    4 +
 .../panopoly/panopoly_core/panopoly_core.info |    6 +-
 .../panopoly/panopoly_magic/CHANGELOG.txt     |    4 +
 .../panopoly_magic/panopoly_magic.info        |    6 +-
 .../panopoly_magic/panopoly_magic.module      |    3 +
 .../panopoly/panopoly_pages/CHANGELOG.txt     |    4 +
 .../panopoly_pages/panopoly_pages.info        |    6 +-
 .../panopoly/panopoly_search/CHANGELOG.txt    |    4 +
 .../panopoly_search/panopoly_search.info      |    6 +-
 .../panopoly_search/panopoly_search.make      |    2 +-
 .../panopoly/panopoly_test/CHANGELOG.txt      |    4 +
 .../panopoly/panopoly_test/panopoly_test.info |    6 +-
 .../panopoly/panopoly_theme/CHANGELOG.txt     |    4 +
 .../panopoly_theme/panopoly_theme.info        |    6 +-
 .../panopoly/panopoly_widgets/CHANGELOG.txt   |    4 +
 .../panopoly_widgets/panopoly_widgets.info    |    6 +-
 profiles/wcm_base/wcm_base.info               |    1 +
 profiles/wcm_base/wcm_base.make               |   24 +-
 46 files changed, 3165 insertions(+), 155 deletions(-)
 create mode 100644 profiles/wcm_base/modules/contrib/search_api_solr/solr-conf/7.x/elevate.xml
 create mode 100644 profiles/wcm_base/modules/contrib/search_api_solr/solr-conf/7.x/mapping-ISOLatin1Accent.txt
 create mode 100644 profiles/wcm_base/modules/contrib/search_api_solr/solr-conf/7.x/protwords.txt
 create mode 100644 profiles/wcm_base/modules/contrib/search_api_solr/solr-conf/7.x/schema.xml
 create mode 100644 profiles/wcm_base/modules/contrib/search_api_solr/solr-conf/7.x/schema_extra_fields.xml
 create mode 100644 profiles/wcm_base/modules/contrib/search_api_solr/solr-conf/7.x/schema_extra_types.xml
 create mode 100644 profiles/wcm_base/modules/contrib/search_api_solr/solr-conf/7.x/solrconfig.xml
 create mode 100644 profiles/wcm_base/modules/contrib/search_api_solr/solr-conf/7.x/solrconfig_extra.xml
 create mode 100644 profiles/wcm_base/modules/contrib/search_api_solr/solr-conf/7.x/solrcore.properties
 create mode 100644 profiles/wcm_base/modules/contrib/search_api_solr/solr-conf/7.x/stopwords.txt
 create mode 100644 profiles/wcm_base/modules/contrib/search_api_solr/solr-conf/7.x/synonyms.txt
 create mode 100644 profiles/wcm_base/modules/custom/wcm_suppress_headers/README.md
 create mode 100644 profiles/wcm_base/modules/custom/wcm_suppress_headers/wcm_suppress_headers.info
 create mode 100644 profiles/wcm_base/modules/custom/wcm_suppress_headers/wcm_suppress_headers.module

diff --git a/profiles/wcm_base/CHANGELOG.txt b/profiles/wcm_base/CHANGELOG.txt
index 6a48cd15..3b5757d0 100644
--- a/profiles/wcm_base/CHANGELOG.txt
+++ b/profiles/wcm_base/CHANGELOG.txt
@@ -1,3 +1,12 @@
+WCM Base 7.x-1.9-rc4, 2018-10-12
+--------------------------------
+- WCM Base:
+  - Updated Panopoly to 1.56.
+  - Updated Search API to 1.25.
+  - Updated Search API Solr Search to 1.14. (Security Update)
+  - Updated Search API Database Search to 1.17.
+  – Add WCM Suppress Headers module.
+
 WCM Base 7.x-1.9-rc3, 2018-08-29
 --------------------------------
 - WCM Base:
diff --git a/profiles/wcm_base/modules/contrib/redirect/redirect.admin.inc b/profiles/wcm_base/modules/contrib/redirect/redirect.admin.inc
index 7104dff9..2e6895c0 100644
--- a/profiles/wcm_base/modules/contrib/redirect/redirect.admin.inc
+++ b/profiles/wcm_base/modules/contrib/redirect/redirect.admin.inc
@@ -626,6 +626,11 @@ function redirect_settings_form($form, &$form_state) {
     '#default_value' => variable_get('redirect_passthrough_querystring', 1),
     '#description' => t('For example, given a redirect from %source to %redirect, if a user visits %sourcequery they would be redirected to %redirectquery. The query strings in the redirection will always take precedence over the current query string.', array('%source' => 'source-path', '%redirect' => 'node?a=apples', '%sourcequery' => 'source-path?a=alligators&b=bananas', '%redirectquery' => 'node?a=apples&b=bananas')),
   );
+  $form['redirect_delete_by_source_path'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Automatically delete redirects when an entity with the redirect\'s source has been deleted.'),
+    '#default_value' => variable_get('redirect_delete_by_source_path', TRUE),
+  );
   $form['redirect_warning'] = array(
     '#type' => 'checkbox',
     '#title' => t('Display a warning message to users when they are redirected.'),
diff --git a/profiles/wcm_base/modules/contrib/redirect/redirect.info b/profiles/wcm_base/modules/contrib/redirect/redirect.info
index dee8604f..70be3534 100644
--- a/profiles/wcm_base/modules/contrib/redirect/redirect.info
+++ b/profiles/wcm_base/modules/contrib/redirect/redirect.info
@@ -14,9 +14,8 @@ files[] = views/redirect_handler_field_redirect_link_delete.inc
 configure = admin/config/search/redirect/settings
 suggests[] = mpac
 
-; Information added by Drupal.org packaging script on 2015-10-03
+; Information added by Drupal.org packaging script on 2018-10-09
 version = "7.x-2.x-dev"
 core = "7.x"
 project = "redirect"
-datestamp = "1443904740"
-
+datestamp = "1539124987"
diff --git a/profiles/wcm_base/modules/contrib/redirect/redirect.module b/profiles/wcm_base/modules/contrib/redirect/redirect.module
index 769a998e..62e52423 100644
--- a/profiles/wcm_base/modules/contrib/redirect/redirect.module
+++ b/profiles/wcm_base/modules/contrib/redirect/redirect.module
@@ -37,6 +37,7 @@ function redirect_entity_info() {
     'entity keys' => array(
       'id' => 'rid',
       'bundle' => 'type',
+      'language' => 'language',
     ),
     'fieldable' => FALSE,
     'uuid' => FALSE,
@@ -950,8 +951,10 @@ function redirect_delete_by_path($path) {
   $query = db_select('redirect');
   $query->addField('redirect', 'rid');
   $query_or = db_or();
-  $query_or->condition('source', db_like($path), 'LIKE');
-  $query_or->condition('source', db_like($path . '/') . '%', 'LIKE');
+  if (variable_get('redirect_delete_by_source_path', TRUE)) {
+    $query_or->condition('source', db_like($path), 'LIKE');
+    $query_or->condition('source', db_like($path . '/') . '%', 'LIKE');
+  }
   $query_or->condition('redirect', db_like($path), 'LIKE');
   $query_or->condition('redirect', db_like($path . '/') . '%', 'LIKE');
   $query->condition($query_or);
@@ -1560,13 +1563,13 @@ function redirect_parse_url($url) {
 
 function redirect_status_code_options($code = NULL) {
   $codes = array(
-    300 => t('300 Multiple Choices'),
-    301 => t('301 Moved Permanently'),
-    302 => t('302 Found'),
-    303 => t('303 See Other'),
-    304 => t('304 Not Modified'),
-    305 => t('305 Use Proxy'),
-    307 => t('307 Temporary Redirect'),
+    300 => '300 ' . t('Multiple Choices'),
+    301 => '301 ' . t('Moved Permanently'),
+    302 => '302 ' . t('Found'),
+    303 => '303 ' . t('See Other'),
+    304 => '304 ' . t('Not Modified'),
+    305 => '305 ' . t('Use Proxy'),
+    307 => '307 ' . t('Temporary Redirect'),
   );
   return isset($codes[$code]) ? $codes[$code] : $codes;
 }
diff --git a/profiles/wcm_base/modules/contrib/search_api_solr/CHANGELOG.txt b/profiles/wcm_base/modules/contrib/search_api_solr/CHANGELOG.txt
index 68fe9882..a730632d 100644
--- a/profiles/wcm_base/modules/contrib/search_api_solr/CHANGELOG.txt
+++ b/profiles/wcm_base/modules/contrib/search_api_solr/CHANGELOG.txt
@@ -1,3 +1,23 @@
+Search API Solr Search 1.x, dev (xxxx-xx-xx):
+---------------------------------------------
+- #3003819 by mandclu, drunken monkey: Added support for indexing nested
+  documents.
+
+Search API Solr Search 1.13 (2018-09-17):
+-----------------------------------------
+- #2998931 by drunken monkey, mahipal46: Fixed warning during excerpt creation.
+- #2459457 by das-peter, drunken monkey, ruloweb, SpadXIII, mkalkbrenner: Added
+  support for the "(not) between" operator.
+- #2970829 by donquixote, drunken monkey: Fixed "missing" facet in PHP 7.
+- #2916951 by drunken monkey, mkalkbrenner, osopolar, jcnventura, arcadLemon,
+  Siridivi: Added support for Solr 7.x.
+- #2949293 by Novitsh: Fixed path to README.txt on multilingual sites.
+- #2900308 by cgoffin, drunken monkey: Fixed retrieval of multi-valued date
+  fields in results.
+- #2824956 by lex0r, drunken monkey: Added support for atomic updates on API
+  level.
+- #2867076 by Sardis: Fixed Solr config name for Solr 5.x.
+
 Search API Solr Search 1.12 (2017-02-23):
 -----------------------------------------
 - #2612770 by Temoor, drunken monkey: Fixed conjunction in complex filter
diff --git a/profiles/wcm_base/modules/contrib/search_api_solr/includes/document.inc b/profiles/wcm_base/modules/contrib/search_api_solr/includes/document.inc
index 010744f5..735488e7 100644
--- a/profiles/wcm_base/modules/contrib/search_api_solr/includes/document.inc
+++ b/profiles/wcm_base/modules/contrib/search_api_solr/includes/document.inc
@@ -96,6 +96,20 @@ class SearchApiSolrDocument implements IteratorAggregate {
    */
   protected $fieldBoosts = array();
 
+  /**
+   * Document field update values, indexed by name.
+   *
+   * @var array
+   */
+  protected $fieldUpdates = array();
+
+  /**
+   * Document nested objects.
+   *
+   * @var SearchApiSolrDocument[]
+   */
+  protected $nestedObjects = array();
+
   /**
    * Clears all boosts and fields from this document.
    */
@@ -104,6 +118,8 @@ class SearchApiSolrDocument implements IteratorAggregate {
 
     $this->fields = array();
     $this->fieldBoosts = array();
+    $this->fieldUpdates = array();
+    $this->nestedObjects = array();
   }
 
   /**
@@ -262,6 +278,42 @@ class SearchApiSolrDocument implements IteratorAggregate {
     return $this->fieldBoosts;
   }
 
+  /**
+   * Gets the currently set field's 'update' attribute for a document field.
+   *
+   * @param string $key
+   *   The name of the field.
+   *
+   * @return string|false
+   *   The currently set field's update attribute, or FALSE if none was set.
+   */
+  public function getFieldUpdate($key) {
+    return isset($this->fieldUpdates[$key]) ? $this->fieldUpdates[$key] : FALSE;
+  }
+
+  /**
+   * Sets the field's 'update' attribute for a document field.
+   *
+   * @param string $key
+   *   The name of the field.
+   * @param string|false $update
+   *   One of the allowed update values ('add', 'set', 'inc').
+   */
+  public function setFieldUpdate($key, $update) {
+    $this->fieldUpdates[$key] = $update;
+  }
+
+  /**
+   * Retrieves all currently set field updates.
+   *
+   * @return string[]
+   *   Associative array of field's "update" attributes that were set, keyed by
+   *   field name.
+   */
+  public function getFieldUpdates() {
+    return $this->fieldUpdates;
+  }
+
   /**
    * Gets the names of all fields in this document.
    *
@@ -282,6 +334,29 @@ class SearchApiSolrDocument implements IteratorAggregate {
     return array_values($this->fields);
   }
 
+  /**
+   * Retrieves the nested documents set on this document.
+   *
+   * @return \SearchApiSolrDocument[]
+   *   The nested documents.
+   */
+  public function getNestedObjects() {
+    return $this->nestedObjects;
+  }
+
+  /**
+   * Sets an array of nested documents.
+   *
+   * Populate nested documents for use with block join queries. Note that this
+   * will lead to errors when used with Solr versions older than 4.5.
+   *
+   * @param SearchApiSolrDocument[] $nested_documents
+   *   An array of SearchApiSolrDocument objects.
+   */
+  public function setNestedDocuments(array $nested_documents) {
+    $this->nestedObjects = $nested_documents;
+  }
+
   /**
    * Implements IteratorAggregate::getIterator().
    *
@@ -380,35 +455,45 @@ class SearchApiSolrDocument implements IteratorAggregate {
 
     $xml .= '>';
 
-    foreach ($this->fields as $key => $value) {
+    foreach ($this->fields as $key => $values) {
       $fieldBoost = $this->getFieldBoost($key);
+      $fieldUpdate = $this->getFieldUpdate($key);
       $key = htmlspecialchars($key, ENT_COMPAT, 'UTF-8');
 
-      if (is_array($value)) {
-        foreach ($value as $multivalue) {
-          $xml .= '<field name="' . $key . '"';
-
-          if ($fieldBoost !== FALSE) {
-            $xml .= ' boost="' . $fieldBoost . '"';
-
-            // Only set the boost for the first field in the set.
-            $fieldBoost = FALSE;
-          }
-
-          $xml .= '>' . htmlspecialchars($multivalue, ENT_NOQUOTES, 'UTF-8') . '</field>';
-        }
+      if (!is_array($values)) {
+        $values = array($values);
       }
-      else {
+
+      foreach ($values as $value) {
         $xml .= '<field name="' . $key . '"';
 
         if ($fieldBoost !== FALSE) {
           $xml .= ' boost="' . $fieldBoost . '"';
+
+          // Only set the boost for the first field in the set.
+          $fieldBoost = FALSE;
+        }
+
+        if ($fieldUpdate !== FALSE) {
+          $xml .= ' update="' . $fieldUpdate . '"';
         }
 
         $xml .= '>' . htmlspecialchars($value, ENT_NOQUOTES, 'UTF-8') . '</field>';
       }
     }
 
+    // If nested objects have been added, include them in the XML to be indexed.
+    foreach ($this->nestedObjects as $object) {
+      // Skip any documents that aren't of the correct type.
+      if (!($object instanceof SearchApiSolrDocument)) {
+        $vars['@type'] = is_object($object) ? get_class($object) : gettype($object);
+        watchdog('search_api_solr', 'Attempt to add an invalid nested Solr document of type @type.', $vars, WATCHDOG_ERROR);
+        continue;
+      }
+      // Generate the markup for each nested document.
+      $xml .= $object->toXml();
+    }
+
     $xml .= '</doc>';
 
     // Remove any control characters to avoid Solr XML parser exception.
@@ -432,4 +517,5 @@ class SearchApiSolrDocument implements IteratorAggregate {
     // Printable utf-8 does not include any of these chars below x7F
     return preg_replace('@[\x00-\x08\x0B\x0C\x0E-\x1F]@', ' ', $string);
   }
-}
\ No newline at end of file
+
+}
diff --git a/profiles/wcm_base/modules/contrib/search_api_solr/includes/service.inc b/profiles/wcm_base/modules/contrib/search_api_solr/includes/service.inc
index e80b35fa..6c9765b9 100644
--- a/profiles/wcm_base/modules/contrib/search_api_solr/includes/service.inc
+++ b/profiles/wcm_base/modules/contrib/search_api_solr/includes/service.inc
@@ -336,6 +336,7 @@ class SearchApiSolrService extends SearchApiAbstractService {
     // First, check the features we always support.
     $supported = drupal_map_assoc(array(
       'search_api_autocomplete',
+      'search_api_between',
       'search_api_facets',
       'search_api_facets_operator_or',
       'search_api_grouping',
@@ -646,9 +647,17 @@ class SearchApiSolrService extends SearchApiAbstractService {
    * This has to consist of both index and item ID. Optionally, the site hash is
    * also included.
    *
+   * @param string $index_id
+   *   The search index's machine name.
+   * @param mixed $item_id
+   *   The Search API item ID of the item.
+   *
+   * @return string
+   *   The Solr ID to use for this item.
+   *
    * @see search_api_solr_site_hash()
    */
-  protected function createId($index_id, $item_id) {
+  public function createId($index_id, $item_id) {
     $site_hash = !empty($this->options['site_hash']) ? search_api_solr_site_hash() . '-' : '';
     return "$site_hash$index_id-$item_id";
   }
@@ -1303,14 +1312,15 @@ class SearchApiSolrService extends SearchApiAbstractService {
       // SearchApiSolrService::getFieldNames().
       foreach ($fields as $search_api_property => $solr_property) {
         if (isset($doc->{$solr_property})) {
-          $result['fields'][$search_api_property] = $doc->{$solr_property};
+          $value = $doc->{$solr_property};
           // Date fields need some special treatment to become valid date values
           // (i.e., timestamps) again.
           if (isset($field_options[$search_api_property]['type'])
-              && $field_options[$search_api_property]['type'] == 'date'
-              && preg_match('/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z$/', $result['fields'][$search_api_property])) {
-            $result['fields'][$search_api_property] = strtotime($result['fields'][$search_api_property]);
+              && search_api_extract_inner_type($field_options[$search_api_property]['type']) === 'date'
+              && preg_match('/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z$/', $value)) {
+            $value = is_array($value) ? array_map('strtotime', $value) : strtotime($value);
           }
+          $result['fields'][$search_api_property] = $value;
         }
       }
 
@@ -1338,7 +1348,7 @@ class SearchApiSolrService extends SearchApiAbstractService {
 
       $index_id = $this->getIndexId($index->machine_name);
       $solr_id = $this->createId($index_id, $result['id']);
-      $excerpt = $this->getExcerpt($response, $solr_id, $result['fields'], $fields);
+      $excerpt = $this->getExcerpt($response, $solr_id, $result['fields'], $fields, $query->getFields());
       if ($excerpt) {
         $result['excerpt'] = $excerpt;
       }
@@ -1364,53 +1374,87 @@ class SearchApiSolrService extends SearchApiAbstractService {
    * Will also use highlighted fields to replace retrieved field data, if the
    * corresponding option is set.
    */
-  protected function getExcerpt($response, $id, array &$fields, array $field_mapping) {
+  protected function getExcerpt($response, $id, array &$fields, array $field_mapping, array $fulltext_fields) {
     if (!isset($response->highlighting->$id)) {
       return FALSE;
     }
     $output = '';
+    $highlighting = $response->highlighting->$id;
 
-    if (!empty($this->options['excerpt']) && !empty($response->highlighting->$id->content)) {
-      foreach ($response->highlighting->$id->content as $snippet) {
-        $snippet = strip_tags($snippet);
-        $snippet = preg_replace('/^.*>|<.*$/', '', $snippet);
-        $snippet = check_plain($snippet);
-        $snippet = $this->formatHighlighting($snippet);
-        // The created fragments sometimes have leading or trailing punctuation.
-        // We remove that here for all common cases, but take care not to remove
-        // < or > (so HTML tags stay valid).
-        $snippet = trim($snippet, "\00..\x2F:;=\x3F..\x40\x5B..\x60");
-        $output .= $snippet . ' … ';
-      }
-    }
-    if (!empty($this->options['highlight_data'])) {
-      $prefix = variable_get('search_api_solr_highlight_prefix', 'tm_');
-      $prefix_length = strlen($prefix);
-      foreach ($field_mapping as $search_api_property => $solr_property) {
-        if (substr($solr_property, 0, $prefix_length) == $prefix && !empty($response->highlighting->$id->$solr_property)) {
-          $value = $response->highlighting->$id->$solr_property;
-          $value = $this->sanitizeHighlightValue($value, $search_api_property);
-          // Remove highlight prefixes and suffixes so we could compare values
-          // in order to replace the correspond items.
-          $orig_value = preg_replace('#\[(/?)HIGHLIGHT\]#', '', $value);
-          $field_values = $this->sanitizeHighlightValue($fields[$search_api_property]);
-          foreach ($field_values as $delta => $field_value) {
-            foreach ($orig_value as $num => $item) {
-              if ($item === $field_value) {
-                $field_values[$delta] = $this->formatHighlighting($value[$num]);
-                $change = TRUE;
-                continue 2;
-              }
-            }
+    $highlight_fields = !empty($this->options['highlight_data']);
+    $create_excerpt = !empty($this->options['excerpt']);
+    if (!$highlight_fields && !$create_excerpt) {
+      return FALSE;
+    }
+
+    // Collect highlighted field values for the excerpt and set them in the
+    // field values, if requested.
+    $excerpt_parts = array();
+    $field_mapping = array_flip($field_mapping);
+    $fulltext_fields = drupal_map_assoc($fulltext_fields);
+    foreach ($highlighting as $solr_property => $values) {
+      $values = (array) $values;
+      if (empty($field_mapping[$solr_property])) {
+        continue;
+      }
+      $search_api_property = $field_mapping[$solr_property];
+
+      // Only use fields that were actually searched for the excerpt.
+      if (isset($fulltext_fields[$search_api_property])) {
+        // Remember the highlighted value so we can use it for the excerpt, if
+        // requested.
+        $excerpt_parts = array_merge($excerpt_parts, $values);
+      }
+
+      if (!$highlight_fields) {
+        continue;
+      }
+
+      $values = $this->sanitizeHighlightValue($values, $search_api_property);
+      // Remove highlight prefixes and suffixes so we can compare values in
+      // order to replace the corresponding items.
+      $orig_values = preg_replace('#\[(/?)HIGHLIGHT\]#', '', $values);
+      $field_values = array();
+      if (!empty($fields[$search_api_property])) {
+        $field_values = $this->sanitizeHighlightValue($fields[$search_api_property]);
+      }
+      foreach ($field_values as $delta => $field_value) {
+        foreach ($orig_values as $num => $item) {
+          if ($item === $field_value) {
+            $field_values[$delta] = $this->formatHighlighting($values[$num]);
+            $change = TRUE;
+            continue 2;
           }
-          if (!empty($change)) {
-            $fields[$search_api_property] = array(
-              '#value' => $field_values,
-              '#sanitize_callback' => FALSE,
-            );
+        }
+      }
+      if (!empty($change)) {
+        $fields[$search_api_property] = array(
+          '#value' => $field_values,
+          '#sanitize_callback' => FALSE,
+        );
+      }
+    }
+
+    // Create an excerpt, if requested.
+    if ($create_excerpt && $excerpt_parts) {
+      $excerpt = array();
+      $excerpt_length = 0;
+      foreach ($excerpt_parts as $value) {
+        // Excerpts don't have HTML (except for the highlighting tags, of
+        // course).
+        $value = strip_tags($value);
+        foreach ($this->extractHighlightingSnippets($value) as $snippet) {
+          $excerpt[] = $snippet;
+          $excerpt_length += drupal_strlen($snippet);
+          // Restrict ourselves to three snippets or 300 characters.
+          if (count($excerpt) >= 3 || $excerpt_length >= 300) {
+            break 2;
           }
         }
       }
+      if ($excerpt) {
+        $output = implode(' … ', $excerpt) . ' …';
+      }
     }
 
     return $output;
@@ -1450,6 +1494,84 @@ class SearchApiSolrService extends SearchApiAbstractService {
     return preg_replace('#\[(/?)HIGHLIGHT\]#', '<$1strong>', $snippet);
   }
 
+  /**
+   * Extracts short snippets with highlighting from highlighted field values.
+   *
+   * @param string $value
+   *   A highlighted field value.
+   *
+   * @return string[]
+   *   An array of short, highlighted snippets extracted from the field value.
+   */
+  protected function extractHighlightingSnippets($value) {
+    $snippets = array();
+    $parts = preg_split('#\[/?HIGHLIGHT\]#', $value);
+    $i = 0;
+    $combined_length = 0;
+    while (isset($parts[$i + 2])) {
+      $prefix = $parts[$i];
+      $short_prefix = FALSE;
+      $key = $parts[++$i];
+      $suffix = $parts[++$i];
+
+      // Make sure prefix and suffix are not too long.
+      $length = drupal_strlen($prefix);
+      if ($length > 30) {
+        $space = strrpos(substr($prefix, 0, -25), ' ');
+        // Fall back to just cutting at an arbitrary position, space or no.
+        if ($space === FALSE) {
+          $space = $length - 30;
+        }
+        $prefix = substr($prefix, $space + 1);
+      }
+      else {
+        $short_prefix = TRUE;
+      }
+
+      $length = drupal_strlen($suffix);
+      if ($length > 30) {
+        $space = strpos($suffix, ' ', 25);
+        // Fall back to just cutting at an arbitrary position, space or no.
+        if ($space === FALSE) {
+          $space = 30;
+        }
+        $suffix = substr($suffix, 0, $space);
+      }
+
+      // Fuse two snippets if they are separated by less than 30 characters.
+      $previous = NULL;
+      if ($short_prefix) {
+        $previous = array_pop($snippets);
+        if ($previous) {
+          $prefix = '';
+        }
+      }
+      $snippet = $prefix . '[HIGHLIGHT]' . $key . '[/HIGHLIGHT]' . $suffix;
+
+      // Sanitize and format the snippet.
+      $snippet = check_plain($snippet);
+      $snippet = $this->formatHighlighting($snippet);
+      // The created fragments sometimes have leading or trailing punctuation.
+      // We remove that here for all common cases, but take care not to remove
+      // < or > (so HTML tags stay valid).
+      $snippet = trim($snippet, "\00..\x2F:;=\x3F..\x40\x5B..\x60");
+
+      // Prepend the previous snippet if we're fusing.
+      if ($previous) {
+        $snippet = $previous . $snippet;
+      }
+
+      $snippets[] = $snippet;
+      $combined_length += drupal_strlen($snippet);
+
+      // Restrict ourselves to three snippets or 300 characters.
+      if (count($snippets) >= 3 || $combined_length >= 300) {
+        break;
+      }
+    }
+    return $snippets;
+  }
+
   /**
    * Extract facets from a Solr response.
    *
@@ -1474,18 +1596,21 @@ class SearchApiSolrService extends SearchApiAbstractService {
     if (isset($response->facet_counts->facet_fields)) {
       $facet_fields = $response->facet_counts->facet_fields;
 
+      // The key for the "missing" facet (empty string in the JSON). This will
+      // be either "" or "_empty_", depending on the PHP version.
+      $empty_key = key((array) json_decode('{"":5}'));
       foreach ($extract_facets as $delta => $info) {
         $field = $fields[$info['field']];
         if (!empty($facet_fields->$field)) {
           $min_count = $info['min_count'];
           $terms = $facet_fields->$field;
           if ($info['missing']) {
-            // We have to correctly incorporate the "_empty_" term.
+            // We have to correctly incorporate the "missing" term ($empty_key).
             // This will ensure that the term with the least results is dropped,
             // if the limit would be exceeded.
-            if (isset($terms->_empty_)) {
-              if ($terms->_empty_ < $min_count) {
-                unset($terms->_empty_);
+            if (isset($terms->$empty_key)) {
+              if ($terms->$empty_key < $min_count) {
+                unset($terms->$empty_key);
               }
               else {
                 $terms = (array) $terms;
@@ -1496,14 +1621,14 @@ class SearchApiSolrService extends SearchApiAbstractService {
               }
             }
           }
-          elseif (isset($terms->_empty_)) {
+          elseif (isset($terms->$empty_key)) {
             $terms = clone $terms;
-            unset($terms->_empty_);
+            unset($terms->$empty_key);
           }
           $type = isset($index->options['fields'][$info['field']]['type']) ? search_api_extract_inner_type($index->options['fields'][$info['field']]['type']) : 'string';
           foreach ($terms as $term => $count) {
             if ($count >= $min_count) {
-              if ($term === '_empty_') {
+              if ($term === $empty_key) {
                 $term = '!';
               }
               elseif ($type == 'boolean') {
@@ -1691,8 +1816,19 @@ class SearchApiSolrService extends SearchApiAbstractService {
     if ($value === NULL) {
       return ($operator == '=' ? '*:* AND -' : '') . "$field:[* TO *]";
     }
-    $value = $this->formatFilterValue($value, search_api_extract_inner_type($field_info['type']));
-    switch ($operator) {
+
+    $type = search_api_extract_inner_type($field_info['type']);
+    if (!is_array($value)) {
+      $value = $this->formatFilterValue($value, $type);
+    }
+    else {
+      foreach($value as &$val) {
+        $val = $this->formatFilterValue($val, $type);
+      }
+      unset($val);
+    }
+
+    switch (strtoupper($operator)) {
       case '<>':
         return "*:* AND -($field:$value)";
       case '<':
@@ -1703,6 +1839,10 @@ class SearchApiSolrService extends SearchApiAbstractService {
         return "$field:[$value TO *]";
       case '>':
         return "$field:{{$value} TO *}";
+      case 'BETWEEN':
+        return "$field:[{$value[0]} TO {$value[1]}]";
+      case 'NOT BETWEEN':
+        return "*:* AND -$field:[{$value[0]} TO {$value[1]}]";
 
       default:
         return "$field:$value";
@@ -1794,29 +1934,11 @@ class SearchApiSolrService extends SearchApiAbstractService {
 
     if (!empty($this->options['excerpt']) || !empty($this->options['highlight_data'])) {
       $highlight_params['hl'] = 'true';
-      $highlight_params['hl.fl'] = 'content';
+      $highlight_params['hl.fl'] = variable_get('search_api_solr_highlight_prefix', 'tm_') . '*';
       $highlight_params['hl.simple.pre'] = '[HIGHLIGHT]';
       $highlight_params['hl.simple.post'] = '[/HIGHLIGHT]';
-      $highlight_params['hl.snippets'] = 3;
-      $highlight_params['hl.fragsize'] = 70;
-      $highlight_params['hl.mergeContiguous'] = 'true';
-    }
-
-    if (!empty($this->options['highlight_data'])) {
-      $highlight_params['hl.fl'] = variable_get('search_api_solr_highlight_prefix', 'tm_') . '*';
       $highlight_params['hl.snippets'] = 1;
       $highlight_params['hl.fragsize'] = 0;
-      if (!empty($this->options['excerpt'])) {
-        // If we also generate a "normal" excerpt, set the settings for the
-        // "content" field (which we use to generate the excerpt) back to the
-        // above values.
-        $highlight_params['f.content.hl.snippets'] = 3;
-        $highlight_params['f.content.hl.fragsize'] = 70;
-        // It regrettably doesn't seem to be possible to set hl.fl to several
-        // values, if one contains wild cards (i.e., "t_*,content" wouldn't
-        // work).
-        $highlight_params['hl.fl'] = '*';
-      }
     }
 
     return $highlight_params;
@@ -2252,18 +2374,19 @@ class SearchApiSolrService extends SearchApiAbstractService {
       $solr_id = $this->createId($doc->index_id, $doc->item_id);
       foreach ($fields as $search_api_property => $solr_property) {
         if (isset($doc->{$solr_property})) {
-          $result['fields'][$search_api_property] = $doc->{$solr_property};
+          $value = $doc->{$solr_property};
           // Date fields need some special treatment to become valid date values
           // (i.e., timestamps) again.
           if (isset($field_options[$search_api_property]['type'])
-              && $field_options[$search_api_property]['type'] == 'date'
-              && preg_match('/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z$/', $result['fields'][$search_api_property])) {
-            $result['fields'][$search_api_property] = strtotime($result['fields'][$search_api_property]);
+              && search_api_extract_inner_type($field_options[$search_api_property]['type']) === 'date'
+              && preg_match('/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z$/', $value)) {
+            $value = is_array($value) ? array_map('strtotime', $value) : strtotime($value);
           }
+          $result['fields'][$search_api_property] = $value;
         }
       }
 
-      $excerpt = $this->getExcerpt($response, $solr_id, $result['fields'], $fields);
+      $excerpt = $this->getExcerpt($response, $solr_id, $result['fields'], $fields, $search_fields);
       if ($excerpt) {
         $result['excerpt'] = $excerpt;
       }
@@ -2280,18 +2403,21 @@ class SearchApiSolrService extends SearchApiAbstractService {
     if (isset($response->facet_counts->facet_fields)) {
       $results['search_api_facets'] = array();
       $facet_fields = $response->facet_counts->facet_fields;
+      // The key for the "missing" facet (empty string in the JSON). This will
+      // be either "" or "_empty_", depending on the PHP version.
+      $empty_key = key((array) json_decode('{"":5}'));
       foreach ($facets as $delta => $info) {
         $field = $solr_fields[$info['field']];
         if (!empty($facet_fields->$field)) {
           $min_count = $info['min_count'];
           $terms = $facet_fields->$field;
           if ($info['missing']) {
-            // We have to correctly incorporate the "_empty_" term.
+            // We have to correctly incorporate the "missing" term ($empty_key).
             // This will ensure that the term with the least results is dropped,
             // if the limit would be exceeded.
-            if (isset($terms->_empty_)) {
-              if ($terms->_empty_ < $min_count) {
-                unset($terms->_empty_);
+            if (isset($terms->$empty_key)) {
+              if ($terms->$empty_key < $min_count) {
+                unset($terms->$empty_key);
               }
               else {
                 $terms = (array) $terms;
@@ -2302,14 +2428,14 @@ class SearchApiSolrService extends SearchApiAbstractService {
               }
             }
           }
-          elseif (isset($terms->_empty_)) {
+          elseif (isset($terms->$empty_key)) {
             $terms = clone $terms;
-            unset($terms->_empty_);
+            unset($terms->$empty_key);
           }
           $type = isset($fields[$info['field']]['type']) ? search_api_extract_inner_type($fields[$info['field']]['type']) : 'string';
           foreach ($terms as $term => $count) {
             if ($count >= $min_count) {
-              if ($term === '_empty_') {
+              if ($term === $empty_key) {
                 $term = '!';
               }
               elseif ($type == 'boolean') {
diff --git a/profiles/wcm_base/modules/contrib/search_api_solr/search_api_solr.info b/profiles/wcm_base/modules/contrib/search_api_solr/search_api_solr.info
index 0ea0d30c..102b9bf2 100644
--- a/profiles/wcm_base/modules/contrib/search_api_solr/search_api_solr.info
+++ b/profiles/wcm_base/modules/contrib/search_api_solr/search_api_solr.info
@@ -11,9 +11,8 @@ files[] = includes/solr_connection.interface.inc
 files[] = includes/solr_field.inc
 files[] = includes/spellcheck.inc
 
-; Information added by Drupal.org packaging script on 2017-02-23
-version = "7.x-1.12"
+; Information added by Drupal.org packaging script on 2018-10-10
+version = "7.x-1.14"
 core = "7.x"
 project = "search_api_solr"
-datestamp = "1487844794"
-
+datestamp = "1539161895"
diff --git a/profiles/wcm_base/modules/contrib/search_api_solr/search_api_solr.module b/profiles/wcm_base/modules/contrib/search_api_solr/search_api_solr.module
index f3d943f9..ba2a24e4 100644
--- a/profiles/wcm_base/modules/contrib/search_api_solr/search_api_solr.module
+++ b/profiles/wcm_base/modules/contrib/search_api_solr/search_api_solr.module
@@ -31,7 +31,7 @@ function search_api_solr_menu() {
 function search_api_solr_search_api_service_info() {
   $variables = array(
     '@solr_wiki_url' => url('http://wiki.apache.org/solr/SolrQuerySyntax'),
-    '@readme_url' => url(drupal_get_path('module', 'search_api_solr') . '/README.txt'),
+    '@readme_url' => file_create_url(drupal_get_path('module', 'search_api_solr') . '/README.txt'),
   );
   $services['search_api_solr_service'] = array(
     'name' => t('Solr service'),
diff --git a/profiles/wcm_base/modules/contrib/search_api_solr/solr-conf/5.x/solrconfig.xml b/profiles/wcm_base/modules/contrib/search_api_solr/solr-conf/5.x/solrconfig.xml
index c378343a..61b898b3 100644
--- a/profiles/wcm_base/modules/contrib/search_api_solr/solr-conf/5.x/solrconfig.xml
+++ b/profiles/wcm_base/modules/contrib/search_api_solr/solr-conf/5.x/solrconfig.xml
@@ -20,7 +20,7 @@
      For more details about configurations options that may appear in
      this file, see http://wiki.apache.org/solr/SolrConfigXml.
 -->
-<config name="drupal-4.3-solr-4.x" >
+<config name="drupal-4.3-solr-5.x">
   <!-- In all configuration below, a prefix of "solr." for class names
        is an alias that causes solr to search appropriate packages,
        including org.apache.solr.(search|update|request|core|analysis)
diff --git a/profiles/wcm_base/modules/contrib/search_api_solr/solr-conf/7.x/elevate.xml b/profiles/wcm_base/modules/contrib/search_api_solr/solr-conf/7.x/elevate.xml
new file mode 100644
index 00000000..71ea0006
--- /dev/null
+++ b/profiles/wcm_base/modules/contrib/search_api_solr/solr-conf/7.x/elevate.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<!--
+ This file allows you to boost certain search items to the top of search
+ results. You can find out an item's ID by searching directly on the Solr
+ server. The item IDs are in general constructed as follows:
+   Search API:
+     $document->id = $index_id . '-' . $item_id;
+   Apache Solr Search Integration:
+     $document->id = $site_hash . '/' . $entity_type . '/' . $entity->id;
+
+ If you want this file to be automatically re-loaded when a Solr commit takes
+ place (e.g., if you have an automatic script active which updates elevate.xml
+ according to newly-indexed data), place it into Solr's data/ directory.
+ Otherwise, place it with the other configuration files into the conf/
+ directory.
+
+ See http://wiki.apache.org/solr/QueryElevationComponent for more information.
+-->
+
+<elevate>
+<!-- Example for ranking the node #1 first in searches for "example query": -->
+<!--
+ <query text="example query">
+  <doc id="default_node_index-1" />
+  <doc id="7v3jsc/node/1" />
+ </query>
+-->
+<!-- Multiple <query> elements can be specified, contained in one <elevate>. -->
+<!-- <query text="...">...</query> -->
+</elevate>
diff --git a/profiles/wcm_base/modules/contrib/search_api_solr/solr-conf/7.x/mapping-ISOLatin1Accent.txt b/profiles/wcm_base/modules/contrib/search_api_solr/solr-conf/7.x/mapping-ISOLatin1Accent.txt
new file mode 100644
index 00000000..b92d03c5
--- /dev/null
+++ b/profiles/wcm_base/modules/contrib/search_api_solr/solr-conf/7.x/mapping-ISOLatin1Accent.txt
@@ -0,0 +1,14 @@
+# This file contains character mappings for the default fulltext field type.
+# The source characters (on the left) will be replaced by the respective target
+# characters before any other processing takes place.
+# Lines starting with a pound character # are ignored.
+#
+# For sensible defaults, use the mapping-ISOLatin1Accent.txt file distributed
+# with the example application of your Solr version.
+#
+# Examples:
+#   "À" => "A"
+#   "\u00c4" => "A"
+#   "\u00c4" => "\u0041"
+#   "æ" => "ae"
+#   "\n" => " "
diff --git a/profiles/wcm_base/modules/contrib/search_api_solr/solr-conf/7.x/protwords.txt b/profiles/wcm_base/modules/contrib/search_api_solr/solr-conf/7.x/protwords.txt
new file mode 100644
index 00000000..cda85814
--- /dev/null
+++ b/profiles/wcm_base/modules/contrib/search_api_solr/solr-conf/7.x/protwords.txt
@@ -0,0 +1,7 @@
+#-----------------------------------------------------------------------
+# This file blocks words from being operated on by the stemmer and word delimiter.
+&amp;
+&lt;
+&gt;
+&#039;
+&quot;
diff --git a/profiles/wcm_base/modules/contrib/search_api_solr/solr-conf/7.x/schema.xml b/profiles/wcm_base/modules/contrib/search_api_solr/solr-conf/7.x/schema.xml
new file mode 100644
index 00000000..de61b0eb
--- /dev/null
+++ b/profiles/wcm_base/modules/contrib/search_api_solr/solr-conf/7.x/schema.xml
@@ -0,0 +1,693 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<!--
+ This is the Solr schema file. This file should be named "schema.xml" and
+ should be in the conf directory under the solr home
+ (i.e. ./solr/conf/schema.xml by default)
+ or located where the classloader for the Solr webapp can find it.
+
+ For more information, on how to customize this file, please see
+ http://wiki.apache.org/solr/SchemaXml
+-->
+
+<schema name="drupal-4.4-solr-7.x" version="1.5">
+    <!-- attribute "name" is the name of this schema and is only used for
+         display purposes. Applications should change this to reflect the nature
+         of the search collection.
+         version="1.2" is Solr's version number for the schema syntax and
+         semantics. It should not normally be changed by applications.
+
+         1.0: multiValued attribute did not exist, all fields are multiValued by
+              nature
+         1.1: multiValued attribute introduced, false by default
+         1.2: omitTermFreqAndPositions attribute introduced, true by default
+              except for text fields.
+         1.3: removed optional field compress feature
+         1.4: autoGeneratePhraseQueries attribute introduced to drive
+              QueryParser behavior when a single string produces multiple
+              tokens. Defaults to off for version >= 1.4
+         1.5: omitNorms defaults to true for primitive field types
+              (int, float, boolean, string...)
+       -->
+
+  <types>
+    <!-- field type definitions. The "name" attribute is
+       just a label to be used by field definitions.  The "class"
+       attribute and any other attributes determine the real
+       behavior of the fieldType.
+         Class names starting with "solr" refer to java classes in the
+       org.apache.solr.analysis package.
+    -->
+
+    <!-- The StrField type is not analyzed, but indexed/stored verbatim.
+       - StrField and TextField support an optional compressThreshold which
+       limits compression (if enabled in the derived fields) to values which
+       exceed a certain size (in characters).
+    -->
+    <fieldType name="string" class="solr.StrField" sortMissingLast="true"/>
+
+    <!-- boolean type: "true" or "false" -->
+    <fieldType name="boolean" class="solr.BoolField" sortMissingLast="true"/>
+    <!--Binary data type. The data should be sent/retrieved in as Base64 encoded Strings -->
+    <fieldtype name="binary" class="solr.BinaryField"/>
+
+    <!-- The optional sortMissingLast and sortMissingFirst attributes are
+         currently supported on types that are sorted internally as strings.
+       - If sortMissingLast="true", then a sort on this field will cause documents
+         without the field to come after documents with the field,
+         regardless of the requested sort order (asc or desc).
+       - If sortMissingFirst="true", then a sort on this field will cause documents
+         without the field to come before documents with the field,
+         regardless of the requested sort order.
+       - If sortMissingLast="false" and sortMissingFirst="false" (the default),
+         then default lucene sorting will be used which places docs without the
+         field first in an ascending sort and last in a descending sort.
+    -->
+
+    <!-- numeric field types that can be sorted, but are not optimized for range queries -->
+    <fieldType name="integer" class="solr.TrieIntField" precisionStep="0" positionIncrementGap="0"/>
+    <fieldType name="float" class="solr.TrieFloatField" precisionStep="0" positionIncrementGap="0"/>
+    <fieldType name="long" class="solr.TrieLongField" precisionStep="0" positionIncrementGap="0"/>
+    <fieldType name="double" class="solr.TrieDoubleField" precisionStep="0" positionIncrementGap="0"/>
+
+    <!--
+      Note:
+      These should only be used for compatibility with existing indexes (created with older Solr versions)
+      or if "sortMissingFirst" or "sortMissingLast" functionality is needed. Use Trie based fields instead.
+
+      Numeric field types that manipulate the value into
+      a string value that isn't human-readable in its internal form,
+      but with a lexicographic ordering the same as the numeric ordering,
+      so that range queries work correctly.
+    -->
+    <fieldType name="sint" class="solr.TrieIntField" sortMissingLast="true"/>
+    <fieldType name="sfloat" class="solr.TrieFloatField" sortMissingLast="true"/>
+    <fieldType name="slong" class="solr.TrieLongField" sortMissingLast="true"/>
+    <fieldType name="sdouble" class="solr.TrieDoubleField" sortMissingLast="true"/>
+
+    <!--
+     Numeric field types that index each value at various levels of precision
+     to accelerate range queries when the number of values between the range
+     endpoints is large. See the javadoc for NumericRangeQuery for internal
+     implementation details.
+
+     Smaller precisionStep values (specified in bits) will lead to more tokens
+     indexed per value, slightly larger index size, and faster range queries.
+     A precisionStep of 0 disables indexing at different precision levels.
+    -->
+    <fieldType name="tint" class="solr.TrieIntField" precisionStep="8" positionIncrementGap="0"/>
+    <fieldType name="tfloat" class="solr.TrieFloatField" precisionStep="8" positionIncrementGap="0"/>
+    <fieldType name="tlong" class="solr.TrieLongField" precisionStep="8" positionIncrementGap="0"/>
+    <fieldType name="tdouble" class="solr.TrieDoubleField" precisionStep="8" positionIncrementGap="0"/>
+
+    <!--
+     The ExternalFileField type gets values from an external file instead of the
+     index. This is useful for data such as rankings that might change frequently
+     and require different update frequencies than the documents they are
+     associated with.
+    -->
+    <fieldType name="file" keyField="id" defVal="1" stored="false" indexed="false" class="solr.ExternalFileField"/>
+
+    <!-- The format for this date field is of the form 1995-12-31T23:59:59Z, and
+         is a more restricted form of the canonical representation of dateTime
+         http://www.w3.org/TR/xmlschema-2/#dateTime
+         The trailing "Z" designates UTC time and is mandatory.
+         Optional fractional seconds are allowed: 1995-12-31T23:59:59.999Z
+         All other components are mandatory.
+
+         Expressions can also be used to denote calculations that should be
+         performed relative to "NOW" to determine the value, ie...
+
+               NOW/HOUR
+                  ... Round to the start of the current hour
+               NOW-1DAY
+                  ... Exactly 1 day prior to now
+               NOW/DAY+6MONTHS+3DAYS
+                  ... 6 months and 3 days in the future from the start of
+                      the current day
+
+         Consult the TrieDateField javadocs for more information.
+
+         Note: For faster range queries, consider the tdate type
+      -->
+    <fieldType name="date" class="solr.TrieDateField" precisionStep="0" positionIncrementGap="0" sortMissingLast="true" omitNorms="true"/>
+
+    <!-- A Trie based date field for faster date range queries and date faceting. -->
+    <fieldType name="tdate" class="solr.TrieDateField" precisionStep="6" positionIncrementGap="0"/>
+
+    <!-- solr.TextField allows the specification of custom text analyzers
+         specified as a tokenizer and a list of token filters. Different
+         analyzers may be specified for indexing and querying.
+
+         The optional positionIncrementGap puts space between multiple fields of
+         this type on the same document, with the purpose of preventing false phrase
+         matching across fields.
+
+         For more info on customizing your analyzer chain, please see
+         http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters
+     -->
+
+    <!-- One can also specify an existing Analyzer class that has a
+         default constructor via the class attribute on the analyzer element
+    <fieldType name="text_greek" class="solr.TextField">
+      <analyzer class="org.apache.lucene.analysis.el.GreekAnalyzer"/>
+    </fieldType>
+    -->
+
+    <!-- A text field that only splits on whitespace for exact matching of words -->
+    <fieldType name="text_ws" class="solr.TextField" omitNorms="true" positionIncrementGap="100">
+      <analyzer>
+        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
+        <filter class="solr.LowerCaseFilterFactory"/>
+      </analyzer>
+    </fieldType>
+
+    <!-- A text field that uses WordDelimiterFilter to enable splitting and matching of
+        words on case-change, alpha numeric boundaries, and non-alphanumeric chars,
+        so that a query of "wifi" or "wi fi" could match a document containing "Wi-Fi".
+        Synonyms and stopwords are customized by external files, and stemming is enabled.
+        Duplicate tokens at the same position (which may result from Stemmed Synonyms or
+        WordDelim parts) are removed.
+        -->
+    <fieldType name="text" class="solr.TextField" positionIncrementGap="100">
+      <analyzer type="index">
+        <charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/>
+        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
+        <!-- in this example, we will only use synonyms at query time
+        <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
+        -->
+        <!-- Case insensitive stop word removal. -->
+        <filter class="solr.StopFilterFactory"
+                ignoreCase="true"
+                words="stopwords.txt"
+                />
+        <filter class="solr.WordDelimiterFilterFactory"
+                protected="protwords.txt"
+                generateWordParts="1"
+                generateNumberParts="1"
+                catenateWords="1"
+                catenateNumbers="1"
+                catenateAll="0"
+                splitOnCaseChange="0"
+                preserveOriginal="1"/>
+        <filter class="solr.LengthFilterFactory" min="2" max="100" />
+        <filter class="solr.LowerCaseFilterFactory"/>
+        <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/>
+        <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
+      </analyzer>
+      <analyzer type="query">
+        <charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/>
+        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
+        <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
+        <filter class="solr.StopFilterFactory"
+                ignoreCase="true"
+                words="stopwords.txt"
+                />
+        <filter class="solr.WordDelimiterFilterFactory"
+                protected="protwords.txt"
+                generateWordParts="1"
+                generateNumberParts="1"
+                catenateWords="0"
+                catenateNumbers="0"
+                catenateAll="0"
+                splitOnCaseChange="0"
+                preserveOriginal="1"/>
+        <filter class="solr.LengthFilterFactory" min="2" max="100" />
+        <filter class="solr.LowerCaseFilterFactory"/>
+        <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/>
+        <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
+      </analyzer>
+      <analyzer type="multiterm">
+        <charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/>
+        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
+        <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
+        <filter class="solr.StopFilterFactory"
+                ignoreCase="true"
+                words="stopwords.txt"
+                />
+        <filter class="solr.WordDelimiterFilterFactory"
+                protected="protwords.txt"
+                generateWordParts="1"
+                generateNumberParts="1"
+                catenateWords="0"
+                catenateNumbers="0"
+                catenateAll="0"
+                splitOnCaseChange="1"
+                preserveOriginal="1"/>
+        <filter class="solr.LengthFilterFactory" min="2" max="100" />
+        <filter class="solr.LowerCaseFilterFactory"/>
+        <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/>
+        <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
+      </analyzer>
+    </fieldType>
+
+    <!-- An unstemmed text field - good if one does not know the language of the field -->
+    <fieldType name="text_und" class="solr.TextField" positionIncrementGap="100">
+      <analyzer type="index">
+        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
+        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
+        <filter class="solr.WordDelimiterFilterFactory"
+                protected="protwords.txt"
+                generateWordParts="1"
+                generateNumberParts="1"
+                catenateWords="1"
+                catenateNumbers="1"
+                catenateAll="0"
+                splitOnCaseChange="0"/>
+        <filter class="solr.LengthFilterFactory" min="2" max="100" />
+        <filter class="solr.LowerCaseFilterFactory"/>
+      </analyzer>
+      <analyzer type="query">
+        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
+        <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
+        <filter class="solr.StopFilterFactory"
+                ignoreCase="true"
+                words="stopwords.txt"
+                />
+        <filter class="solr.WordDelimiterFilterFactory"
+                protected="protwords.txt"
+                generateWordParts="1"
+                generateNumberParts="1"
+                catenateWords="0"
+                catenateNumbers="0"
+                catenateAll="0"
+                splitOnCaseChange="0"/>
+        <filter class="solr.LengthFilterFactory" min="2" max="100" />
+        <filter class="solr.LowerCaseFilterFactory"/>
+      </analyzer>
+      <analyzer type="multiterm">
+        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
+        <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
+        <filter class="solr.StopFilterFactory"
+                ignoreCase="true"
+                words="stopwords.txt"
+                />
+        <filter class="solr.WordDelimiterFilterFactory"
+                protected="protwords.txt"
+                generateWordParts="1"
+                generateNumberParts="1"
+                catenateWords="0"
+                catenateNumbers="0"
+                catenateAll="0"
+                splitOnCaseChange="0"/>
+        <filter class="solr.LengthFilterFactory" min="2" max="100" />
+        <filter class="solr.LowerCaseFilterFactory"/>
+      </analyzer>
+    </fieldType>
+
+    <!-- Edge N gram type - for example for matching against queries with results
+        KeywordTokenizer leaves input string intact as a single term.
+        see: http://www.lucidimagination.com/blog/2009/09/08/auto-suggest-from-popular-queries-using-edgengrams/
+      -->
+    <fieldType name="edge_n2_kw_text" class="solr.TextField" omitNorms="true" positionIncrementGap="100">
+      <analyzer type="index">
+        <tokenizer class="solr.KeywordTokenizerFactory"/>
+        <filter class="solr.LowerCaseFilterFactory"/>
+        <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="25" />
+      </analyzer>
+      <analyzer type="query">
+        <tokenizer class="solr.KeywordTokenizerFactory"/>
+        <filter class="solr.LowerCaseFilterFactory"/>
+      </analyzer>
+    </fieldType>
+    <!--  Setup simple analysis for spell checking -->
+
+    <fieldType name="textSpell" class="solr.TextField" positionIncrementGap="100">
+      <analyzer>
+        <tokenizer class="solr.StandardTokenizerFactory" />
+        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>
+        <filter class="solr.LengthFilterFactory" min="4" max="20" />
+        <filter class="solr.LowerCaseFilterFactory" />
+        <filter class="solr.RemoveDuplicatesTokenFilterFactory" />
+      </analyzer>
+    </fieldType>
+
+    <!-- This is an example of using the KeywordTokenizer along
+         With various TokenFilterFactories to produce a sortable field
+         that does not include some properties of the source text
+      -->
+    <fieldType name="sortString" class="solr.TextField" sortMissingLast="true" omitNorms="true">
+      <analyzer>
+        <!-- KeywordTokenizer does no actual tokenizing, so the entire
+            input string is preserved as a single token
+          -->
+        <tokenizer class="solr.KeywordTokenizerFactory"/>
+        <!-- The LowerCase TokenFilter does what you expect, which can be
+            when you want your sorting to be case insensitive
+          -->
+        <filter class="solr.LowerCaseFilterFactory" />
+        <!-- The TrimFilter removes any leading or trailing whitespace -->
+        <filter class="solr.TrimFilterFactory" />
+        <!-- The PatternReplaceFilter gives you the flexibility to use
+            Java Regular expression to replace any sequence of characters
+            matching a pattern with an arbitrary replacement string,
+            which may include back refrences to portions of the orriginal
+            string matched by the pattern.
+
+            See the Java Regular Expression documentation for more
+            infomation on pattern and replacement string syntax.
+
+            http://java.sun.com/j2se/1.5.0/docs/api/java/util/regex/package-summary.html
+
+        <filter class="solr.PatternReplaceFilterFactory"
+               pattern="(^\p{Punct}+)" replacement="" replace="all"
+        />
+        -->
+      </analyzer>
+    </fieldType>
+
+    <!-- The "RandomSortField" is not used to store or search any
+         data.  You can declare fields of this type it in your schema
+         to generate pseudo-random orderings of your docs for sorting
+         or function purposes.  The ordering is generated based on the field
+         name and the version of the index. As long as the index version
+         remains unchanged, and the same field name is reused,
+         the ordering of the docs will be consistent.
+         If you want different psuedo-random orderings of documents,
+         for the same version of the index, use a dynamicField and
+         change the field name in the request.
+      -->
+    <fieldType name="rand" class="solr.RandomSortField" indexed="true" />
+
+    <!-- Fulltext type for matching words based on how they sound – i.e.,
+         "phonetic matching".
+      -->
+    <fieldType name="phonetic" class="solr.TextField" >
+      <analyzer>
+        <tokenizer class="solr.StandardTokenizerFactory"/>
+        <filter class="solr.DoubleMetaphoneFilterFactory" inject="false"/>
+      </analyzer>
+    </fieldType>
+
+    <!-- since fields of this type are by default not stored or indexed,
+         any data added to them will be ignored outright.  -->
+    <fieldType name="ignored" stored="false" indexed="false" multiValued="true" class="solr.StrField" />
+
+    <!-- This point type indexes the coordinates as separate fields (subFields)
+      If subFieldType is defined, it references a type, and a dynamic field
+      definition is created matching *___<typename>.  Alternately, if
+      subFieldSuffix is defined, that is used to create the subFields.
+      Example: if subFieldType="double", then the coordinates would be
+        indexed in fields myloc_0___double,myloc_1___double.
+      Example: if subFieldSuffix="_d" then the coordinates would be indexed
+        in fields myloc_0_d,myloc_1_d
+      The subFields are an implementation detail of the fieldType, and end
+      users normally should not need to know about them.
+     -->
+    <fieldType name="point" class="solr.PointType" dimension="2" subFieldType="tdouble"/>
+
+    <!-- A specialized field for geospatial search. If indexed, this fieldType must not be multivalued. -->
+    <fieldType name="location" class="solr.LatLonType" subFieldType="tdouble"/>
+
+    <!-- A Geohash is a compact representation of a latitude longitude pair in a single field.
+         See http://wiki.apache.org/solr/SpatialSearch
+     -->
+    <fieldtype name="geohash" class="solr.GeoHashField"/>
+
+    <!-- Improved location type which supports advanced functionality like
+         filtering by polygons or other shapes, indexing shapes, multi-valued
+         fields, etc.
+      -->
+    <fieldType name="location_rpt" class="solr.SpatialRecursivePrefixTreeFieldType"
+        geo="true" distErrPct="0.025" maxDistErr="0.001" distanceUnits="kilometers" />
+
+    <!-- Spatial rectangle (bounding box) field. It supports most spatial predicates, and has
+     special relevancy modes: score=overlapRatio|area|area2D (local-param to the query).  DocValues is recommended for
+     relevancy. -->
+    <fieldType name="bbox" class="solr.BBoxField"
+               geo="true" distanceUnits="kilometers" numberType="_bbox_coord" />
+    <fieldType name="_bbox_coord" class="solr.TrieDoubleField" precisionStep="8" docValues="true" stored="false"/>
+
+  </types>
+
+  <!-- Following is a dynamic way to include other types, added by other contrib modules -->
+  <xi:include href="schema_extra_types.xml" xmlns:xi="http://www.w3.org/2001/XInclude">
+    <xi:fallback></xi:fallback>
+  </xi:include>
+
+   <!-- Valid attributes for fields:
+     name: mandatory - the name for the field
+     type: mandatory - the name of a field type from the <types> fieldType
+       section
+     indexed: true if this field should be indexed (searchable or sortable)
+     stored: true if this field should be retrievable
+     docValues: true if this field should have doc values. Doc values are
+       useful for faceting, grouping, sorting and function queries. Although not
+       required, doc values will make the index faster to load, more
+       NRT-friendly and more memory-efficient. They however come with some
+       limitations: they are currently only supported by StrField, UUIDField
+       and all Trie*Fields, and depending on the field type, they might
+       require the field to be single-valued, be required or have a default
+       value (check the documentation of the field type you're interested in
+       for more information)
+     multiValued: true if this field may contain multiple values per document
+     omitNorms: (expert) set to true to omit the norms associated with
+       this field (this disables length normalization and index-time
+       boosting for the field, and saves some memory).  Only full-text
+       fields or fields that need an index-time boost need norms.
+       Norms are omitted for primitive (non-analyzed) types by default.
+     termVectors: [false] set to true to store the term vector for a
+       given field.
+       When using MoreLikeThis, fields used for similarity should be
+       stored for best performance.
+     termPositions: Store position information with the term vector.
+       This will increase storage costs.
+     termOffsets: Store offset information with the term vector. This
+       will increase storage costs.
+     required: The field is required.  It will throw an error if the
+       value does not exist
+     default: a value that should be used if no value is specified
+       when adding a document.
+   -->
+  <fields>
+
+    <!-- The document id is usually derived from a site-spcific key (hash) and the
+      entity type and ID like:
+      Search Api :
+        The format used is $document->id = $index_id . '-' . $item_id
+      Apache Solr Search Integration
+        The format used is $document->id = $site_hash . '/' . $entity_type . '/' . $entity->id;
+    -->
+    <field name="id" type="string" indexed="true" stored="true" required="true" />
+
+    <!-- Add Solr Cloud version field as mentioned in
+         http://wiki.apache.org/solr/SolrCloud#Required_Config
+    -->
+    <field name="_version_" type="long" indexed="true" stored="true" multiValued="false"/>
+
+    <!-- Search Api specific fields -->
+    <!-- item_id contains the entity ID, e.g. a node's nid. -->
+    <field name="item_id"  type="string" indexed="true" stored="true" />
+    <!-- index_id is the machine name of the search index this entry belongs to. -->
+    <field name="index_id" type="string" indexed="true" stored="true" />
+  <!-- copyField commands copy one field to another at the time a document
+        is added to the index.  It's used either to index the same field differently,
+        or to add multiple fields to the same field for easier/faster searching.  -->
+    <!-- Since sorting by ID is explicitly allowed, store item_id also in a sortable way. -->
+    <copyField source="item_id" dest="sort_search_api_id" />
+
+    <!-- Apache Solr Search Integration specific fields -->
+    <!-- entity_id is the numeric object ID, e.g. Node ID, File ID -->
+    <field name="entity_id"  type="long" indexed="true" stored="true" />
+    <!-- entity_type is 'node', 'file', 'user', or some other Drupal object type -->
+    <field name="entity_type" type="string" indexed="true" stored="true" />
+    <!-- bundle is a node type, or as appropriate for other entity types -->
+    <field name="bundle" type="string" indexed="true" stored="true"/>
+    <field name="bundle_name" type="string" indexed="true" stored="true"/>
+    <field name="site" type="string" indexed="true" stored="true"/>
+    <field name="hash" type="string" indexed="true" stored="true"/>
+    <field name="url" type="string" indexed="true" stored="true"/>
+    <!-- label is the default field for a human-readable string for this entity (e.g. the title of a node) -->
+    <field name="label" type="text" indexed="true" stored="true" termVectors="true" omitNorms="true"/>
+    <!-- The string version of the title is used for sorting -->
+    <copyField source="label" dest="sort_label"/>
+
+    <!-- content is the default field for full text search - dump crap here -->
+    <field name="content" type="text" indexed="true" stored="true" termVectors="true"/>
+    <field name="teaser" type="text" indexed="false" stored="true"/>
+    <field name="path" type="string" indexed="true" stored="true"/>
+    <field name="path_alias" type="text" indexed="true" stored="true" termVectors="true" omitNorms="true"/>
+
+    <!-- These are the fields that correspond to a Drupal node. The beauty of having
+      Lucene store title, body, type, etc., is that we retrieve them with the search
+      result set and don't need to go to the database with a node_load. -->
+    <field name="tid"  type="long" indexed="true" stored="true" multiValued="true"/>
+    <field name="taxonomy_names" type="text" indexed="true" stored="false" termVectors="true" multiValued="true" omitNorms="true"/>
+    <!-- Copy terms to a single field that contains all taxonomy term names -->
+    <copyField source="tm_vid_*" dest="taxonomy_names"/>
+
+    <!-- Here, default is used to create a "timestamp" field indicating
+         when each document was indexed.-->
+    <field name="timestamp" type="tdate" indexed="true" stored="true" default="NOW" multiValued="false"/>
+
+    <!-- This field is used to build the spellchecker index -->
+    <field name="spell" type="textSpell" indexed="true" stored="true" multiValued="true"/>
+
+    <!-- copyField commands copy one field to another at the time a document
+         is added to the index.  It's used either to index the same field differently,
+         or to add multiple fields to the same field for easier/faster searching.  -->
+    <copyField source="label" dest="spell"/>
+    <copyField source="content" dest="spell"/>
+
+    <copyField source="ts_*" dest="spell"/>
+    <copyField source="tm_*" dest="spell"/>
+
+    <!-- Dynamic field definitions.  If a field name is not found, dynamicFields
+         will be used if the name matches any of the patterns.
+         RESTRICTION: the glob-like pattern in the name attribute must have
+         a "*" only at the start or the end.
+         EXAMPLE:  name="*_i" will match any field ending in _i (like myid_i, z_i)
+         Longer patterns will be matched first.  if equal size patterns
+         both match, the first appearing in the schema will be used.  -->
+
+    <!-- A set of fields to contain text extracted from HTML tag contents which we
+         can boost at query time. -->
+    <dynamicField name="tags_*" type="text"   indexed="true" stored="false" omitNorms="true"/>
+
+    <!-- For 2 and 3 letter prefix dynamic fields, the 1st letter indicates the data type and
+         the last letter is 's' for single valued, 'm' for multi-valued -->
+
+    <!-- We use long for integer since 64 bit ints are now common in PHP. -->
+    <dynamicField name="is_*"  type="long"    indexed="true"  stored="true" multiValued="false"/>
+    <dynamicField name="im_*"  type="long"    indexed="true"  stored="true" multiValued="true"/>
+    <!-- List of floats can be saved in a regular float field -->
+    <dynamicField name="fs_*"  type="float"   indexed="true"  stored="true" multiValued="false"/>
+    <dynamicField name="fm_*"  type="float"   indexed="true"  stored="true" multiValued="true"/>
+    <!-- List of doubles can be saved in a regular double field -->
+    <dynamicField name="ps_*"  type="double"   indexed="true"  stored="true" multiValued="false"/>
+    <dynamicField name="pm_*"  type="double"   indexed="true"  stored="true" multiValued="true"/>
+    <!-- List of booleans can be saved in a regular boolean field -->
+    <dynamicField name="bm_*"  type="boolean" indexed="true"  stored="true" multiValued="true"/>
+    <dynamicField name="bs_*"  type="boolean" indexed="true"  stored="true" multiValued="false"/>
+    <!-- Regular text (without processing) can be stored in a string field-->
+    <dynamicField name="ss_*"  type="string"  indexed="true"  stored="true" multiValued="false"/>
+    <dynamicField name="sm_*"  type="string"  indexed="true"  stored="true" multiValued="true"/>
+    <!-- Normal text fields are for full text - the relevance of a match depends on the length of the text -->
+    <dynamicField name="ts_*"  type="text"    indexed="true"  stored="true" multiValued="false" termVectors="true"/>
+    <dynamicField name="tm_*"  type="text"    indexed="true"  stored="true" multiValued="true" termVectors="true"/>
+    <!-- Unstemmed text fields for full text - the relevance of a match depends on the length of the text -->
+    <dynamicField name="tus_*" type="text_und" indexed="true"  stored="true" multiValued="false" termVectors="true"/>
+    <dynamicField name="tum_*" type="text_und" indexed="true"  stored="true" multiValued="true" termVectors="true"/>
+    <!-- These text fields omit norms - useful for extracted text like taxonomy_names -->
+    <dynamicField name="tos_*" type="text"    indexed="true"  stored="true" multiValued="false" termVectors="true" omitNorms="true"/>
+    <dynamicField name="tom_*" type="text"    indexed="true"  stored="true" multiValued="true" termVectors="true" omitNorms="true"/>
+    <!-- Special-purpose text fields -->
+    <dynamicField name="tes_*" type="edge_n2_kw_text" indexed="true" stored="true" multiValued="false" omitTermFreqAndPositions="true" />
+    <dynamicField name="tem_*" type="edge_n2_kw_text" indexed="true" stored="true" multiValued="true" omitTermFreqAndPositions="true" />
+    <dynamicField name="tws_*" type="text_ws" indexed="true" stored="true" multiValued="false"/>
+    <dynamicField name="twm_*" type="text_ws" indexed="true" stored="true" multiValued="true"/>
+
+    <!-- trie dates are preferred, so give them the 2 letter prefix -->
+    <dynamicField name="ds_*"  type="tdate"   indexed="true"  stored="true" multiValued="false"/>
+    <dynamicField name="dm_*"  type="tdate"   indexed="true"  stored="true" multiValued="true"/>
+    <dynamicField name="its_*" type="tlong"   indexed="true"  stored="true" multiValued="false"/>
+    <dynamicField name="itm_*" type="tlong"   indexed="true"  stored="true" multiValued="true"/>
+    <dynamicField name="fts_*" type="tfloat"  indexed="true"  stored="true" multiValued="false"/>
+    <dynamicField name="ftm_*" type="tfloat"  indexed="true"  stored="true" multiValued="true"/>
+    <dynamicField name="pts_*" type="tdouble" indexed="true"  stored="true" multiValued="false"/>
+    <dynamicField name="ptm_*" type="tdouble" indexed="true"  stored="true" multiValued="true"/>
+    <!-- Binary fields can be populated using base64 encoded data. Useful e.g. for embedding
+         a small image in a search result using the data URI scheme -->
+    <dynamicField name="xs_*"  type="binary"  indexed="false" stored="true" multiValued="false"/>
+    <dynamicField name="xm_*"  type="binary"  indexed="false" stored="true" multiValued="true"/>
+    <!-- In rare cases a date rather than tdate is needed for sortMissingLast -->
+    <dynamicField name="dds_*" type="date"    indexed="true"  stored="true" multiValued="false"/>
+    <dynamicField name="ddm_*" type="date"    indexed="true"  stored="true" multiValued="true"/>
+    <!-- Sortable fields, good for sortMissingLast support &
+         We use long for integer since 64 bit ints are now common in PHP. -->
+    <dynamicField name="iss_*" type="slong"   indexed="true"  stored="true" multiValued="false"/>
+    <dynamicField name="ism_*" type="slong"   indexed="true"  stored="true" multiValued="true"/>
+    <!-- In rare cases a sfloat rather than tfloat is needed for sortMissingLast -->
+    <dynamicField name="fss_*" type="sfloat"  indexed="true"  stored="true" multiValued="false"/>
+    <dynamicField name="fsm_*" type="sfloat"  indexed="true"  stored="true" multiValued="true"/>
+    <dynamicField name="pss_*" type="sdouble" indexed="true"  stored="true" multiValued="false"/>
+    <dynamicField name="psm_*" type="sdouble" indexed="true"  stored="true" multiValued="true"/>
+    <!-- In case a 32 bit int is really needed, we provide these fields. 'h' is mnemonic for 'half word', i.e. 32 bit on 64 arch -->
+    <dynamicField name="hs_*" type="integer" indexed="true"  stored="true" multiValued="false"/>
+    <dynamicField name="hm_*" type="integer" indexed="true"  stored="true" multiValued="true"/>
+    <dynamicField name="hss_*" type="sint"   indexed="true"  stored="true" multiValued="false"/>
+    <dynamicField name="hsm_*" type="sint"   indexed="true"  stored="true" multiValued="true"/>
+    <dynamicField name="hts_*" type="tint"   indexed="true"  stored="true" multiValued="false"/>
+    <dynamicField name="htm_*" type="tint"   indexed="true"  stored="true" multiValued="true"/>
+
+    <!-- Unindexed string fields that can be used to store values that won't be searchable -->
+    <dynamicField name="zs_*" type="string"   indexed="false"  stored="true" multiValued="false"/>
+    <dynamicField name="zm_*" type="string"   indexed="false"  stored="true" multiValued="true"/>
+
+    <!-- Fields for location searches.
+         http://wiki.apache.org/solr/SpatialSearch#geodist_-_The_distance_function -->
+    <dynamicField name="points_*" type="point" indexed="true"  stored="true" multiValued="false"/>
+    <dynamicField name="pointm_*" type="point" indexed="true"  stored="true" multiValued="true"/>
+    <dynamicField name="locs_*" type="location" indexed="true"  stored="true" multiValued="false"/>
+    <dynamicField name="locm_*" type="location" indexed="true"  stored="true" multiValued="true"/>
+    <dynamicField name="geos_*" type="geohash" indexed="true"  stored="true" multiValued="false"/>
+    <dynamicField name="geom_*" type="geohash" indexed="true"  stored="true" multiValued="true"/>
+    <dynamicField name="bboxs_*" type="bbox" indexed="true" stored="true" multiValued="false" />
+    <dynamicField name="bboxm_*" type="bbox" indexed="true" stored="true" multiValued="true" />
+    <dynamicField name="rpts_*" type="location_rpt" indexed="true" stored="true" multiValued="false" />
+    <dynamicField name="rptm_*" type="location_rpt" indexed="true" stored="true" multiValued="true" />
+
+    <!-- Special fields for Solr 5 functionality. -->
+    <dynamicField name="phons_*" type="phonetic" indexed="true" stored="true" multiValued="false" />
+    <dynamicField name="phonm_*" type="phonetic" indexed="true" stored="true" multiValued="true" />
+
+    <!-- External file fields -->
+    <dynamicField name="eff_*" type="file"/>
+
+    <!-- Sortable version of the dynamic string field -->
+    <dynamicField name="sort_*" type="sortString" indexed="true" stored="false"/>
+    <copyField source="ss_*" dest="sort_*"/>
+
+    <!-- A random sort field -->
+    <dynamicField name="random_*" type="rand" indexed="true" stored="true"/>
+
+    <!-- This field is used to store access information (e.g. node access grants), as opposed to field data -->
+    <dynamicField name="access_*" type="integer" indexed="true" stored="false" multiValued="true"/>
+
+    <!-- The following causes solr to ignore any fields that don't already match an existing
+         field name or dynamic field, rather than reporting them as an error.
+         Alternately, change the type="ignored" to some other type e.g. "text" if you want
+         unknown fields indexed and/or stored by default -->
+    <dynamicField name="*" type="ignored" multiValued="true" />
+
+  </fields>
+
+  <!-- Following is a dynamic way to include other fields, added by other contrib modules -->
+  <xi:include href="schema_extra_fields.xml" xmlns:xi="http://www.w3.org/2001/XInclude">
+    <xi:fallback></xi:fallback>
+  </xi:include>
+
+  <!-- Field to use to determine and enforce document uniqueness.
+       Unless this field is marked with required="false", it will be a required field
+    -->
+  <uniqueKey>id</uniqueKey>
+
+  <!-- Similarity is the scoring routine for each document vs. a query.
+       A custom Similarity or SimilarityFactory may be specified here, but
+       the default is fine for most applications.
+       For more info: http://wiki.apache.org/solr/SchemaXml#Similarity
+    -->
+  <!--
+     <similarity class="com.example.solr.CustomSimilarityFactory">
+       <str name="paramkey">param value</str>
+     </similarity>
+    -->
+
+  <!-- DEPRECATED: The defaultSearchField is consulted by various query parsers
+    when parsing a query string that isn't explicit about the field.  Machine
+    (non-user) generated queries are best made explicit, or they can use the
+    "df" request parameter which takes precedence over this.
+    Note: Un-commenting defaultSearchField will be insufficient if your request
+    handler in solrconfig.xml defines "df", which takes precedence. That would
+    need to be removed.
+  <defaultSearchField>content</defaultSearchField> -->
+
+  <!-- DEPRECATED: The defaultOperator (AND|OR) is consulted by various query
+    parsers when parsing a query string to determine if a clause of the query
+    should be marked as required or optional, assuming the clause isn't already
+    marked by some operator. The default is OR, which is generally assumed so it
+    is not a good idea to change it globally here. The "q.op" request parameter
+    takes precedence over this.
+  <solrQueryParser defaultOperator="OR"/> -->
+
+</schema>
diff --git a/profiles/wcm_base/modules/contrib/search_api_solr/solr-conf/7.x/schema_extra_fields.xml b/profiles/wcm_base/modules/contrib/search_api_solr/solr-conf/7.x/schema_extra_fields.xml
new file mode 100644
index 00000000..02b36555
--- /dev/null
+++ b/profiles/wcm_base/modules/contrib/search_api_solr/solr-conf/7.x/schema_extra_fields.xml
@@ -0,0 +1,23 @@
+<fields>
+<!--
+  Example: Adding German dynamic field types to our Solr Schema.
+  If you enable this, make sure you have a folder called lang containing
+  stopwords_de.txt and synonyms_de.txt.
+  This also requires to enable the content in schema_extra_types.xml.
+-->
+<!--
+   <field name="label_de" type="text_de" indexed="true" stored="true" termVectors="true" omitNorms="true"/>
+   <field name="content_de" type="text_de" indexed="true" stored="true" termVectors="true"/>
+   <field name="teaser_de" type="text_de" indexed="false" stored="true"/>
+   <field name="path_alias_de" type="text_de" indexed="true" stored="true" termVectors="true" omitNorms="true"/>
+   <field name="taxonomy_names_de" type="text_de" indexed="true" stored="false" termVectors="true" multiValued="true" omitNorms="true"/>
+   <field name="spell_de" type="text_de" indexed="true" stored="true" multiValued="true"/>
+   <copyField source="label_de" dest="spell_de"/>
+   <copyField source="content_de" dest="spell_de"/>
+   <dynamicField name="tags_de_*" type="text_de" indexed="true" stored="false" omitNorms="true"/>
+   <dynamicField name="ts_de_*" type="text_de" indexed="true" stored="true" multiValued="false" termVectors="true"/>
+   <dynamicField name="tm_de_*" type="text_de" indexed="true" stored="true" multiValued="true" termVectors="true"/>
+   <dynamicField name="tos_de_*" type="text_de" indexed="true" stored="true" multiValued="false" termVectors="true" omitNorms="true"/>
+   <dynamicField name="tom_de_*" type="text_de" indexed="true" stored="true" multiValued="true" termVectors="true" omitNorms="true"/>
+-->
+</fields>
diff --git a/profiles/wcm_base/modules/contrib/search_api_solr/solr-conf/7.x/schema_extra_types.xml b/profiles/wcm_base/modules/contrib/search_api_solr/solr-conf/7.x/schema_extra_types.xml
new file mode 100644
index 00000000..bd716b82
--- /dev/null
+++ b/profiles/wcm_base/modules/contrib/search_api_solr/solr-conf/7.x/schema_extra_types.xml
@@ -0,0 +1,34 @@
+<types>
+<!--
+  Example: Adding German language field types to our Solr Schema.
+  If you enable this, make sure you have a folder called lang containing
+  stopwords_de.txt and synonyms_de.txt.
+
+  For examples from other languages, see
+  ./server/solr/configsets/sample_techproducts_configs/conf/schema.xml
+  from your Solr installation.
+-->
+<!--
+    <fieldType name="text_de" class="solr.TextField" positionIncrementGap="100">
+      <analyzer type="index">
+        <charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/>
+        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
+        <filter class="solr.StopFilterFactory" words="lang/stopwords_de.txt" format="snowball" ignoreCase="true"/>
+        <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" splitOnCaseChange="1" splitOnNumerics="1" catenateWords="1" catenateNumbers="1" catenateAll="0" protected="protwords.txt" preserveOriginal="1"/>
+        <filter class="solr.LowerCaseFilterFactory"/>
+        <filter class="solr.GermanLightStemFilterFactory"/>
+        <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
+      </analyzer>
+      <analyzer type="query">
+        <charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/>
+        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
+        <filter class="solr.SynonymFilterFactory" synonyms="lang/synonyms_de.txt" ignoreCase="true" expand="true"/>
+        <filter class="solr.StopFilterFactory" words="lang/stopwords_de.txt" format="snowball" ignoreCase="true"/>
+        <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" splitOnCaseChange="1" splitOnNumerics="1" catenateWords="0" catenateNumbers="0" catenateAll="0" protected="protwords.txt" preserveOriginal="1"/>
+        <filter class="solr.LowerCaseFilterFactory"/>
+        <filter class="solr.GermanLightStemFilterFactory"/>
+        <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
+      </analyzer>
+    </fieldType>
+-->
+</types>
diff --git a/profiles/wcm_base/modules/contrib/search_api_solr/solr-conf/7.x/solrconfig.xml b/profiles/wcm_base/modules/contrib/search_api_solr/solr-conf/7.x/solrconfig.xml
new file mode 100644
index 00000000..36e6fa14
--- /dev/null
+++ b/profiles/wcm_base/modules/contrib/search_api_solr/solr-conf/7.x/solrconfig.xml
@@ -0,0 +1,1793 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License.  You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<!--
+     For more details about configurations options that may appear in
+     this file, see http://wiki.apache.org/solr/SolrConfigXml.
+-->
+<config name="drupal-4.4-solr-7.x" >
+  <!-- In all configuration below, a prefix of "solr." for class names
+       is an alias that causes solr to search appropriate packages,
+       including org.apache.solr.(search|update|request|core|analysis)
+
+       You may also specify a fully qualified Java classname if you
+       have your own custom plugins.
+    -->
+
+  <!-- Set this to 'false' if you want solr to continue working after
+       it has encountered an severe configuration error.  In a
+       production environment, you may want solr to keep working even
+       if one handler is mis-configured.
+
+       You may also set this to false using by setting the system
+       property:
+
+         -Dsolr.abortOnConfigurationError=false
+    -->
+  <abortOnConfigurationError>${solr.abortOnConfigurationError:true}</abortOnConfigurationError>
+
+  <!-- Controls what version of Lucene various components of Solr
+       adhere to.  Generally, you want to use the latest version to
+       get all bug fixes and improvements. It is highly recommended
+       that you fully re-index after changing this setting as it can
+       affect both how text is indexed and queried.
+    -->
+  <luceneMatchVersion>${solr.luceneMatchVersion:LUCENE_60}</luceneMatchVersion>
+
+  <!-- <lib/> directives can be used to instruct Solr to load any Jars
+       identified and use them to resolve any "plugins" specified in
+       your solrconfig.xml or schema.xml (ie: Analyzers, Request
+       Handlers, etc...).
+
+       All directories and paths are resolved relative to the
+       instanceDir.
+
+       Please note that <lib/> directives are processed in the order
+       that they appear in your solrconfig.xml file, and are "stacked"
+       on top of each other when building a ClassLoader - so if you have
+       plugin jars with dependencies on other jars, the "lower level"
+       dependency jars should be loaded first.
+
+       If a "./lib" directory exists in your instanceDir, all files
+       found in it are included as if you had used the following
+       syntax...
+
+              <lib dir="./lib" />
+    -->
+
+  <!-- A "dir" option by itself adds any files found in the directory to the
+       classpath, this is useful for including all jars in a directory.
+    -->
+  <lib dir="${solr.contrib.dir:../../../contrib}/extraction/lib" />
+  <lib dir="${solr.contrib.dir:../../../contrib}/clustering/lib/" />
+
+  <!-- The velocity library has been known to crash Solr in some
+       instances when deployed as a war file to Tomcat. Therefore all
+       references have been removed from the default configuration.
+       @see http://drupal.org/node/1612556
+  -->
+  <!-- <lib dir="../../contrib/velocity/lib" /> -->
+
+  <!-- When a regex is specified in addition to a directory, only the
+       files in that directory which completely match the regex
+       (anchored on both ends) will be included.
+    -->
+  <!--<lib dir="../../dist/" regex="apache-solr-cell-\d.*\.jar" />-->
+  <!--<lib dir="../../dist/" regex="apache-solr-clustering-\d.*\.jar" />-->
+  <!--<lib dir="../../dist/" regex="apache-solr-dataimporthandler-\d.*\.jar" />-->
+  <!--<lib dir="../../dist/" regex="apache-solr-langid-\d.*\.jar" />-->
+  <!-- <lib dir="../../dist/" regex="apache-solr-velocity-\d.*\.jar" /> -->
+
+  <!-- If a dir option (with or without a regex) is used and nothing
+       is found that matches, it will be ignored
+    -->
+  <!--<lib dir="../../contrib/clustering/lib/" />-->
+  <!--<lib dir="/total/crap/dir/ignored" />-->
+
+  <!-- an exact path can be used to specify a specific file.  This
+       will cause a serious error to be logged if it can't be loaded.
+    -->
+  <!--
+  <lib path="../a-jar-that-does-not-exist.jar" />
+  -->
+
+  <!-- Data Directory
+
+       Used to specify an alternate directory to hold all index data
+       other than the default ./data under the Solr home.  If
+       replication is in use, this should match the replication
+       configuration.
+    -->
+  <dataDir>${solr.data.dir:}</dataDir>
+
+  <!-- The DirectoryFactory to use for indexes.
+
+       solr.StandardDirectoryFactory is filesystem
+       based and tries to pick the best implementation for the current
+       JVM and platform.  solr.NRTCachingDirectoryFactory, the default,
+       wraps solr.StandardDirectoryFactory and caches small files in memory
+       for better NRT performance.
+
+       One can force a particular implementation via solr.MMapDirectoryFactory,
+       solr.NIOFSDirectoryFactory, or solr.SimpleFSDirectoryFactory.
+
+       solr.RAMDirectoryFactory is memory based, not
+       persistent, and doesn't work with replication.
+    -->
+  <directoryFactory name="DirectoryFactory"
+                    class="${solr.directoryFactory:solr.NRTCachingDirectoryFactory}"/>
+
+  <!-- The CodecFactory for defining the format of the inverted index.
+       The default implementation is SchemaCodecFactory, which is the official
+       Lucene index format, but hooks into the schema to provide per-field
+       customization of the postings lists and per-document values in the
+       fieldType element (postingsFormat/docValuesFormat). Note that most of the
+       alternative implementations are experimental, so if you choose to
+       customize the index format, it's a good idea to convert back to the
+       official format e.g. via IndexWriter.addIndexes(IndexReader) before
+       upgrading to a newer version to avoid unnecessary reindexing.
+  -->
+  <codecFactory class="solr.SchemaCodecFactory"/>
+
+  <!-- To enable dynamic schema REST APIs, use the following for <schemaFactory>:
+
+       <schemaFactory class="ManagedIndexSchemaFactory">
+         <bool name="mutable">true</bool>
+         <str name="managedSchemaResourceName">managed-schema</str>
+       </schemaFactory>
+
+       When ManagedIndexSchemaFactory is specified, Solr will load the schema from
+       the resource named in 'managedSchemaResourceName', rather than from schema.xml.
+       Note that the managed schema resource CANNOT be named schema.xml.  If the managed
+       schema does not exist, Solr will create it after reading schema.xml, then rename
+       'schema.xml' to 'schema.xml.bak'.
+
+       Do NOT hand edit the managed schema - external modifications will be ignored and
+       overwritten as a result of schema modification REST API calls.
+
+       When ManagedIndexSchemaFactory is specified with mutable = true, schema
+       modification REST API calls will be allowed; otherwise, error responses will be
+       sent back for these requests.
+  -->
+  <schemaFactory class="ClassicIndexSchemaFactory"/>
+
+  <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+       Index Config - These settings control low-level behavior of indexing
+       Most example settings here show the default value, but are commented
+       out, to more easily see where customizations have been made.
+
+       Note: This replaces <indexDefaults> and <mainIndex> from older versions
+       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+  <indexConfig>
+    <!-- maxFieldLength was removed in 4.0. To get similar behavior, include a
+         LimitTokenCountFilterFactory in your fieldType definition. E.g.
+     <filter class="solr.LimitTokenCountFilterFactory" maxTokenCount="10000"/>
+    -->
+    <!-- Maximum time to wait for a write lock (ms) for an IndexWriter. Default: 1000 -->
+    <!-- <writeLockTimeout>1000</writeLockTimeout>  -->
+
+    <!-- The maximum number of simultaneous threads that may be
+         indexing documents at once in IndexWriter; if more than this
+         many threads arrive they will wait for others to finish.
+         Default in Solr/Lucene is 8. -->
+    <!-- <maxIndexingThreads>8</maxIndexingThreads>  -->
+
+    <!-- Expert: Enabling compound file will use less files for the index,
+         using fewer file descriptors on the expense of performance decrease.
+         Default in Lucene is "true". Default in Solr is "false" (since 3.6) -->
+    <!-- <useCompoundFile>false</useCompoundFile> -->
+
+    <!-- ramBufferSizeMB sets the amount of RAM that may be used by Lucene
+         indexing for buffering added documents and deletions before they are
+         flushed to the Directory.
+         maxBufferedDocs sets a limit on the number of documents buffered
+         before flushing.
+         If both ramBufferSizeMB and maxBufferedDocs is set, then
+         Lucene will flush based on whichever limit is hit first.
+         The default is 100 MB.  -->
+    <ramBufferSizeMB>32</ramBufferSizeMB>
+    <!-- <maxBufferedDocs>1000</maxBufferedDocs> -->
+
+    <!-- Expert: Merge Policy
+
+         The Merge Policy in Lucene controls how merging is handled by
+         Lucene.  The default in Solr 3.3 is TieredMergePolicy.
+
+         The default in 2.3 was the LogByteSizeMergePolicy,
+         previous versions used LogDocMergePolicy.
+
+         LogByteSizeMergePolicy chooses segments to merge based on
+         their size.  The Lucene 2.2 default, LogDocMergePolicy chose
+         when to merge based on number of documents
+
+         Other implementations of MergePolicy must have a no-argument
+         constructor
+      -->
+
+    <mergePolicyFactory class="org.apache.solr.index.LogByteSizeMergePolicyFactory">
+      <!-- Merge Factor
+           The merge factor controls how many segments will get merged at a time.
+           For TieredMergePolicy, mergeFactor is a convenience parameter which
+           will set both MaxMergeAtOnce and SegmentsPerTier at once.
+           For LogByteSizeMergePolicy, mergeFactor decides how many new segments
+           will be allowed before they are merged into one.
+        -->
+      <int name="mergeFactor">4</int>
+    </mergePolicyFactory>
+
+    <!-- Expert: Merge Scheduler
+
+         The Merge Scheduler in Lucene controls how merges are
+         performed.  The ConcurrentMergeScheduler (Lucene 2.3 default)
+         can perform merges in the background using separate threads.
+         The SerialMergeScheduler (Lucene 2.2 default) does not.
+     -->
+    <!--
+       <mergeScheduler class="org.apache.lucene.index.ConcurrentMergeScheduler"/>
+       -->
+
+    <!-- LockFactory
+
+         This option specifies which Lucene LockFactory implementation
+         to use.
+
+         single = SingleInstanceLockFactory - suggested for a
+                  read-only index or when there is no possibility of
+                  another process trying to modify the index.
+         native = NativeFSLockFactory - uses OS native file locking.
+                  Do not use when multiple solr webapps in the same
+                  JVM are attempting to share a single index.
+         simple = SimpleFSLockFactory  - uses a plain file for locking
+
+         Defaults: 'native' is default for Solr3.6 and later, otherwise
+                   'simple' is the default
+
+         More details on the nuances of each LockFactory...
+         http://wiki.apache.org/lucene-java/AvailableLockFactories
+    -->
+    <lockType>${solr.lock.type:native}</lockType>
+
+    <!-- Expert: Controls how often Lucene loads terms into memory
+         Default is 128 and is likely good for most everyone.
+      -->
+    <!-- <termIndexInterval>256</termIndexInterval> -->
+
+    <!-- If true, IndexReaders will be reopened (often more efficient)
+         instead of closed and then opened.
+      -->
+    <reopenReaders>true</reopenReaders>
+
+    <!-- Commit Deletion Policy
+
+         Custom deletion policies can be specified here. The class must
+         implement org.apache.lucene.index.IndexDeletionPolicy.
+
+         http://lucene.apache.org/java/2_9_1/api/all/org/apache/lucene/index/IndexDeletionPolicy.html
+
+         The default Solr IndexDeletionPolicy implementation supports
+         deleting index commit points on number of commits, age of
+         commit point and optimized status.
+
+         The latest commit point should always be preserved regardless
+         of the criteria.
+    -->
+    <deletionPolicy class="solr.SolrDeletionPolicy">
+      <!-- The number of commit points to be kept -->
+      <str name="maxCommitsToKeep">1</str>
+      <!-- The number of optimized commit points to be kept -->
+      <str name="maxOptimizedCommitsToKeep">0</str>
+      <!--
+          Delete all commit points once they have reached the given age.
+          Supports DateMathParser syntax e.g.
+        -->
+      <!--
+         <str name="maxCommitAge">30MINUTES</str>
+         <str name="maxCommitAge">1DAY</str>
+      -->
+    </deletionPolicy>
+
+    <!-- Lucene Infostream
+
+         To aid in advanced debugging, Lucene provides an "InfoStream"
+         of detailed information when indexing.
+
+         Setting the value to true will instruct the underlying Lucene
+         IndexWriter to write its info stream to solr's log. By default,
+         this is enabled here, and controlled through log4j.properties.
+      -->
+     <infoStream>true</infoStream>
+
+  </indexConfig>
+
+  <!-- JMX
+
+       This example enables JMX if and only if an existing MBeanServer
+       is found, use this if you want to configure JMX through JVM
+       parameters. Remove this to disable exposing Solr configuration
+       and statistics to JMX.
+
+       For more details see http://wiki.apache.org/solr/SolrJmx
+    -->
+  <!-- <jmx /> -->
+  <!-- If you want to connect to a particular server, specify the
+       agentId
+    -->
+  <!-- <jmx agentId="myAgent" /> -->
+  <!-- If you want to start a new MBeanServer, specify the serviceUrl -->
+  <!-- <jmx serviceUrl="service:jmx:rmi:///jndi/rmi://localhost:9999/solr"/>
+    -->
+
+  <!-- The default high-performance update handler -->
+  <updateHandler class="solr.DirectUpdateHandler2">
+
+    <!-- AutoCommit
+
+         Perform a <commit/> automatically under certain conditions.
+         Instead of enabling autoCommit, consider using "commitWithin"
+         when adding documents.
+
+         http://wiki.apache.org/solr/UpdateXmlMessages
+
+         maxDocs - Maximum number of documents to add since the last
+                   commit before automatically triggering a new commit.
+
+         maxTime - Maximum amount of time that is allowed to pass
+                   since a document was added before automaticly
+                   triggering a new commit.
+      -->
+    <autoCommit>
+      <maxDocs>${solr.autoCommit.MaxDocs:10000}</maxDocs>
+      <maxTime>${solr.autoCommit.MaxTime:120000}</maxTime>
+    </autoCommit>
+
+    <!-- softAutoCommit is like autoCommit except it causes a
+         'soft' commit which only ensures that changes are visible
+         but does not ensure that data is synced to disk.  This is
+         faster and more near-realtime friendly than a hard commit.
+    -->
+    <autoSoftCommit>
+      <maxDocs>${solr.autoSoftCommit.MaxDocs:2000}</maxDocs>
+      <maxTime>${solr.autoSoftCommit.MaxTime:10000}</maxTime>
+    </autoSoftCommit>
+
+    <!-- Update Related Event Listeners
+
+         Various IndexWriter related events can trigger Listeners to
+         take actions.
+
+         postCommit - fired after every commit or optimize command
+         postOptimize - fired after every optimize command
+      -->
+    <!-- The RunExecutableListener executes an external command from a
+         hook such as postCommit or postOptimize.
+
+         exe - the name of the executable to run
+         dir - dir to use as the current working directory. (default=".")
+         wait - the calling thread waits until the executable returns.
+                (default="true")
+         args - the arguments to pass to the program.  (default is none)
+         env - environment variables to set.  (default is none)
+      -->
+    <!-- This example shows how RunExecutableListener could be used
+         with the script based replication...
+         http://wiki.apache.org/solr/CollectionDistribution
+      -->
+    <!--
+       <listener event="postCommit" class="solr.RunExecutableListener">
+         <str name="exe">solr/bin/snapshooter</str>
+         <str name="dir">.</str>
+         <bool name="wait">true</bool>
+         <arr name="args"> <str>arg1</str> <str>arg2</str> </arr>
+         <arr name="env"> <str>MYVAR=val1</str> </arr>
+       </listener>
+      -->
+    <!-- Enables a transaction log, currently used for real-time get.
+         "dir" - the target directory for transaction logs, defaults to the
+         solr data directory.  -->
+    <updateLog>
+      <str name="dir">${solr.data.dir:}</str>
+      <!-- if you want to take control of the synchronization you may specify
+           the syncLevel as one of the following where ''flush'' is the default.
+           Fsync will reduce throughput.
+           <str name="syncLevel">flush|fsync|none</str>
+      -->
+    </updateLog>
+  </updateHandler>
+
+  <!-- IndexReaderFactory
+
+       Use the following format to specify a custom IndexReaderFactory,
+       which allows for alternate IndexReader implementations.
+
+       ** Experimental Feature **
+
+       Please note - Using a custom IndexReaderFactory may prevent
+       certain other features from working. The API to
+       IndexReaderFactory may change without warning or may even be
+       removed from future releases if the problems cannot be
+       resolved.
+
+       ** Features that may not work with custom IndexReaderFactory **
+
+       The ReplicationHandler assumes a disk-resident index. Using a
+       custom IndexReader implementation may cause incompatibility
+       with ReplicationHandler and may cause replication to not work
+       correctly. See SOLR-1366 for details.
+
+    -->
+  <!--
+  <indexReaderFactory name="IndexReaderFactory" class="package.class">
+    <str name="someArg">Some Value</str>
+  </indexReaderFactory >
+  -->
+
+  <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+       Query section - these settings control query time things like caches
+       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+  <query>
+    <!-- Max Boolean Clauses
+
+         Maximum number of clauses in each BooleanQuery,  an exception
+         is thrown if exceeded.
+
+         ** WARNING **
+
+         This option actually modifies a global Lucene property that
+         will affect all SolrCores.  If multiple solrconfig.xml files
+         disagree on this property, the value at any given moment will
+         be based on the last SolrCore to be initialized.
+
+      -->
+    <maxBooleanClauses>1024</maxBooleanClauses>
+
+    <!-- Slow Query Threshold (in millis)
+
+         At high request rates, logging all requests can become a bottleneck
+         and therefore INFO logging is often turned off. However, it is still
+         useful to be able to set a latency threshold above which a request
+         is considered "slow" and log that request at WARN level so we can
+         easily identify slow queries.
+    -->
+    <slowQueryThresholdMillis>-1</slowQueryThresholdMillis>
+
+    <!-- Solr Internal Query Caches
+
+         There are two implementations of cache available for Solr,
+         LRUCache, based on a synchronized LinkedHashMap, and
+         FastLRUCache, based on a ConcurrentHashMap.
+
+         FastLRUCache has faster gets and slower puts in single
+         threaded operation and thus is generally faster than LRUCache
+         when the hit ratio of the cache is high (> 75%), and may be
+         faster under other scenarios on multi-cpu systems.
+    -->
+
+    <!-- Filter Cache
+
+         Cache used by SolrIndexSearcher for filters (DocSets),
+         unordered sets of *all* documents that match a query.  When a
+         new searcher is opened, its caches may be prepopulated or
+         "autowarmed" using data from caches in the old searcher.
+         autowarmCount is the number of items to prepopulate.  For
+         LRUCache, the autowarmed items will be the most recently
+         accessed items.
+
+         Parameters:
+           class - the SolrCache implementation LRUCache or
+               (LRUCache or FastLRUCache)
+           size - the maximum number of entries in the cache
+           initialSize - the initial capacity (number of entries) of
+               the cache.  (see java.util.HashMap)
+           autowarmCount - the number of entries to prepopulate from
+               and old cache.
+      -->
+    <filterCache class="solr.FastLRUCache"
+                 size="512"
+                 initialSize="512"
+                 autowarmCount="0"/>
+
+    <!-- Query Result Cache
+
+         Caches results of searches - ordered lists of document ids
+         (DocList) based on a query, a sort, and the range of documents requested.
+      -->
+    <queryResultCache class="solr.LRUCache"
+                     size="512"
+                     initialSize="512"
+                     autowarmCount="32"/>
+
+    <!-- Document Cache
+
+         Caches Lucene Document objects (the stored fields for each
+         document).  Since Lucene internal document ids are transient,
+         this cache will not be autowarmed.
+      -->
+    <documentCache class="solr.LRUCache"
+                   size="512"
+                   initialSize="512"
+                   autowarmCount="0"/>
+
+    <!-- Field Value Cache
+
+         Cache used to hold field values that are quickly accessible
+         by document id.  The fieldValueCache is created by default
+         even if not configured here.
+      -->
+    <!--
+       <fieldValueCache class="solr.FastLRUCache"
+                        size="512"
+                        autowarmCount="128"
+                        showItems="32" />
+      -->
+
+    <!-- Custom Cache
+
+         Example of a generic cache.  These caches may be accessed by
+         name through SolrIndexSearcher.getCache(),cacheLookup(), and
+         cacheInsert().  The purpose is to enable easy caching of
+         user/application level data.  The regenerator argument should
+         be specified as an implementation of solr.CacheRegenerator
+         if autowarming is desired.
+      -->
+    <!--
+       <cache name="myUserCache"
+              class="solr.LRUCache"
+              size="4096"
+              initialSize="1024"
+              autowarmCount="1024"
+              regenerator="com.mycompany.MyRegenerator"
+              />
+      -->
+
+    <!-- Lazy Field Loading
+
+         If true, stored fields that are not requested will be loaded
+         lazily.  This can result in a significant speed improvement
+         if the usual case is to not load all stored fields,
+         especially if the skipped fields are large compressed text
+         fields.
+    -->
+    <enableLazyFieldLoading>true</enableLazyFieldLoading>
+
+   <!-- Use Filter For Sorted Query
+
+        A possible optimization that attempts to use a filter to
+        satisfy a search.  If the requested sort does not include
+        score, then the filterCache will be checked for a filter
+        matching the query. If found, the filter will be used as the
+        source of document ids, and then the sort will be applied to
+        that.
+
+        For most situations, this will not be useful unless you
+        frequently get the same search repeatedly with different sort
+        options, and none of them ever use "score"
+     -->
+   <!--
+      <useFilterForSortedQuery>true</useFilterForSortedQuery>
+     -->
+
+   <!-- Result Window Size
+
+        An optimization for use with the queryResultCache.  When a search
+        is requested, a superset of the requested number of document ids
+        are collected.  For example, if a search for a particular query
+        requests matching documents 10 through 19, and queryWindowSize is 50,
+        then documents 0 through 49 will be collected and cached.  Any further
+        requests in that range can be satisfied via the cache.
+     -->
+   <queryResultWindowSize>20</queryResultWindowSize>
+
+   <!-- Maximum number of documents to cache for any entry in the
+        queryResultCache.
+     -->
+   <queryResultMaxDocsCached>200</queryResultMaxDocsCached>
+
+   <!-- Query Related Event Listeners
+
+        Various IndexSearcher related events can trigger Listeners to
+        take actions.
+
+        newSearcher - fired whenever a new searcher is being prepared
+        and there is a current searcher handling requests (aka
+        registered).  It can be used to prime certain caches to
+        prevent long request times for certain requests.
+
+        firstSearcher - fired whenever a new searcher is being
+        prepared but there is no current registered searcher to handle
+        requests or to gain autowarming data from.
+
+     -->
+    <!-- QuerySenderListener takes an array of NamedList and executes a
+         local query request for each NamedList in sequence.
+      -->
+    <listener event="newSearcher" class="solr.QuerySenderListener">
+      <arr name="queries">
+        <!--
+           <lst><str name="q">solr</str><str name="sort">price asc</str></lst>
+           <lst><str name="q">rocks</str><str name="sort">weight asc</str></lst>
+          -->
+      </arr>
+    </listener>
+    <listener event="firstSearcher" class="solr.QuerySenderListener">
+      <arr name="queries">
+        <lst>
+          <str name="q">solr rocks</str><str name="start">0</str><str name="rows">10</str>
+        </lst>
+      </arr>
+    </listener>
+
+    <!-- Use Cold Searcher
+
+         If a search request comes in and there is no current
+         registered searcher, then immediately register the still
+         warming searcher and use it.  If "false" then all requests
+         will block until the first searcher is done warming.
+      -->
+    <useColdSearcher>false</useColdSearcher>
+
+    <!-- Max Warming Searchers
+
+         Maximum number of searchers that may be warming in the
+         background concurrently.  An error is returned if this limit
+         is exceeded.
+
+         Recommend values of 1-2 for read-only slaves, higher for
+         masters w/o cache warming.
+      -->
+    <maxWarmingSearchers>2</maxWarmingSearchers>
+
+  </query>
+
+  <!-- Request Dispatcher
+
+       This section contains instructions for how the SolrDispatchFilter
+       should behave when processing requests for this SolrCore.
+
+       handleSelect affects the behavior of requests such as /select?qt=XXX
+
+       handleSelect="true" will cause the SolrDispatchFilter to process
+       the request and will result in consistent error handling and
+       formatting for all types of requests.
+
+       handleSelect="false" will cause the SolrDispatchFilter to
+       ignore "/select" requests and fallback to using the legacy
+       SolrServlet and it's Solr 1.1 style error formatting
+    -->
+  <requestDispatcher handleSelect="true" >
+    <!-- Request Parsing
+
+         These settings indicate how Solr Requests may be parsed, and
+         what restrictions may be placed on the ContentStreams from
+         those requests
+
+         enableRemoteStreaming - enables use of the stream.file
+         and stream.url parameters for specifying remote streams.
+
+         multipartUploadLimitInKB - specifies the max size (in KiB) of
+         Multipart File Uploads that Solr will allow in a Request.
+
+         formdataUploadLimitInKB - specifies the max size (in KiB) of
+         form data (application/x-www-form-urlencoded) sent via
+         POST. You can use POST to pass request parameters not
+         fitting into the URL.
+
+         addHttpRequestToContext - if set to true, it will instruct
+         the requestParsers to include the original HttpServletRequest
+         object in the context map of the SolrQueryRequest under the
+         key "httpRequest". It will not be used by any of the existing
+         Solr components, but may be useful when developing custom
+         plugins.
+
+         *** WARNING ***
+         The settings below authorize Solr to fetch remote files, You
+         should make sure your system has some authentication before
+         using enableRemoteStreaming="true"
+
+      -->
+    <requestParsers enableRemoteStreaming="true"
+                    multipartUploadLimitInKB="2048000"
+                    formdataUploadLimitInKB="2048"
+                    addHttpRequestToContext="false"/>
+
+    <!-- HTTP Caching
+
+         Set HTTP caching related parameters (for proxy caches and clients).
+
+         The options below instruct Solr not to output any HTTP Caching
+         related headers
+      -->
+    <httpCaching never304="true" />
+    <!-- If you include a <cacheControl> directive, it will be used to
+         generate a Cache-Control header (as well as an Expires header
+         if the value contains "max-age=")
+
+         By default, no Cache-Control header is generated.
+
+         You can use the <cacheControl> option even if you have set
+         never304="true"
+      -->
+    <!--
+       <httpCaching never304="true" >
+         <cacheControl>max-age=30, public</cacheControl>
+       </httpCaching>
+      -->
+    <!-- To enable Solr to respond with automatically generated HTTP
+         Caching headers, and to response to Cache Validation requests
+         correctly, set the value of never304="false"
+
+         This will cause Solr to generate Last-Modified and ETag
+         headers based on the properties of the Index.
+
+         The following options can also be specified to affect the
+         values of these headers...
+
+         lastModFrom - the default value is "openTime" which means the
+         Last-Modified value (and validation against If-Modified-Since
+         requests) will all be relative to when the current Searcher
+         was opened.  You can change it to lastModFrom="dirLastMod" if
+         you want the value to exactly correspond to when the physical
+         index was last modified.
+
+         etagSeed="..." is an option you can change to force the ETag
+         header (and validation against If-None-Match requests) to be
+         different even if the index has not changed (ie: when making
+         significant changes to your config file)
+
+         (lastModifiedFrom and etagSeed are both ignored if you use
+         the never304="true" option)
+      -->
+    <!--
+       <httpCaching lastModifiedFrom="openTime"
+                    etagSeed="Solr">
+         <cacheControl>max-age=30, public</cacheControl>
+       </httpCaching>
+      -->
+  </requestDispatcher>
+
+  <!-- Request Handlers
+
+       http://wiki.apache.org/solr/SolrRequestHandler
+
+       Incoming queries will be dispatched to a specific handler by name
+       based on the path specified in the request.
+
+       Legacy behavior: If the request path uses "/select" but no Request
+       Handler has that name, and if handleSelect="true" has been specified in
+       the requestDispatcher, then the Request Handler is dispatched based on
+       the qt parameter.  Handlers without a leading '/' are accessed this way
+       like so: http://host/app/[core/]select?qt=name  If no qt is
+       given, then the requestHandler that declares default="true" will be
+       used or the one named "standard".
+
+       If a Request Handler is declared with startup="lazy", then it will
+       not be initialized until the first request that uses it.
+
+    -->
+  <!-- SearchHandler
+
+       http://wiki.apache.org/solr/SearchHandler
+
+       For processing Search Queries, the primary Request Handler
+       provided with Solr is "SearchHandler" It delegates to a sequent
+       of SearchComponents (see below) and supports distributed
+       queries across multiple shards
+    -->
+  <!--<requestHandler name="/select" class="solr.SearchHandler">-->
+    <!-- default values for query parameters can be specified, these
+         will be overridden by parameters in the request
+      -->
+     <!--<lst name="defaults">
+       <str name="echoParams">explicit</str>
+       <int name="rows">10</int>
+     </lst>-->
+    <!-- In addition to defaults, "appends" params can be specified
+         to identify values which should be appended to the list of
+         multi-val params from the query (or the existing "defaults").
+      -->
+    <!-- In this example, the param "fq=instock:true" would be appended to
+         any query time fq params the user may specify, as a mechanism for
+         partitioning the index, independent of any user selected filtering
+         that may also be desired (perhaps as a result of faceted searching).
+
+         NOTE: there is *absolutely* nothing a client can do to prevent these
+         "appends" values from being used, so don't use this mechanism
+         unless you are sure you always want it.
+      -->
+    <!--
+       <lst name="appends">
+         <str name="fq">inStock:true</str>
+       </lst>
+      -->
+    <!-- "invariants" are a way of letting the Solr maintainer lock down
+         the options available to Solr clients.  Any params values
+         specified here are used regardless of what values may be specified
+         in either the query, the "defaults", or the "appends" params.
+
+         In this example, the facet.field and facet.query params would
+         be fixed, limiting the facets clients can use.  Faceting is
+         not turned on by default - but if the client does specify
+         facet=true in the request, these are the only facets they
+         will be able to see counts for; regardless of what other
+         facet.field or facet.query params they may specify.
+
+         NOTE: there is *absolutely* nothing a client can do to prevent these
+         "invariants" values from being used, so don't use this mechanism
+         unless you are sure you always want it.
+      -->
+    <!--
+       <lst name="invariants">
+         <str name="facet.field">cat</str>
+         <str name="facet.field">manu_exact</str>
+         <str name="facet.query">price:[* TO 500]</str>
+         <str name="facet.query">price:[500 TO *]</str>
+       </lst>
+      -->
+    <!-- If the default list of SearchComponents is not desired, that
+         list can either be overridden completely, or components can be
+         prepended or appended to the default list.  (see below)
+      -->
+    <!--
+       <arr name="components">
+         <str>nameOfCustomComponent1</str>
+         <str>nameOfCustomComponent2</str>
+       </arr>
+      -->
+    <!--</requestHandler>-->
+
+  <!-- A request handler that returns indented JSON by default -->
+  <requestHandler name="/query" class="solr.SearchHandler">
+     <lst name="defaults">
+       <str name="echoParams">explicit</str>
+       <str name="wt">json</str>
+       <str name="indent">true</str>
+       <str name="df">text</str>
+     </lst>
+  </requestHandler>
+
+  <!--
+    The export request handler is used to export full sorted result sets.
+    Do not change these defaults.
+  -->
+
+  <requestHandler name="/export" class="solr.SearchHandler">
+    <lst name="invariants">
+      <str name="rq">{!xport}</str>
+      <str name="wt">xsort</str>
+      <str name="distrib">false</str>
+    </lst>
+
+    <arr name="components">
+      <str>query</str>
+    </arr>
+  </requestHandler>
+
+  <!-- A Robust Example
+
+       This example SearchHandler declaration shows off usage of the
+       SearchHandler with many defaults declared
+
+       Note that multiple instances of the same Request Handler
+       (SearchHandler) can be registered multiple times with different
+       names (and different init parameters)
+    -->
+  <!--
+  <requestHandler name="/browse" class="solr.SearchHandler">
+     <lst name="defaults">
+       <str name="echoParams">explicit</str>-->
+
+       <!-- VelocityResponseWriter settings -->
+       <!--<str name="wt">velocity</str>
+
+       <str name="v.template">browse</str>
+       <str name="v.layout">layout</str>
+       <str name="title">Solritas</str>
+
+       <str name="defType">edismax</str>
+       <str name="qf">
+          text^0.5 features^1.0 name^1.2 sku^1.5 id^10.0 manu^1.1 cat^1.4
+          title^10.0 description^5.0 keywords^5.0 author^2.0 resourcename^1.0
+       </str>
+       <str name="mm">100%</str>
+       <str name="q.alt">*:*</str>
+       <str name="rows">10</str>
+       <str name="fl">*,score</str>
+       <str name="mlt.qf">
+         text^0.5 features^1.0 name^1.2 sku^1.5 id^10.0 manu^1.1 cat^1.4
+       </str>
+       <str name="mlt.fl">text,features,name,sku,id,manu,cat</str>
+       <int name="mlt.count">3</int>
+
+       <str name="qf">
+          text^0.5 features^1.0 name^1.2 sku^1.5 id^10.0 manu^1.1 cat^1.4
+       </str>
+
+       <str name="facet">on</str>
+       <str name="facet.field">cat</str>
+       <str name="facet.field">manu_exact</str>
+       <str name="facet.query">ipod</str>
+       <str name="facet.query">GB</str>
+       <str name="facet.mincount">1</str>
+       <str name="facet.pivot">cat,inStock</str>
+       <str name="facet.range.other">after</str>
+       <str name="facet.range">price</str>
+       <int name="f.price.facet.range.start">0</int>
+       <int name="f.price.facet.range.end">600</int>
+       <int name="f.price.facet.range.gap">50</int>
+       <str name="facet.range">popularity</str>
+       <int name="f.popularity.facet.range.start">0</int>
+       <int name="f.popularity.facet.range.end">10</int>
+       <int name="f.popularity.facet.range.gap">3</int>
+       <str name="facet.range">manufacturedate_dt</str>
+       <str name="f.manufacturedate_dt.facet.range.start">NOW/YEAR-10YEARS</str>
+       <str name="f.manufacturedate_dt.facet.range.end">NOW</str>
+       <str name="f.manufacturedate_dt.facet.range.gap">+1YEAR</str>
+       <str name="f.manufacturedate_dt.facet.range.other">before</str>
+       <str name="f.manufacturedate_dt.facet.range.other">after</str>-->
+
+       <!-- Highlighting defaults -->
+       <!--<str name="hl">on</str>
+       <str name="hl.fl">text features name</str>
+       <str name="f.name.hl.fragsize">0</str>
+       <str name="f.name.hl.alternateField">name</str>
+     </lst>
+     <arr name="last-components">
+       <str>spellcheck</str>
+     </arr>-->
+     <!--
+     <str name="url-scheme">httpx</str>
+     -->
+  <!--</requestHandler>-->
+  <!-- trivia: the name pinkPony requestHandler was an agreement between the Search API and the
+    apachesolr maintainers. The decision was taken during the Drupalcon Munich codesprint.
+    -->
+  <requestHandler name="pinkPony" class="solr.SearchHandler" default="true">
+    <lst name="defaults">
+      <str name="defType">edismax</str>
+      <str name="df">content</str>
+      <str name="echoParams">explicit</str>
+      <bool name="omitHeader">true</bool>
+      <float name="tie">0.01</float>
+      <!-- Don't abort searches for the pinkPony request handler (set in solrcore.properties) -->
+      <int name="timeAllowed">${solr.pinkPony.timeAllowed:-1}</int>
+      <str name="q.alt">*:*</str>
+
+      <!-- By default, don't spell check -->
+      <str name="spellcheck">false</str>
+      <!-- Defaults for the spell checker when used -->
+      <str name="spellcheck.onlyMorePopular">true</str>
+      <str name="spellcheck.extendedResults">false</str>
+      <!--  The number of suggestions to return -->
+      <str name="spellcheck.count">1</str>
+    </lst>
+    <arr name="last-components">
+      <str>spellcheck</str>
+      <str>elevator</str>
+    </arr>
+  </requestHandler>
+
+  <!-- The more like this handler offers many advantages over the standard handler,
+     when performing moreLikeThis requests.-->
+  <requestHandler name="mlt" class="solr.MoreLikeThisHandler">
+    <lst name="defaults">
+      <str name="df">content</str>
+      <str name="mlt.mintf">1</str>
+      <str name="mlt.mindf">1</str>
+      <str name="mlt.minwl">3</str>
+      <str name="mlt.maxwl">15</str>
+      <str name="mlt.maxqt">20</str>
+      <str name="mlt.match.include">false</str>
+      <!-- Abort any searches longer than 2 seconds (set in solrcore.properties) -->
+      <int name="timeAllowed">${solr.mlt.timeAllowed:2000}</int>
+    </lst>
+  </requestHandler>
+
+  <!-- A minimal query type for doing luene queries -->
+  <requestHandler name="standard" class="solr.SearchHandler">
+     <lst name="defaults">
+       <str name="df">content</str>
+       <str name="echoParams">explicit</str>
+       <bool name="omitHeader">true</bool>
+     </lst>
+  </requestHandler>
+
+  <!-- Update Request Handler.
+
+       http://wiki.apache.org/solr/UpdateXmlMessages
+
+       The canonical Request Handler for Modifying the Index through
+       commands specified using XML, JSON, CSV, or JAVABIN
+
+       Note: Since solr1.1 requestHandlers requires a valid content
+       type header if posted in the body. For example, curl now
+       requires: -H 'Content-type:text/xml; charset=utf-8'
+
+       To override the request content type and force a specific
+       Content-type, use the request parameter:
+         ?update.contentType=text/csv
+
+       This handler will pick a response format to match the input
+       if the 'wt' parameter is not explicit
+    -->
+  <!--<requestHandler name="/update" class="solr.UpdateRequestHandler">
+  </requestHandler>-->
+  <initParams path="/update/**,/query,/select,/tvrh,/elevate,/spell,/browse">
+    <lst name="defaults">
+      <str name="df">text</str>
+    </lst>
+  </initParams>
+
+  <initParams path="/update/json/docs">
+    <lst name="defaults">
+      <!--this ensures that the entire json doc will be stored verbatim into one field-->
+      <str name="srcField">_src_</str>
+      <!--This means a the uniqueKeyField will be extracted from the fields and
+       all fields go into the 'df' field. In this config df is already configured to be 'text'
+        -->
+      <str name="mapUniqueKeyOnly">true</str>
+    </lst>
+
+  </initParams>
+
+  <!-- CSV Update Request Handler
+       http://wiki.apache.org/solr/UpdateCSV
+    -->
+  <requestHandler name="/update/csv"
+                  class="solr.CSVRequestHandler"
+                  startup="lazy" />
+
+  <!-- JSON Update Request Handler
+       http://wiki.apache.org/solr/UpdateJSON
+    -->
+  <requestHandler name="/update/json"
+                  class="solr.JsonUpdateRequestHandler"
+                  startup="lazy" />
+
+  <!-- Solr Cell Update Request Handler
+
+       http://wiki.apache.org/solr/ExtractingRequestHandler
+
+    -->
+  <requestHandler name="/update/extract"
+                  startup="lazy"
+                  class="solr.extraction.ExtractingRequestHandler" >
+    <lst name="defaults">
+      <!-- All the main content goes into "text"... if you need to return
+           the extracted text or do highlighting, use a stored field. -->
+      <str name="fmap.content">text</str>
+      <str name="lowernames">true</str>
+      <str name="uprefix">ignored_</str>
+
+      <!-- capture link hrefs but ignore div attributes -->
+      <str name="captureAttr">true</str>
+      <str name="fmap.a">links</str>
+      <str name="fmap.div">ignored_</str>
+    </lst>
+  </requestHandler>
+
+  <!-- XSLT Update Request Handler
+       Transforms incoming XML with stylesheet identified by tr=
+  -->
+  <requestHandler name="/update/xslt"
+                   startup="lazy"
+                   class="solr.XsltUpdateRequestHandler"/>
+
+  <!-- Field Analysis Request Handler
+
+       RequestHandler that provides much the same functionality as
+       analysis.jsp. Provides the ability to specify multiple field
+       types and field names in the same request and outputs
+       index-time and query-time analysis for each of them.
+
+       Request parameters are:
+       analysis.fieldname - field name whose analyzers are to be used
+
+       analysis.fieldtype - field type whose analyzers are to be used
+       analysis.fieldvalue - text for index-time analysis
+       q (or analysis.q) - text for query time analysis
+       analysis.showmatch (true|false) - When set to true and when
+           query analysis is performed, the produced tokens of the
+           field value analysis will be marked as "matched" for every
+           token that is produces by the query analysis
+   -->
+  <requestHandler name="/analysis/field"
+                  startup="lazy"
+                  class="solr.FieldAnalysisRequestHandler" />
+
+  <!-- Document Analysis Handler
+
+       http://wiki.apache.org/solr/AnalysisRequestHandler
+
+       An analysis handler that provides a breakdown of the analysis
+       process of provided documents. This handler expects a (single)
+       content stream with the following format:
+
+       <docs>
+         <doc>
+           <field name="id">1</field>
+           <field name="name">The Name</field>
+           <field name="text">The Text Value</field>
+         </doc>
+         <doc>...</doc>
+         <doc>...</doc>
+         ...
+       </docs>
+
+    Note: Each document must contain a field which serves as the
+    unique key. This key is used in the returned response to associate
+    an analysis breakdown to the analyzed document.
+
+    Like the FieldAnalysisRequestHandler, this handler also supports
+    query analysis by sending either an "analysis.query" or "q"
+    request parameter that holds the query text to be analyzed. It
+    also supports the "analysis.showmatch" parameter which when set to
+    true, all field tokens that match the query tokens will be marked
+    as a "match".
+  -->
+  <requestHandler name="/analysis/document"
+                  class="solr.DocumentAnalysisRequestHandler"
+                  startup="lazy" />
+
+  <!-- Admin Handlers
+
+       As of Solr 5.0.0, the "/admin/" handlers are registered implicitly.
+    -->
+  <!-- <requestHandler name="/admin/" class="solr.admin.AdminHandlers" /> -->
+  <!-- This single handler is equivalent to the following... -->
+  <!--
+     <requestHandler name="/admin/luke"       class="solr.admin.LukeRequestHandler" />
+     <requestHandler name="/admin/system"     class="solr.admin.SystemInfoHandler" />
+     <requestHandler name="/admin/plugins"    class="solr.admin.PluginInfoHandler" />
+     <requestHandler name="/admin/threads"    class="solr.admin.ThreadDumpHandler" />
+     <requestHandler name="/admin/properties" class="solr.admin.PropertiesRequestHandler" />
+     <requestHandler name="/admin/file"       class="solr.admin.ShowFileRequestHandler" >
+    -->
+  <!-- If you wish to hide files under ${solr.home}/conf, explicitly
+       register the ShowFileRequestHandler using the definition below.
+       NOTE: The glob pattern ('*') is the only pattern supported at present, *.xml will
+             not exclude all files ending in '.xml'. Use it to exclude _all_ updates
+    -->
+  <!--
+     <requestHandler name="/admin/file"
+                     class="solr.admin.ShowFileRequestHandler" >
+       <lst name="invariants">
+         <str name="hidden">synonyms.txt</str>
+         <str name="hidden">anotherfile.txt</str>
+         <str name="hidden">*</str>
+       </lst>
+     </requestHandler>
+    -->
+  <!--
+    Enabling this request handler (which is NOT a default part of the admin handler) will allow the Solr UI to edit
+    all the config files. This is intended for secure/development use ONLY! Leaving available and publically
+    accessible is a security vulnerability and should be done with extreme caution!
+  -->
+  <!--
+  <requestHandler name="/admin/fileedit" class="solr.admin.EditFileRequestHandler" >
+    <lst name="invariants">
+      <str name="qt">pinkPony</str>
+      <str name="q">solrpingquery</str>
+      <str name="omitHeader">false</str>
+    </lst>
+    <lst name="defaults">
+      <str name="echoParams">all</str>
+    </lst>
+    <!- An optional feature of the PingRequestHandler is to configure the
+         handler with a "healthcheckFile" which can be used to enable/disable
+         the PingRequestHandler.
+         relative paths are resolved against the data dir
+    -->
+    <!-- <str name="healthcheckFile">server-enabled.txt</str> -->
+  <!-- </requestHandler>
+  -->
+
+  <!-- Echo the request contents back to the client -->
+  <requestHandler name="/debug/dump" class="solr.DumpRequestHandler" >
+    <lst name="defaults">
+     <str name="echoParams">explicit</str>
+     <str name="echoHandler">true</str>
+    </lst>
+  </requestHandler>
+
+  <!-- Solr Replication
+
+       The SolrReplicationHandler supports replicating indexes from a
+       "master" used for indexing and "slaves" used for queries.
+
+       http://wiki.apache.org/solr/SolrReplication
+
+       In the example below, remove the <lst name="master"> section if
+       this is just a slave and remove  the <lst name="slave"> section
+       if this is just a master.
+  -->
+  <requestHandler name="/replication" class="solr.ReplicationHandler" >
+    <lst name="master">
+      <str name="enable">${solr.replication.master:false}</str>
+      <str name="replicateAfter">commit</str>
+      <str name="replicateAfter">startup</str>
+      <str name="confFiles">${solr.replication.confFiles:schema.xml,mapping-ISOLatin1Accent.txt,protwords.txt,stopwords.txt,synonyms.txt,elevate.xml}</str>
+    </lst>
+    <lst name="slave">
+      <str name="enable">${solr.replication.slave:false}</str>
+      <str name="masterUrl">${solr.replication.masterUrl:http://localhost:8983/solr}/replication</str>
+      <str name="pollInterval">${solr.replication.pollInterval:00:00:60}</str>
+    </lst>
+  </requestHandler>
+
+  <!-- Realtime get handler, guaranteed to return the latest stored fields of
+       any document, without the need to commit or open a new searcher.  The
+       current implementation relies on the updateLog feature being enabled.
+  -->
+  <requestHandler name="/get" class="solr.RealTimeGetHandler">
+    <lst name="defaults">
+      <str name="omitHeader">true</str>
+      <str name="wt">json</str>
+      <str name="indent">true</str>
+    </lst>
+  </requestHandler>
+
+  <!-- Search Components
+
+       Search components are registered to SolrCore and used by
+       instances of SearchHandler (which can access them by name)
+
+       By default, the following components are available:
+
+       <searchComponent name="query"     class="solr.QueryComponent" />
+       <searchComponent name="facet"     class="solr.FacetComponent" />
+       <searchComponent name="mlt"       class="solr.MoreLikeThisComponent" />
+       <searchComponent name="highlight" class="solr.HighlightComponent" />
+       <searchComponent name="stats"     class="solr.StatsComponent" />
+       <searchComponent name="debug"     class="solr.DebugComponent" />
+
+       Default configuration in a requestHandler would look like:
+
+       <arr name="components">
+         <str>query</str>
+         <str>facet</str>
+         <str>mlt</str>
+         <str>highlight</str>
+         <str>stats</str>
+         <str>debug</str>
+       </arr>
+
+       If you register a searchComponent to one of the standard names,
+       that will be used instead of the default.
+
+       To insert components before or after the 'standard' components, use:
+
+       <arr name="first-components">
+         <str>myFirstComponentName</str>
+       </arr>
+
+       <arr name="last-components">
+         <str>myLastComponentName</str>
+       </arr>
+
+       NOTE: The component registered with the name "debug" will
+       always be executed after the "last-components"
+
+     -->
+
+  <!-- A request handler for demonstrating the spellcheck component.
+
+       NOTE: This is purely as an example.  The whole purpose of the
+       SpellCheckComponent is to hook it into the request handler that
+       handles your normal user queries so that a separate request is
+       not needed to get suggestions.
+
+       IN OTHER WORDS, THERE IS REALLY GOOD CHANCE THE SETUP BELOW IS
+       NOT WHAT YOU WANT FOR YOUR PRODUCTION SYSTEM!
+
+       See http://wiki.apache.org/solr/SpellCheckComponent for details
+       on the request parameters.
+    -->
+  <requestHandler name="/spell" class="solr.SearchHandler" startup="lazy">
+    <lst name="defaults">
+      <!-- Solr will use suggestions from both the 'default' spellchecker
+           and from the 'wordbreak' spellchecker and combine them.
+           collations (re-written queries) can include a combination of
+           corrections from both spellcheckers -->
+      <str name="spellcheck.dictionary">default</str>
+      <str name="spellcheck.dictionary">wordbreak</str>
+      <str name="spellcheck.onlyMorePopular">false</str>
+      <str name="spellcheck.extendedResults">false</str>
+      <str name="spellcheck.count">1</str>
+      <str name="spellcheck.alternativeTermCount">5</str>
+      <str name="spellcheck.maxResultsForSuggest">5</str>
+      <str name="spellcheck.collate">true</str>
+      <str name="spellcheck.collateExtendedResults">true</str>
+      <str name="spellcheck.maxCollationTries">10</str>
+      <str name="spellcheck.maxCollations">5</str>
+    </lst>
+    <arr name="last-components">
+      <str>spellcheck</str>
+    </arr>
+  </requestHandler>
+
+  <!-- This is disabled by default because it currently causes long startup times on
+       big indexes, even when never used.  See SOLR-6679 for background.
+
+       To use this suggester, set the "solr.suggester.enabled=true" system property
+    -->
+  <searchComponent name="suggest" class="solr.SuggestComponent"
+                   enable="${solr.suggester.enabled:false}"     >
+    <lst name="suggester">
+      <str name="name">mySuggester</str>
+      <str name="lookupImpl">FuzzyLookupFactory</str>
+      <str name="dictionaryImpl">DocumentDictionaryFactory</str>
+      <str name="field">cat</str>
+      <str name="weightField">price</str>
+      <str name="suggestAnalyzerFieldType">string</str>
+    </lst>
+  </searchComponent>
+
+  <requestHandler name="/suggest" class="solr.SearchHandler"
+                  startup="lazy" enable="${solr.suggester.enabled:false}" >
+    <lst name="defaults">
+      <str name="suggest">true</str>
+      <str name="suggest.count">10</str>
+    </lst>
+    <arr name="components">
+      <str>suggest</str>
+    </arr>
+  </requestHandler>
+
+  <!-- Term Vector Component
+
+       http://wiki.apache.org/solr/TermVectorComponent
+    -->
+  <searchComponent name="tvComponent" class="solr.TermVectorComponent"/>
+
+  <!-- A request handler for demonstrating the term vector component
+
+       This is purely as an example.
+
+       In reality you will likely want to add the component to your
+       already specified request handlers.
+    -->
+  <requestHandler name="/tvrh" class="solr.SearchHandler" startup="lazy">
+    <lst name="defaults">
+      <bool name="tv">true</bool>
+    </lst>
+    <arr name="last-components">
+      <str>tvComponent</str>
+    </arr>
+  </requestHandler>
+
+  <!-- Clustering Component
+
+       http://wiki.apache.org/solr/ClusteringComponent
+
+       This relies on third party jars which are notincluded in the
+       release.  To use this component (and the "/clustering" handler)
+       Those jars will need to be downloaded, and you'll need to set
+       the solr.cluster.enabled system property when running solr...
+
+          java -Dsolr.clustering.enabled=true -jar start.jar
+    -->
+  <!-- <searchComponent name="clustering"
+                   enable="${solr.clustering.enabled:false}"
+                   class="solr.clustering.ClusteringComponent" > -->
+    <!-- Declare an engine -->
+    <!--<lst name="engine">-->
+      <!-- The name, only one can be named "default" -->
+      <!--<str name="name">default</str>-->
+
+      <!-- Class name of Carrot2 clustering algorithm.
+
+           Currently available algorithms are:
+
+           * org.carrot2.clustering.lingo.LingoClusteringAlgorithm
+           * org.carrot2.clustering.stc.STCClusteringAlgorithm
+           * org.carrot2.clustering.kmeans.BisectingKMeansClusteringAlgorithm
+
+           See http://project.carrot2.org/algorithms.html for the
+           algorithm's characteristics.
+        -->
+      <!--<str name="carrot.algorithm">org.carrot2.clustering.lingo.LingoClusteringAlgorithm</str>-->
+
+      <!-- Overriding values for Carrot2 default algorithm attributes.
+
+           For a description of all available attributes, see:
+           http://download.carrot2.org/stable/manual/#chapter.components.
+           Use attribute key as name attribute of str elements
+           below. These can be further overridden for individual
+           requests by specifying attribute key as request parameter
+           name and attribute value as parameter value.
+        -->
+      <!--<str name="LingoClusteringAlgorithm.desiredClusterCountBase">20</str>-->
+
+      <!-- Location of Carrot2 lexical resources.
+
+           A directory from which to load Carrot2-specific stop words
+           and stop labels. Absolute or relative to Solr config directory.
+           If a specific resource (e.g. stopwords.en) is present in the
+           specified dir, it will completely override the corresponding
+           default one that ships with Carrot2.
+
+           For an overview of Carrot2 lexical resources, see:
+           http://download.carrot2.org/head/manual/#chapter.lexical-resources
+        -->
+      <!--<str name="carrot.lexicalResourcesDir">clustering/carrot2</str>-->
+
+      <!-- The language to assume for the documents.
+
+           For a list of allowed values, see:
+           http://download.carrot2.org/stable/manual/#section.attribute.lingo.MultilingualClustering.defaultLanguage
+       -->
+      <!--<str name="MultilingualClustering.defaultLanguage">ENGLISH</str>
+    </lst>
+    <lst name="engine">
+      <str name="name">stc</str>
+      <str name="carrot.algorithm">org.carrot2.clustering.stc.STCClusteringAlgorithm</str>
+    </lst>
+  </searchComponent>-->
+
+  <!-- A request handler for demonstrating the clustering component
+
+       This is purely as an example.
+
+       In reality you will likely want to add the component to your
+       already specified request handlers.
+    -->
+  <!--<requestHandler name="/clustering"
+                  startup="lazy"
+                  enable="${solr.clustering.enabled:false}"
+                  class="solr.SearchHandler">
+    <lst name="defaults">
+      <bool name="clustering">true</bool>
+      <str name="clustering.engine">default</str>
+      <bool name="clustering.results">true</bool>-->
+      <!-- The title field -->
+      <!--<str name="carrot.title">name</str>-->
+      <!--<str name="carrot.url">id</str>-->
+      <!-- The field to cluster on -->
+       <!--<str name="carrot.snippet">features</str>-->
+       <!-- produce summaries -->
+       <!--<bool name="carrot.produceSummary">true</bool>-->
+       <!-- the maximum number of labels per cluster -->
+       <!--<int name="carrot.numDescriptions">5</int>-->
+       <!-- produce sub clusters -->
+       <!--<bool name="carrot.outputSubClusters">false</bool>-->
+
+       <!--<str name="defType">edismax</str>
+       <str name="qf">
+          text^0.5 features^1.0 name^1.2 sku^1.5 id^10.0 manu^1.1 cat^1.4
+       </str>
+       <str name="q.alt">*:*</str>
+       <str name="rows">10</str>
+       <str name="fl">*,score</str>
+    </lst>
+    <arr name="last-components">
+      <str>clustering</str>
+    </arr>
+  </requestHandler>-->
+
+  <!-- Terms Component
+
+       http://wiki.apache.org/solr/TermsComponent
+
+       A component to return terms and document frequency of those
+       terms
+    -->
+  <searchComponent name="terms" class="solr.TermsComponent"/>
+
+  <!-- A request handler for demonstrating the terms component -->
+  <requestHandler name="/terms" class="solr.SearchHandler" startup="lazy">
+     <lst name="defaults">
+      <bool name="terms">true</bool>
+    </lst>
+    <arr name="components">
+      <str>terms</str>
+    </arr>
+  </requestHandler>
+
+  <!-- Query Elevation Component
+
+       http://wiki.apache.org/solr/QueryElevationComponent
+
+       a search component that enables you to configure the top
+       results for a given query regardless of the normal lucene
+       scoring.
+    -->
+  <searchComponent name="elevator" class="solr.QueryElevationComponent" >
+    <!-- pick a fieldType to analyze queries -->
+    <str name="queryFieldType">string</str>
+    <str name="config-file">elevate.xml</str>
+  </searchComponent>
+
+  <!-- A request handler for demonstrating the elevator component -->
+  <requestHandler name="/elevate" class="solr.SearchHandler" startup="lazy">
+    <lst name="defaults">
+      <str name="echoParams">explicit</str>
+    </lst>
+    <arr name="last-components">
+      <str>elevator</str>
+    </arr>
+  </requestHandler>
+
+  <!-- Highlighting Component
+
+       http://wiki.apache.org/solr/HighlightingParameters
+    -->
+  <searchComponent class="solr.HighlightComponent" name="highlight">
+    <highlighting>
+      <!-- Configure the standard fragmenter -->
+      <!-- This could most likely be commented out in the "default" case -->
+      <fragmenter name="gap"
+                  default="true"
+                  class="solr.highlight.GapFragmenter">
+        <lst name="defaults">
+          <int name="hl.fragsize">100</int>
+        </lst>
+      </fragmenter>
+
+      <!-- A regular-expression-based fragmenter
+           (for sentence extraction)
+        -->
+      <fragmenter name="regex"
+                  class="solr.highlight.RegexFragmenter">
+        <lst name="defaults">
+          <!-- slightly smaller fragsizes work better because of slop -->
+          <int name="hl.fragsize">70</int>
+          <!-- allow 50% slop on fragment sizes -->
+          <float name="hl.regex.slop">0.5</float>
+          <!-- a basic sentence pattern -->
+          <str name="hl.regex.pattern">[-\w ,/\n\&quot;&apos;]{20,200}</str>
+        </lst>
+      </fragmenter>
+
+      <!-- Configure the standard formatter -->
+      <formatter name="html"
+                 default="true"
+                 class="solr.highlight.HtmlFormatter">
+        <lst name="defaults">
+          <str name="hl.simple.pre"><![CDATA[<strong>]]></str>
+          <str name="hl.simple.post"><![CDATA[</strong>]]></str>
+        </lst>
+      </formatter>
+
+      <!-- Configure the standard encoder -->
+      <encoder name="html"
+               class="solr.highlight.HtmlEncoder" />
+
+      <!-- Configure the standard fragListBuilder -->
+      <fragListBuilder name="simple"
+                       default="true"
+                       class="solr.highlight.SimpleFragListBuilder"/>
+
+      <!-- Configure the single fragListBuilder -->
+      <fragListBuilder name="single"
+                       class="solr.highlight.SingleFragListBuilder"/>
+
+      <!-- default tag FragmentsBuilder -->
+      <fragmentsBuilder name="default"
+                        default="true"
+                        class="solr.highlight.ScoreOrderFragmentsBuilder">
+        <!--
+        <lst name="defaults">
+          <str name="hl.multiValuedSeparatorChar">/</str>
+        </lst>
+        -->
+      </fragmentsBuilder>
+
+      <!-- multi-colored tag FragmentsBuilder -->
+      <fragmentsBuilder name="colored"
+                        class="solr.highlight.ScoreOrderFragmentsBuilder">
+        <lst name="defaults">
+          <str name="hl.tag.pre"><![CDATA[
+               <b style="background:yellow">,<b style="background:lawgreen">,
+               <b style="background:aquamarine">,<b style="background:magenta">,
+               <b style="background:palegreen">,<b style="background:coral">,
+               <b style="background:wheat">,<b style="background:khaki">,
+               <b style="background:lime">,<b style="background:deepskyblue">]]></str>
+          <str name="hl.tag.post"><![CDATA[</b>]]></str>
+        </lst>
+      </fragmentsBuilder>
+
+      <boundaryScanner name="default"
+                       default="true"
+                       class="solr.highlight.SimpleBoundaryScanner">
+        <lst name="defaults">
+          <str name="hl.bs.maxScan">10</str>
+          <str name="hl.bs.chars">.,!? &#9;&#10;&#13;</str>
+        </lst>
+      </boundaryScanner>
+
+      <boundaryScanner name="breakIterator"
+                       class="solr.highlight.BreakIteratorBoundaryScanner">
+        <lst name="defaults">
+          <!-- type should be one of CHARACTER, WORD(default), LINE and SENTENCE -->
+          <str name="hl.bs.type">WORD</str>
+          <!-- language and country are used when constructing Locale object.  -->
+          <!-- And the Locale object will be used when getting instance of BreakIterator -->
+          <str name="hl.bs.language">en</str>
+          <str name="hl.bs.country">US</str>
+        </lst>
+      </boundaryScanner>
+    </highlighting>
+  </searchComponent>
+
+  <!-- Update Processors
+
+       Chains of Update Processor Factories for dealing with Update
+       Requests can be declared, and then used by name in Update
+       Request Processors
+
+       http://wiki.apache.org/solr/UpdateRequestProcessor
+
+    -->
+  <!-- Deduplication
+
+       An example dedup update processor that creates the "id" field
+       on the fly based on the hash code of some other fields.  This
+       example has overwriteDupes set to false since we are using the
+       id field as the signatureField and Solr will maintain
+       uniqueness based on that anyway.
+
+    -->
+  <!--
+     <updateRequestProcessorChain name="dedupe">
+       <processor class="solr.processor.SignatureUpdateProcessorFactory">
+         <bool name="enabled">true</bool>
+         <str name="signatureField">id</str>
+         <bool name="overwriteDupes">false</bool>
+         <str name="fields">name,features,cat</str>
+         <str name="signatureClass">solr.processor.Lookup3Signature</str>
+       </processor>
+       <processor class="solr.LogUpdateProcessorFactory" />
+       <processor class="solr.RunUpdateProcessorFactory" />
+     </updateRequestProcessorChain>
+    -->
+
+  <!-- Language identification
+
+       This example update chain identifies the language of the incoming
+       documents using the langid contrib. The detected language is
+       written to field language_s. No field name mapping is done.
+       The fields used for detection are text, title, subject and description,
+       making this example suitable for detecting languages form full-text
+       rich documents injected via ExtractingRequestHandler.
+       See more about langId at http://wiki.apache.org/solr/LanguageDetection
+    -->
+    <!--
+     <updateRequestProcessorChain name="langid">
+       <processor class="org.apache.solr.update.processor.TikaLanguageIdentifierUpdateProcessorFactory">
+         <str name="langid.fl">text,title,subject,description</str>
+         <str name="langid.langField">language_s</str>
+         <str name="langid.fallback">en</str>
+       </processor>
+       <processor class="solr.LogUpdateProcessorFactory" />
+       <processor class="solr.RunUpdateProcessorFactory" />
+     </updateRequestProcessorChain>
+    -->
+
+  <!-- Response Writers
+
+       http://wiki.apache.org/solr/QueryResponseWriter
+
+       Request responses will be written using the writer specified by
+       the 'wt' request parameter matching the name of a registered
+       writer.
+
+       The "default" writer is the default and will be used if 'wt' is
+       not specified in the request.
+    -->
+  <!-- The following response writers are implicitly configured unless
+       overridden...
+    -->
+  <!--
+     <queryResponseWriter name="xml"
+                          default="true"
+                          class="solr.XMLResponseWriter" />
+     <queryResponseWriter name="json" class="solr.JSONResponseWriter"/>
+     <queryResponseWriter name="python" class="solr.PythonResponseWriter"/>
+     <queryResponseWriter name="ruby" class="solr.RubyResponseWriter"/>
+     <queryResponseWriter name="php" class="solr.PHPResponseWriter"/>
+     <queryResponseWriter name="phps" class="solr.PHPSerializedResponseWriter"/>
+     <queryResponseWriter name="csv" class="solr.CSVResponseWriter"/>
+    -->
+
+  <queryResponseWriter name="json" class="solr.JSONResponseWriter">
+     <!-- For the purposes of the tutorial, JSON responses are written as
+      plain text so that they are easy to read in *any* browser.
+      If you expect a MIME type of "application/json" just remove this override.
+     -->
+    <str name="content-type">text/plain; charset=UTF-8</str>
+  </queryResponseWriter>
+
+  <!--
+     Custom response writers can be declared as needed...
+    -->
+    <!-- The solr.velocity.enabled flag is used by Solr's test cases so that this response writer is not
+         loaded (causing an error if contrib/velocity has not been built fully) -->
+    <!-- <queryResponseWriter name="velocity" class="solr.VelocityResponseWriter" enable="${solr.velocity.enabled:true}"/> -->
+
+  <!-- XSLT response writer transforms the XML output by any xslt file found
+       in Solr's conf/xslt directory.  Changes to xslt files are checked for
+       every xsltCacheLifetimeSeconds.
+    -->
+  <queryResponseWriter name="xslt" class="solr.XSLTResponseWriter">
+    <int name="xsltCacheLifetimeSeconds">5</int>
+  </queryResponseWriter>
+
+  <!-- Query Parsers
+
+       http://wiki.apache.org/solr/SolrQuerySyntax
+
+       Multiple QParserPlugins can be registered by name, and then
+       used in either the "defType" param for the QueryComponent (used
+       by SearchHandler) or in LocalParams
+    -->
+  <!-- example of registering a query parser -->
+  <!--
+     <queryParser name="myparser" class="com.mycompany.MyQParserPlugin"/>
+    -->
+
+  <!-- Function Parsers
+
+       http://wiki.apache.org/solr/FunctionQuery
+
+       Multiple ValueSourceParsers can be registered by name, and then
+       used as function names when using the "func" QParser.
+    -->
+  <!-- example of registering a custom function parser  -->
+  <!--
+     <valueSourceParser name="myfunc"
+                        class="com.mycompany.MyValueSourceParser" />
+    -->
+
+  <!-- Legacy config for the admin interface -->
+  <admin>
+    <defaultQuery>*:*</defaultQuery>
+
+    <!-- configure a healthcheck file for servers behind a
+         loadbalancer
+      -->
+    <!--
+       <healthcheck type="file">server-enabled</healthcheck>
+      -->
+  </admin>
+
+  <!-- Following is a dynamic way to include other components or any customized solrconfig.xml stuff, added by other contrib modules -->
+  <xi:include href="solrconfig_extra.xml" xmlns:xi="http://www.w3.org/2001/XInclude">
+    <xi:fallback>
+    <!-- Spell Check
+
+        The spell check component can return a list of alternative spelling
+        suggestions. This component must be defined in
+        solrconfig_extra.xml if present, since it's used in the search handler.
+
+        http://wiki.apache.org/solr/SpellCheckComponent
+     -->
+    <searchComponent name="spellcheck" class="solr.SpellCheckComponent">
+
+    <str name="queryAnalyzerFieldType">textSpell</str>
+
+    <!-- a spellchecker built from a field of the main index -->
+      <lst name="spellchecker">
+        <str name="name">default</str>
+        <str name="field">spell</str>
+        <str name="spellcheckIndexDir">spellchecker</str>
+        <str name="buildOnOptimize">true</str>
+      </lst>
+    </searchComponent>
+    </xi:fallback>
+  </xi:include>
+
+</config>
diff --git a/profiles/wcm_base/modules/contrib/search_api_solr/solr-conf/7.x/solrconfig_extra.xml b/profiles/wcm_base/modules/contrib/search_api_solr/solr-conf/7.x/solrconfig_extra.xml
new file mode 100644
index 00000000..c5bc3acf
--- /dev/null
+++ b/profiles/wcm_base/modules/contrib/search_api_solr/solr-conf/7.x/solrconfig_extra.xml
@@ -0,0 +1,80 @@
+<!-- Spell Check
+
+    The spell check component can return a list of alternative spelling
+    suggestions.
+
+    http://wiki.apache.org/solr/SpellCheckComponent
+ -->
+<searchComponent name="spellcheck" class="solr.SpellCheckComponent">
+
+<str name="queryAnalyzerFieldType">textSpell</str>
+
+<!-- Multiple "Spell Checkers" can be declared and used by this
+     component
+  -->
+
+<!-- a spellchecker built from a field of the main index, and
+     written to disk
+  -->
+<lst name="spellchecker">
+  <str name="name">default</str>
+  <str name="field">spell</str>
+  <str name="spellcheckIndexDir">spellchecker</str>
+  <str name="buildOnOptimize">true</str>
+  <!-- uncomment this to require terms to occur in 1% of the documents in order to be included in the dictionary
+    <float name="thresholdTokenFrequency">.01</float>
+  -->
+</lst>
+
+<!--
+  Adding German spellhecker index to our Solr index
+  This also requires to enable the content in schema_extra_types.xml and schema_extra_fields.xml
+-->
+<!--
+<lst name="spellchecker">
+  <str name="name">spellchecker_de</str>
+  <str name="field">spell_de</str>
+  <str name="spellcheckIndexDir">./spellchecker_de</str>
+  <str name="buildOnOptimize">true</str>
+</lst>
+-->
+
+<!-- a spellchecker that uses a different distance measure -->
+<!--
+   <lst name="spellchecker">
+     <str name="name">jarowinkler</str>
+     <str name="field">spell</str>
+     <str name="distanceMeasure">
+       org.apache.lucene.search.spell.JaroWinklerDistance
+     </str>
+     <str name="spellcheckIndexDir">spellcheckerJaro</str>
+   </lst>
+ -->
+
+<!-- a spellchecker that use an alternate comparator
+
+     comparatorClass be one of:
+      1. score (default)
+      2. freq (Frequency first, then score)
+      3. A fully qualified class name
+  -->
+<!--
+   <lst name="spellchecker">
+     <str name="name">freq</str>
+     <str name="field">lowerfilt</str>
+     <str name="spellcheckIndexDir">spellcheckerFreq</str>
+     <str name="comparatorClass">freq</str>
+     <str name="buildOnCommit">true</str>
+  -->
+
+<!-- A spellchecker that reads the list of words from a file -->
+<!--
+   <lst name="spellchecker">
+     <str name="classname">solr.FileBasedSpellChecker</str>
+     <str name="name">file</str>
+     <str name="sourceLocation">spellings.txt</str>
+     <str name="characterEncoding">UTF-8</str>
+     <str name="spellcheckIndexDir">spellcheckerFile</str>
+   </lst>
+  -->
+</searchComponent>
diff --git a/profiles/wcm_base/modules/contrib/search_api_solr/solr-conf/7.x/solrcore.properties b/profiles/wcm_base/modules/contrib/search_api_solr/solr-conf/7.x/solrcore.properties
new file mode 100644
index 00000000..fb8d7d05
--- /dev/null
+++ b/profiles/wcm_base/modules/contrib/search_api_solr/solr-conf/7.x/solrcore.properties
@@ -0,0 +1,20 @@
+# Defines Solr properties for this specific core.
+solr.replication.master=false
+solr.replication.slave=false
+solr.replication.pollInterval=00:00:60
+solr.replication.masterUrl=http://localhost:8983/solr
+solr.replication.confFiles=schema.xml,mapping-ISOLatin1Accent.txt,protwords.txt,stopwords.txt,synonyms.txt,elevate.xml
+solr.mlt.timeAllowed=2000
+# You should not set your luceneMatchVersion to anything lower than your Solr
+# Version.
+solr.luceneMatchVersion=6.0
+solr.pinkPony.timeAllowed=-1
+# autoCommit after 10000 docs
+solr.autoCommit.MaxDocs=10000
+# autoCommit after 2 minutes
+solr.autoCommit.MaxTime=120000
+# autoSoftCommit after 2000 docs
+solr.autoSoftCommit.MaxDocs=2000
+# autoSoftCommit after 10 seconds
+solr.autoSoftCommit.MaxTime=10000
+solr.contrib.dir=../../../contrib
diff --git a/profiles/wcm_base/modules/contrib/search_api_solr/solr-conf/7.x/stopwords.txt b/profiles/wcm_base/modules/contrib/search_api_solr/solr-conf/7.x/stopwords.txt
new file mode 100644
index 00000000..d7f243e4
--- /dev/null
+++ b/profiles/wcm_base/modules/contrib/search_api_solr/solr-conf/7.x/stopwords.txt
@@ -0,0 +1,4 @@
+# Contains words which shouldn't be indexed for fulltext fields, e.g., because
+# they're too common. For documentation of the format, see
+# http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#solr.StopFilterFactory
+# (Lines starting with a pound character # are ignored.)
diff --git a/profiles/wcm_base/modules/contrib/search_api_solr/solr-conf/7.x/synonyms.txt b/profiles/wcm_base/modules/contrib/search_api_solr/solr-conf/7.x/synonyms.txt
new file mode 100644
index 00000000..7d22eea6
--- /dev/null
+++ b/profiles/wcm_base/modules/contrib/search_api_solr/solr-conf/7.x/synonyms.txt
@@ -0,0 +1,3 @@
+# Contains synonyms to use for your index. For the format used, see
+# http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#solr.SynonymFilterFactory
+# (Lines starting with a pound character # are ignored.)
diff --git a/profiles/wcm_base/modules/custom/ocio_news/ocio_news.module b/profiles/wcm_base/modules/custom/ocio_news/ocio_news.module
index cd64ec2b..b679dc1c 100644
--- a/profiles/wcm_base/modules/custom/ocio_news/ocio_news.module
+++ b/profiles/wcm_base/modules/custom/ocio_news/ocio_news.module
@@ -28,7 +28,7 @@ function ocio_news_views_pre_render(&$view) {
       if (isset($field->field_info) && $field->field_info['field_name'] == 'field_byline') {
         foreach ($view->result as &$row) {
           $field_name = 'field_' . $field->field;
-          if ($row->{$field_name}[0]['raw']['value'] == '<none>') {
+          if (isset($row->{$field_name}[0]) && $row->{$field_name}[0]['raw']['value'] == '<none>') {
             $row->{$field_name}[0]['rendered']['#markup'] = '';
           }
         }
diff --git a/profiles/wcm_base/modules/custom/ocio_web_form/ocio_web_form.module b/profiles/wcm_base/modules/custom/ocio_web_form/ocio_web_form.module
index bd7e4648..36766897 100644
--- a/profiles/wcm_base/modules/custom/ocio_web_form/ocio_web_form.module
+++ b/profiles/wcm_base/modules/custom/ocio_web_form/ocio_web_form.module
@@ -82,8 +82,8 @@ function ocio_web_form_validate(&$form, &$form_state){
     drupal_get_messages('error');
 
     foreach ($errors as $element_id => $message) {
-      $id_raw = end(explode('][', $element_id));
-      $id = preg_replace('/(-|_)+/', '-', $id_raw);
+      $id_raw = explode('][', $element_id);
+      $id = preg_replace('/(-|_)+/', '-', end($id_raw));
 
       if (!strpos($message, 'href')) {
         $message = l($message, '',  array('fragment' => 'edit-submitted-'. $id, 'external' => TRUE));
diff --git a/profiles/wcm_base/modules/custom/wcm_suppress_headers/README.md b/profiles/wcm_base/modules/custom/wcm_suppress_headers/README.md
new file mode 100644
index 00000000..4edd39ea
--- /dev/null
+++ b/profiles/wcm_base/modules/custom/wcm_suppress_headers/README.md
@@ -0,0 +1,5 @@
+# WCM Suppress Headers module
+
+This is a simple, one-function module that uses hook_mail_alter to turn off the Sender and Errors-To headers.
+
+Turn this module on if you want to send mail from a Drupal site, using an approved sender that is different from your site-wide address.
diff --git a/profiles/wcm_base/modules/custom/wcm_suppress_headers/wcm_suppress_headers.info b/profiles/wcm_base/modules/custom/wcm_suppress_headers/wcm_suppress_headers.info
new file mode 100644
index 00000000..b14d8e8b
--- /dev/null
+++ b/profiles/wcm_base/modules/custom/wcm_suppress_headers/wcm_suppress_headers.info
@@ -0,0 +1,4 @@
+name = WCM Suppress Mail Headers
+description = Turn off the sender: header. Useful if you want to use a "from" address in a webform e-mail that is different from the site-wide address.
+core = 7.x
+package = Mail
diff --git a/profiles/wcm_base/modules/custom/wcm_suppress_headers/wcm_suppress_headers.module b/profiles/wcm_base/modules/custom/wcm_suppress_headers/wcm_suppress_headers.module
new file mode 100644
index 00000000..29e1c5d2
--- /dev/null
+++ b/profiles/wcm_base/modules/custom/wcm_suppress_headers/wcm_suppress_headers.module
@@ -0,0 +1,10 @@
+<?php
+/**
+ * A quick and dirty module
+ * to turn off the sender field
+ * in outgoing mail.
+ */
+function wcm_suppress_headers_mail_alter(&$message) {
+  unset($message['headers']['Sender']);
+  unset($message['headers']['Errors-To']);
+}
diff --git a/profiles/wcm_base/modules/panopoly/panopoly_admin/CHANGELOG.txt b/profiles/wcm_base/modules/panopoly/panopoly_admin/CHANGELOG.txt
index 2101f4bb..6cc41fb0 100644
--- a/profiles/wcm_base/modules/panopoly/panopoly_admin/CHANGELOG.txt
+++ b/profiles/wcm_base/modules/panopoly/panopoly_admin/CHANGELOG.txt
@@ -1,3 +1,7 @@
+7.x-1.56, 2018-10-10
+-------------------
+- No changes since last release.
+
 7.x-1.55, 2018-07-04
 -------------------
 - No changes since last release.
diff --git a/profiles/wcm_base/modules/panopoly/panopoly_admin/panopoly_admin.info b/profiles/wcm_base/modules/panopoly/panopoly_admin/panopoly_admin.info
index b5b9eb48..398e14bf 100644
--- a/profiles/wcm_base/modules/panopoly/panopoly_admin/panopoly_admin.info
+++ b/profiles/wcm_base/modules/panopoly/panopoly_admin/panopoly_admin.info
@@ -37,8 +37,8 @@ features[page_manager_pages][] = panopoly_admin_layout_library
 features[page_manager_pages][] = panopoly_admin_page_library
 features[page_manager_pages][] = panopoly_admin_pane_library
 
-; Information added by Drupal.org packaging script on 2018-07-04
-version = "7.x-1.55"
+; Information added by Drupal.org packaging script on 2018-10-10
+version = "7.x-1.56"
 core = "7.x"
 project = "panopoly_admin"
-datestamp = "1530728120"
+datestamp = "1539206885"
diff --git a/profiles/wcm_base/modules/panopoly/panopoly_core/CHANGELOG.txt b/profiles/wcm_base/modules/panopoly/panopoly_core/CHANGELOG.txt
index c058b586..c8c82cd0 100644
--- a/profiles/wcm_base/modules/panopoly/panopoly_core/CHANGELOG.txt
+++ b/profiles/wcm_base/modules/panopoly/panopoly_core/CHANGELOG.txt
@@ -1,3 +1,7 @@
+7.x-1.56, 2018-10-10
+-------------------
+- No changes since last release.
+
 7.x-1.55, 2018-07-04
 -------------------
 - Update UUID to version 1.1.
diff --git a/profiles/wcm_base/modules/panopoly/panopoly_core/panopoly_core.info b/profiles/wcm_base/modules/panopoly/panopoly_core/panopoly_core.info
index dc3b37b1..662d1075 100644
--- a/profiles/wcm_base/modules/panopoly/panopoly_core/panopoly_core.info
+++ b/profiles/wcm_base/modules/panopoly/panopoly_core/panopoly_core.info
@@ -82,8 +82,8 @@ features_exclude[variable][panelizer_taxonomy_term:panopoly_categories_allowed_t
 features_exclude[variable][panelizer_defaults_taxonomy_term_panopoly_categories] = panelizer_defaults_taxonomy_term_panopoly_categories
 features_exclude[variable][pathauto_taxonomy_term_panopoly_categories_pattern] = pathauto_taxonomy_term_panopoly_categories_pattern
 
-; Information added by Drupal.org packaging script on 2018-07-04
-version = "7.x-1.55"
+; Information added by Drupal.org packaging script on 2018-10-10
+version = "7.x-1.56"
 core = "7.x"
 project = "panopoly_core"
-datestamp = "1530728132"
+datestamp = "1539206899"
diff --git a/profiles/wcm_base/modules/panopoly/panopoly_magic/CHANGELOG.txt b/profiles/wcm_base/modules/panopoly/panopoly_magic/CHANGELOG.txt
index 6a23fe92..569e8162 100644
--- a/profiles/wcm_base/modules/panopoly/panopoly_magic/CHANGELOG.txt
+++ b/profiles/wcm_base/modules/panopoly/panopoly_magic/CHANGELOG.txt
@@ -1,3 +1,7 @@
+7.x-1.56, 2018-10-10
+-------------------
+- PHP notices when previewing widgets.
+
 7.x-1.55, 2018-07-04
 -------------------
 - Improve accessibility of the 'Single' and 'Manual' preview modes.
diff --git a/profiles/wcm_base/modules/panopoly/panopoly_magic/panopoly_magic.info b/profiles/wcm_base/modules/panopoly/panopoly_magic/panopoly_magic.info
index e73218c8..5f27405d 100644
--- a/profiles/wcm_base/modules/panopoly/panopoly_magic/panopoly_magic.info
+++ b/profiles/wcm_base/modules/panopoly/panopoly_magic/panopoly_magic.info
@@ -15,8 +15,8 @@ stylesheets[all][] = css/panopoly-modal.css
 features[features_api][] = api:2
 files[] = plugins/views/panopoly_magic_plugin_display_panel_pane.inc
 
-; Information added by Drupal.org packaging script on 2018-07-04
-version = "7.x-1.55"
+; Information added by Drupal.org packaging script on 2018-10-10
+version = "7.x-1.56"
 core = "7.x"
 project = "panopoly_magic"
-datestamp = "1530728661"
+datestamp = "1539206939"
diff --git a/profiles/wcm_base/modules/panopoly/panopoly_magic/panopoly_magic.module b/profiles/wcm_base/modules/panopoly/panopoly_magic/panopoly_magic.module
index f30ddcd7..fd5b5536 100644
--- a/profiles/wcm_base/modules/panopoly/panopoly_magic/panopoly_magic.module
+++ b/profiles/wcm_base/modules/panopoly/panopoly_magic/panopoly_magic.module
@@ -1527,6 +1527,7 @@ function panopoly_magic_preview_callback_fpp($type, $subtype, $plugin, $renderer
     $values = $plugin['preview settings'];
     $values['bundle'] = $plugin['bundle'];
     $fpp = fieldable_panels_panes_create($values);
+    $fpp->fpid = NULL;
   }
   else {
     // For a new (non-existant) FPP with no 'preview settings', don't show
@@ -1543,6 +1544,8 @@ function panopoly_magic_preview_callback_fpp($type, $subtype, $plugin, $renderer
     $block = (object)array(
       'title' => check_plain($fpp->title),
       'content' => $content,
+      'type' => $type,
+      'subtype' => $subtype,
     );
     $pane = panels_new_pane($type, $subtype, TRUE);
     return theme('panels_pane', array('content' => $block, 'pane' => $pane, 'display' => $renderer->display));
diff --git a/profiles/wcm_base/modules/panopoly/panopoly_pages/CHANGELOG.txt b/profiles/wcm_base/modules/panopoly/panopoly_pages/CHANGELOG.txt
index 5e928dca..a53f624a 100644
--- a/profiles/wcm_base/modules/panopoly/panopoly_pages/CHANGELOG.txt
+++ b/profiles/wcm_base/modules/panopoly/panopoly_pages/CHANGELOG.txt
@@ -1,3 +1,7 @@
+7.x-1.56, 2018-10-10
+-------------------
+- No changes since last release.
+
 7.x-1.55, 2018-07-04
 -------------------
 - No changes since last release.
diff --git a/profiles/wcm_base/modules/panopoly/panopoly_pages/panopoly_pages.info b/profiles/wcm_base/modules/panopoly/panopoly_pages/panopoly_pages.info
index 701f1f8d..572414b1 100644
--- a/profiles/wcm_base/modules/panopoly/panopoly_pages/panopoly_pages.info
+++ b/profiles/wcm_base/modules/panopoly/panopoly_pages/panopoly_pages.info
@@ -81,8 +81,8 @@ features_exclude[variable][pathauto_node_panopoly_landing_page_pattern] = pathau
 features_exclude[variable][pathauto_node_panopoly_page_pattern] = pathauto_node_panopoly_page_pattern
 features_exclude[variable][pathauto_taxonomy_term_panopoly_categories_pattern] = pathauto_taxonomy_term_panopoly_categories_pattern
 
-; Information added by Drupal.org packaging script on 2018-07-04
-version = "7.x-1.55"
+; Information added by Drupal.org packaging script on 2018-10-10
+version = "7.x-1.56"
 core = "7.x"
 project = "panopoly_pages"
-datestamp = "1530728672"
+datestamp = "1539206950"
diff --git a/profiles/wcm_base/modules/panopoly/panopoly_search/CHANGELOG.txt b/profiles/wcm_base/modules/panopoly/panopoly_search/CHANGELOG.txt
index 86eb10de..f46d2f5a 100644
--- a/profiles/wcm_base/modules/panopoly/panopoly_search/CHANGELOG.txt
+++ b/profiles/wcm_base/modules/panopoly/panopoly_search/CHANGELOG.txt
@@ -1,3 +1,7 @@
+7.x-1.56, 2018-10-10
+-------------------
+- Update to search_api_solr 1.14 for SA-CONTRIB-2018-065.
+
 7.x-1.55, 2018-07-04
 -------------------
 - No changes since last release.
diff --git a/profiles/wcm_base/modules/panopoly/panopoly_search/panopoly_search.info b/profiles/wcm_base/modules/panopoly/panopoly_search/panopoly_search.info
index cbe99c91..ea7d6a50 100644
--- a/profiles/wcm_base/modules/panopoly/panopoly_search/panopoly_search.info
+++ b/profiles/wcm_base/modules/panopoly/panopoly_search/panopoly_search.info
@@ -54,8 +54,8 @@ features[variable][] = search_cron_limit
 features[views_view][] = panopoly_database_search
 features[views_view][] = panopoly_search
 
-; Information added by Drupal.org packaging script on 2018-07-04
-version = "7.x-1.55"
+; Information added by Drupal.org packaging script on 2018-10-10
+version = "7.x-1.56"
 core = "7.x"
 project = "panopoly_search"
-datestamp = "1530728684"
+datestamp = "1539206962"
diff --git a/profiles/wcm_base/modules/panopoly/panopoly_search/panopoly_search.make b/profiles/wcm_base/modules/panopoly/panopoly_search/panopoly_search.make
index d9a3a65e..74110952 100644
--- a/profiles/wcm_base/modules/panopoly/panopoly_search/panopoly_search.make
+++ b/profiles/wcm_base/modules/panopoly/panopoly_search/panopoly_search.make
@@ -11,7 +11,7 @@ projects[facetapi][subdir] = contrib
 projects[search_api][version] = 1.24
 projects[search_api][subdir] = contrib
 
-projects[search_api_solr][version] = 1.12
+projects[search_api_solr][version] = 1.14
 projects[search_api_solr][subdir] = contrib
 
 projects[search_api_db][version] = 1.6
diff --git a/profiles/wcm_base/modules/panopoly/panopoly_test/CHANGELOG.txt b/profiles/wcm_base/modules/panopoly/panopoly_test/CHANGELOG.txt
index 2c178c1a..322e9070 100644
--- a/profiles/wcm_base/modules/panopoly/panopoly_test/CHANGELOG.txt
+++ b/profiles/wcm_base/modules/panopoly/panopoly_test/CHANGELOG.txt
@@ -1,3 +1,7 @@
+7.x-1.56, 2018-10-10
+-------------------
+- No changes since last release.
+
 7.x-1.55, 2018-07-04
 -------------------
 - No changes since last release.
diff --git a/profiles/wcm_base/modules/panopoly/panopoly_test/panopoly_test.info b/profiles/wcm_base/modules/panopoly/panopoly_test/panopoly_test.info
index 97a51abb..ca0e1535 100644
--- a/profiles/wcm_base/modules/panopoly/panopoly_test/panopoly_test.info
+++ b/profiles/wcm_base/modules/panopoly/panopoly_test/panopoly_test.info
@@ -99,8 +99,8 @@ features_exclude[dependencies][panopoly_pages] = panopoly_pages
 features_exclude[dependencies][panelizer] = panelizer
 hidden = 1
 
-; Information added by Drupal.org packaging script on 2018-07-04
-version = "7.x-1.55"
+; Information added by Drupal.org packaging script on 2018-10-10
+version = "7.x-1.56"
 core = "7.x"
 project = "panopoly_test"
-datestamp = "1530728925"
+datestamp = "1539206981"
diff --git a/profiles/wcm_base/modules/panopoly/panopoly_theme/CHANGELOG.txt b/profiles/wcm_base/modules/panopoly/panopoly_theme/CHANGELOG.txt
index 4f61a27c..a02debcc 100644
--- a/profiles/wcm_base/modules/panopoly/panopoly_theme/CHANGELOG.txt
+++ b/profiles/wcm_base/modules/panopoly/panopoly_theme/CHANGELOG.txt
@@ -1,3 +1,7 @@
+7.x-1.56, 2018-10-10
+-------------------
+- No changes since last release.
+
 7.x-1.55, 2018-07-04
 -------------------
 - No changes since last release.
diff --git a/profiles/wcm_base/modules/panopoly/panopoly_theme/panopoly_theme.info b/profiles/wcm_base/modules/panopoly/panopoly_theme/panopoly_theme.info
index be39b32b..25f09c99 100644
--- a/profiles/wcm_base/modules/panopoly/panopoly_theme/panopoly_theme.info
+++ b/profiles/wcm_base/modules/panopoly/panopoly_theme/panopoly_theme.info
@@ -11,8 +11,8 @@ stylesheets[all][] = css/panopoly-accordian.css
 stylesheets[all][] = css/panopoly-layouts.css
 features[features_api][] = api:2
 
-; Information added by Drupal.org packaging script on 2018-07-04
-version = "7.x-1.55"
+; Information added by Drupal.org packaging script on 2018-10-10
+version = "7.x-1.56"
 core = "7.x"
 project = "panopoly_theme"
-datestamp = "1530728938"
+datestamp = "1539207184"
diff --git a/profiles/wcm_base/modules/panopoly/panopoly_widgets/CHANGELOG.txt b/profiles/wcm_base/modules/panopoly/panopoly_widgets/CHANGELOG.txt
index e572621a..fde4d11a 100644
--- a/profiles/wcm_base/modules/panopoly/panopoly_widgets/CHANGELOG.txt
+++ b/profiles/wcm_base/modules/panopoly/panopoly_widgets/CHANGELOG.txt
@@ -1,3 +1,7 @@
+7.x-1.56, 2018-10-10
+-------------------
+- No changes since last release.
+
 7.x-1.55, 2018-07-04
 -------------------
 - No changes since last release.
diff --git a/profiles/wcm_base/modules/panopoly/panopoly_widgets/panopoly_widgets.info b/profiles/wcm_base/modules/panopoly/panopoly_widgets/panopoly_widgets.info
index 70f98490..91b7b9ba 100644
--- a/profiles/wcm_base/modules/panopoly/panopoly_widgets/panopoly_widgets.info
+++ b/profiles/wcm_base/modules/panopoly/panopoly_widgets/panopoly_widgets.info
@@ -125,8 +125,8 @@ features[linkit_profiles][] = content_fields
 features[views_view][] = panopoly_widgets_general_content
 features_exclude[dependencies][linkit] = linkit
 
-; Information added by Drupal.org packaging script on 2018-07-04
-version = "7.x-1.55"
+; Information added by Drupal.org packaging script on 2018-10-10
+version = "7.x-1.56"
 core = "7.x"
 project = "panopoly_widgets"
-datestamp = "1530730128"
+datestamp = "1539207784"
diff --git a/profiles/wcm_base/wcm_base.info b/profiles/wcm_base/wcm_base.info
index eb7364de..18545dc6 100644
--- a/profiles/wcm_base/wcm_base.info
+++ b/profiles/wcm_base/wcm_base.info
@@ -134,3 +134,4 @@ dependencies[] = wcm_tile_panes
 dependencies[] = wcm_user_contact
 dependencies[] = wcm_user_leadership
 dependencies[] = wcm_user_profile
+dependencies[] = wcm_suppress_headers
diff --git a/profiles/wcm_base/wcm_base.make b/profiles/wcm_base/wcm_base.make
index bdb15e38..b3747fd0 100644
--- a/profiles/wcm_base/wcm_base.make
+++ b/profiles/wcm_base/wcm_base.make
@@ -147,7 +147,7 @@ projects[r4032login][subdir] = contrib
 projects[redis][version] = 3.17
 projects[redis][subdir] = contrib
 
-projects[search_api_solr][version] = 1.12
+projects[search_api_solr][version] = 1.14
 projects[search_api_solr][subdir] = contrib
 projects[search_api_solr][patch][1414838] = http://drupal.org/files/issues/search_api_solr-partial_word_matching-1414838-21.patch
 
@@ -445,6 +445,12 @@ projects[news_client][download][type] = "git"
 projects[news_client][download][url] = git@code.osu.edu:ocio_odee_web/news_client.git
 projects[news_client][download][branch] = 7.x-1.x
 
+projects[wcm_suppress_headers][type] = module
+projects[wcm_suppress_headers][subdir] = custom
+projects[wcm_suppress_headers][download][type] = "git"
+projects[wcm_suppress_headers][download][url] = git@code.osu.edu:ocio_odee_web/wcm_suppress_headers.git
+projects[wcm_suppress_headers][download][branch] = 7.x-1.x
+
 
 ;themes
 projects[ocio_seven][type] = theme
@@ -478,31 +484,31 @@ libraries[ocio_modernizr][download][branch] = 7.x-1.x
 
 ; The Panopoly Foundation
 
-projects[panopoly_core][version] = 1.55
+projects[panopoly_core][version] = 1.56
 projects[panopoly_core][subdir] = panopoly
 
-projects[panopoly_theme][version] = 1.55
+projects[panopoly_theme][version] = 1.56
 projects[panopoly_theme][subdir] = panopoly
 
-projects[panopoly_magic][version] = 1.55
+projects[panopoly_magic][version] = 1.56
 projects[panopoly_magic][subdir] = panopoly
 
-projects[panopoly_widgets][version] = 1.55
+projects[panopoly_widgets][version] = 1.56
 projects[panopoly_widgets][subdir] = panopoly
 
-projects[panopoly_admin][version] = 1.55
+projects[panopoly_admin][version] = 1.56
 projects[panopoly_admin][subdir] = panopoly
 
 
 ; The Panopoly Toolset
 
-projects[panopoly_pages][version] = 1.55
+projects[panopoly_pages][version] = 1.56
 projects[panopoly_pages][subdir] = panopoly
 
-projects[panopoly_search][version] = 1.55
+projects[panopoly_search][version] = 1.56
 projects[panopoly_search][subdir] = panopoly
 
 ; For running the automated tests.
 
-projects[panopoly_test][version] = 1.55
+projects[panopoly_test][version] = 1.56
 projects[panopoly_test][subdir] = panopoly
-- 
GitLab