diff --git a/profiles/wcm_base/CHANGELOG.txt b/profiles/wcm_base/CHANGELOG.txt
index 69cc9db0d1d240171ce9b8304da720564e087b3e..44eb91a85ef0783d658b3e0330bf569576b407c6 100644
--- a/profiles/wcm_base/CHANGELOG.txt
+++ b/profiles/wcm_base/CHANGELOG.txt
@@ -1,3 +1,7 @@
+WCM Base 7.x-1.5-rc2, 2018-02-19
+--------------------------------
+- WCM Base: Updated Panopoly to 1.50 per SA-CONTRIB-2018-013.
+
 WCM Base 7.x-1.5-rc1, 2018-02-09
 --------------------------------
 - WCM Base: Updated contrib modules Better Exposed Filters, ctools, Media, Mime Mail.
diff --git a/profiles/wcm_base/modules/contrib/entity/entity.info b/profiles/wcm_base/modules/contrib/entity/entity.info
index 787db1387fc0f378ffcf534d62904ad3631c1955..0b865a0421ee95b378de1d7b09cb4de45131ee71 100644
--- a/profiles/wcm_base/modules/contrib/entity/entity.info
+++ b/profiles/wcm_base/modules/contrib/entity/entity.info
@@ -25,9 +25,9 @@ files[] = views/handlers/entity_views_handler_field_uri.inc
 files[] = views/handlers/entity_views_handler_relationship_by_bundle.inc
 files[] = views/handlers/entity_views_handler_relationship.inc
 files[] = views/plugins/entity_views_plugin_row_entity_view.inc
-; Information added by Drupal.org packaging script on 2016-09-22
-version = "7.x-1.8"
+; Information added by Drupal.org packaging script on 2018-02-14
+version = "7.x-1.9"
 core = "7.x"
 project = "entity"
-datestamp = "1474546503"
+datestamp = "1518620551"
 
diff --git a/profiles/wcm_base/modules/contrib/entity/entity.module b/profiles/wcm_base/modules/contrib/entity/entity.module
index d00afa46fb1239ca2f849d19ecef60295bfea1de..da0acf697989eaeabe8bc925d714da6054a4d917 100644
--- a/profiles/wcm_base/modules/contrib/entity/entity.module
+++ b/profiles/wcm_base/modules/contrib/entity/entity.module
@@ -1088,9 +1088,10 @@ function entity_flush_caches() {
   // Care about entitycache tables.
   if (module_exists('entitycache')) {
     $tables = array();
-    foreach (entity_crud_get_info() as $entity_type => $entity_info) {
-      if (isset($entity_info['module']) && !empty($entity_info['entity cache'])) {
-        $tables[] = 'cache_entity_' . $entity_type;
+    $tables_created = variable_get('entity_cache_tables_created');
+    if (is_array($tables_created)) {
+      foreach ($tables_created as $module => $entity_cache_tables) {
+        $tables = array_merge($tables, $entity_cache_tables);
       }
     }
     return $tables;
diff --git a/profiles/wcm_base/modules/contrib/entity/entity_token.info b/profiles/wcm_base/modules/contrib/entity/entity_token.info
index cc732945c51837f97b52668fa436428eb286af6b..c59c6502509750253d47bfd1ee36d7deaa068746 100644
--- a/profiles/wcm_base/modules/contrib/entity/entity_token.info
+++ b/profiles/wcm_base/modules/contrib/entity/entity_token.info
@@ -5,9 +5,9 @@ files[] = entity_token.tokens.inc
 files[] = entity_token.module
 dependencies[] = entity
 
-; Information added by Drupal.org packaging script on 2016-09-22
-version = "7.x-1.8"
+; Information added by Drupal.org packaging script on 2018-02-14
+version = "7.x-1.9"
 core = "7.x"
 project = "entity"
-datestamp = "1474546503"
+datestamp = "1518620551"
 
diff --git a/profiles/wcm_base/modules/contrib/entity/includes/entity.wrapper.inc b/profiles/wcm_base/modules/contrib/entity/includes/entity.wrapper.inc
index 6c262e69d179a1e44d01f53cb2b928f564a7a5e0..860d2c3339d67682da9c2a17ffe6ed6c0f1b0d69 100644
--- a/profiles/wcm_base/modules/contrib/entity/includes/entity.wrapper.inc
+++ b/profiles/wcm_base/modules/contrib/entity/includes/entity.wrapper.inc
@@ -121,7 +121,7 @@ abstract class EntityMetadataWrapper {
     if (!$this->validate($value)) {
       throw new EntityMetadataWrapperException(t('Invalid data value given. Be sure it matches the required data type and format. Value at !location: !value.', array(
         // An exception's message is output through check_plain().
-        '!value' => is_array($value) || is_object($value) ? var_export($value) : $value,
+        '!value' => is_array($value) || is_object($value) ? var_export($value, TRUE) : $value,
         '!location' => $this->debugIdentifierLocation(),
       )));
     }
@@ -755,7 +755,7 @@ class EntityDrupalWrapper extends EntityStructureWrapper {
     if (!$this->validate($value)) {
       throw new EntityMetadataWrapperException(t('Invalid data value given. Be sure it matches the required data type and format. Value at !location: !value.', array(
         // An exception's message is output through check_plain().
-        '!value' => is_array($value) || is_object($value) ? var_export($value) : $value,
+        '!value' => is_array($value) || is_object($value) ? var_export($value, TRUE) : $value,
         '!location' => $this->debugIdentifierLocation(),
       )));
     }
@@ -1116,7 +1116,7 @@ class EntityListWrapper extends EntityMetadataWrapper implements IteratorAggrega
    */
   public function getIterator() {
     // In case there is no data available, just iterate over the first item.
-    return new EntityMetadataWrapperIterator($this, $this->dataAvailable() ? array_keys(parent::value()) : array(0));
+    return new EntityMetadataWrapperIterator($this, ($this->dataAvailable() && is_array(parent::value())) ? array_keys(parent::value()) : array(0));
   }
 
   /**
diff --git a/profiles/wcm_base/modules/contrib/entity/modules/callbacks.inc b/profiles/wcm_base/modules/contrib/entity/modules/callbacks.inc
index 0c5c8eeffedcfa6ee56cdceb771a96291e6d7b8a..ee156ab3732e041145efe295ee8d7f192890f74f 100644
--- a/profiles/wcm_base/modules/contrib/entity/modules/callbacks.inc
+++ b/profiles/wcm_base/modules/contrib/entity/modules/callbacks.inc
@@ -673,7 +673,7 @@ function entity_metadata_no_hook_node_access($op, $node = NULL, $account = NULL)
     if (empty($node->vid) && in_array($op, array('create', 'update'))) {
       // This is a new node or the original node.
       if (isset($node->type)) {
-        $op = !empty($node->is_new) && $node->is_new ? 'create' : 'update';
+        $op = empty($node->nid) || !empty($node->is_new) ? 'create' : 'update';
         return node_access($op, $op == 'create' ? $node->type : $node, $account);
       }
       else {
diff --git a/profiles/wcm_base/modules/contrib/entity/tests/entity_feature.info b/profiles/wcm_base/modules/contrib/entity/tests/entity_feature.info
index 3e398961c67fe406181709d2d4d0418341ccfe71..524fdfaffd6c7ecc6793eff3c903d171af634da0 100644
--- a/profiles/wcm_base/modules/contrib/entity/tests/entity_feature.info
+++ b/profiles/wcm_base/modules/contrib/entity/tests/entity_feature.info
@@ -6,9 +6,9 @@ files[] = entity_feature.module
 dependencies[] = entity_test
 hidden = TRUE
 
-; Information added by Drupal.org packaging script on 2016-09-22
-version = "7.x-1.8"
+; Information added by Drupal.org packaging script on 2018-02-14
+version = "7.x-1.9"
 core = "7.x"
 project = "entity"
-datestamp = "1474546503"
+datestamp = "1518620551"
 
diff --git a/profiles/wcm_base/modules/contrib/entity/tests/entity_test.info b/profiles/wcm_base/modules/contrib/entity/tests/entity_test.info
index f1562ac6693295985ac8a58a02d830443bc55375..b7cceabf7c5c19d94855b0b6b4c0a7ef413fbe83 100644
--- a/profiles/wcm_base/modules/contrib/entity/tests/entity_test.info
+++ b/profiles/wcm_base/modules/contrib/entity/tests/entity_test.info
@@ -7,9 +7,9 @@ files[] = entity_test.install
 dependencies[] = entity
 hidden = TRUE
 
-; Information added by Drupal.org packaging script on 2016-09-22
-version = "7.x-1.8"
+; Information added by Drupal.org packaging script on 2018-02-14
+version = "7.x-1.9"
 core = "7.x"
 project = "entity"
-datestamp = "1474546503"
+datestamp = "1518620551"
 
diff --git a/profiles/wcm_base/modules/contrib/entity/tests/entity_test_i18n.info b/profiles/wcm_base/modules/contrib/entity/tests/entity_test_i18n.info
index db1eb56a7667f094340960116e09a8b6de233e61..4ca048aff84765660cbbe1214494b6496053f882 100644
--- a/profiles/wcm_base/modules/contrib/entity/tests/entity_test_i18n.info
+++ b/profiles/wcm_base/modules/contrib/entity/tests/entity_test_i18n.info
@@ -5,9 +5,9 @@ dependencies[] = i18n_string
 package = Multilingual - Internationalization
 core = 7.x
 hidden = TRUE
-; Information added by Drupal.org packaging script on 2016-09-22
-version = "7.x-1.8"
+; Information added by Drupal.org packaging script on 2018-02-14
+version = "7.x-1.9"
 core = "7.x"
 project = "entity"
-datestamp = "1474546503"
+datestamp = "1518620551"
 
diff --git a/profiles/wcm_base/modules/contrib/entity/views/handlers/entity_views_handler_area_entity.inc b/profiles/wcm_base/modules/contrib/entity/views/handlers/entity_views_handler_area_entity.inc
index f37469424a7774ee94e47b5833dee1aee9cd676d..0c5b7143f793207700bd00c51bc6c2558724705c 100644
--- a/profiles/wcm_base/modules/contrib/entity/views/handlers/entity_views_handler_area_entity.inc
+++ b/profiles/wcm_base/modules/contrib/entity/views/handlers/entity_views_handler_area_entity.inc
@@ -40,7 +40,7 @@ class entity_views_handler_area_entity extends views_handler_area {
     $form['entity_id'] = array(
       '#type' => 'textfield',
       '#title' => t('Entity id'),
-      '#description' => t('Choose the entity you want to display in the area.'),
+      '#description' => t('Choose the entity you want to display in the area. To render an entity given by a contextual filter use "%1" for the first argument, "%2" for the second, etc.'),
       '#default_value' => $this->options['entity_id'],
     );
 
@@ -105,6 +105,9 @@ class entity_views_handler_area_entity extends views_handler_area {
    * Render an entity using the view mode.
    */
   public function render_entity($entity_type, $entity_id, $view_mode) {
+    $tokens = $this->get_render_tokens();
+    // Replace argument tokens in entity id.
+    $entity_id = strtr($entity_id, $tokens);
     if (!empty($entity_type) && !empty($entity_id) && !empty($view_mode)) {
       $entity = entity_load_single($entity_type, $entity_id);
       if (!empty($this->options['bypass_access']) || entity_access('view', $entity_type, $entity)) {
@@ -117,4 +120,31 @@ class entity_views_handler_area_entity extends views_handler_area {
       return '';
     }
   }
+
+  /**
+   * Get the 'render' tokens to use for advanced rendering.
+   *
+   * This runs through all of the fields and arguments that
+   * are available and gets their values. This will then be
+   * used in one giant str_replace().
+   */
+  function get_render_tokens() {
+    $tokens = array();
+    if (!empty($this->view->build_info['substitutions'])) {
+      $tokens = $this->view->build_info['substitutions'];
+    }
+    $count = 0;
+    foreach ($this->view->display_handler->get_handlers('argument') as $arg => $handler) {
+      $token = '%' . ++$count;
+      if (!isset($tokens[$token])) {
+        $tokens[$token] = '';
+      }
+      // Use strip tags as there should never be HTML in the path.
+      // However, we need to preserve special characters like " that
+      // were removed by check_plain().
+      $tokens['%' . $count] = $handler->argument;
+    }
+
+    return $tokens;
+  }
 }
diff --git a/profiles/wcm_base/modules/panopoly/panopoly_admin/CHANGELOG.txt b/profiles/wcm_base/modules/panopoly/panopoly_admin/CHANGELOG.txt
index 29c577d6eac6435e6761f19d069b31b8918ee0bb..d30009fcd8aded71bd3d62f4abd01dc1f8d19ba6 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.50, 2018-02-15
+-------------------
+- No changes since last release.
+
 7.x-1.49, 2017-12-13
 -------------------
 - 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 6b945ee7b22cdab66f98efc5b21720d350ea609d..5104601c8492a157e9ee43c442edfb4ba78291aa 100644
--- a/profiles/wcm_base/modules/panopoly/panopoly_admin/panopoly_admin.info
+++ b/profiles/wcm_base/modules/panopoly/panopoly_admin/panopoly_admin.info
@@ -37,9 +37,9 @@ 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 2017-12-13
-version = "7.x-1.49"
+; Information added by Drupal.org packaging script on 2018-02-15
+version = "7.x-1.50"
 core = "7.x"
 project = "panopoly_admin"
-datestamp = "1513181893"
+datestamp = "1518716424"
 
diff --git a/profiles/wcm_base/modules/panopoly/panopoly_core/CHANGELOG.txt b/profiles/wcm_base/modules/panopoly/panopoly_core/CHANGELOG.txt
index 35e17140815a33be9c937df411b7f6946dae9817..b5a7ee0766e86aa588c503fb8f94f350e322e7d2 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.50, 2018-02-15
+-------------------
+- Update to Entity API 1.9.
+
 7.x-1.49, 2017-12-13
 -------------------
 - Improvements to breadcrumb handling.
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 7f34bbf8aa7fafbafb3929cd9a20f66a17751e44..83c87ee1a1ec465bbb0d7b9dd4abcf8b1053d033 100644
--- a/profiles/wcm_base/modules/panopoly/panopoly_core/panopoly_core.info
+++ b/profiles/wcm_base/modules/panopoly/panopoly_core/panopoly_core.info
@@ -82,9 +82,9 @@ 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 2017-12-13
-version = "7.x-1.49"
+; Information added by Drupal.org packaging script on 2018-02-15
+version = "7.x-1.50"
 core = "7.x"
 project = "panopoly_core"
-datestamp = "1513181917"
+datestamp = "1518716438"
 
diff --git a/profiles/wcm_base/modules/panopoly/panopoly_core/panopoly_core.make b/profiles/wcm_base/modules/panopoly/panopoly_core/panopoly_core.make
index 5edd97d12892cf1a6e9f2461701d19f75cb9ec57..2c4617b5b9645916ee7f6bdfbd7f1f8a31169af2 100644
--- a/profiles/wcm_base/modules/panopoly/panopoly_core/panopoly_core.make
+++ b/profiles/wcm_base/modules/panopoly/panopoly_core/panopoly_core.make
@@ -57,7 +57,7 @@ projects[pathauto][subdir] = contrib
 projects[token][version] = 1.7
 projects[token][subdir] = contrib
 
-projects[entity][version] = 1.8
+projects[entity][version] = 1.9
 projects[entity][subdir] = contrib
 
 projects[libraries][version] = 2.2
diff --git a/profiles/wcm_base/modules/panopoly/panopoly_magic/CHANGELOG.txt b/profiles/wcm_base/modules/panopoly/panopoly_magic/CHANGELOG.txt
index 4cc1029624d2e8fe5da742ecdf435bcb63cd7f5b..4601a648c79d5ea31ebd1f83634ddb31d678ac3f 100644
--- a/profiles/wcm_base/modules/panopoly/panopoly_magic/CHANGELOG.txt
+++ b/profiles/wcm_base/modules/panopoly/panopoly_magic/CHANGELOG.txt
@@ -1,3 +1,12 @@
+7.x-1.50, 2018-02-15
+-------------------
+- Validation for reusable FPP's "Admin Title" doesn't fire except when uploading
+  images.
+- Allow widgets to control how their "example" is rendered on the "Add content"
+  dialog (including using a static image rather than rendering).
+- Allow widgets to control how their "example" is rendered on the "Add content"
+  dialog (including using a static image rather than rendering).
+
 7.x-1.49, 2017-12-13
 -------------------
 - No changes since last release.
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 d17e729b2fe7cf4e60921f3c15f61c8b698d3b72..0f69ecf3e912137c436a3f1a1d7b100ed9eb50ef 100644
--- a/profiles/wcm_base/modules/panopoly/panopoly_magic/panopoly_magic.info
+++ b/profiles/wcm_base/modules/panopoly/panopoly_magic/panopoly_magic.info
@@ -15,9 +15,9 @@ 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 2017-12-13
-version = "7.x-1.49"
+; Information added by Drupal.org packaging script on 2018-02-15
+version = "7.x-1.50"
 core = "7.x"
 project = "panopoly_magic"
-datestamp = "1513181974"
+datestamp = "1518716473"
 
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 5ea0b2951b549db5594321b4431b717a60c78555..4e8336590294a7cc4963a4208c50bbbdcd3ed994 100644
--- a/profiles/wcm_base/modules/panopoly/panopoly_magic/panopoly_magic.module
+++ b/profiles/wcm_base/modules/panopoly/panopoly_magic/panopoly_magic.module
@@ -809,9 +809,7 @@ function panopoly_magic_form_fieldable_panels_panes_fieldable_panels_pane_conten
   }
 
   // Add custom validation function for the reusable title
-  if (!empty($form_state['triggering_element']) && $form_state['triggering_element']['#value'] != 'Update Preview') {
-    $form['reusable']['admin_title']['#element_validate'][] = 'panopoly_magic_reusable_entity_validate';
-  }
+  $form['reusable']['admin_title']['#element_validate'][] = 'panopoly_magic_reusable_entity_validate';
 
   // Customize the view mode setting
   if (!empty($form['view_mode'])) {
@@ -1415,6 +1413,11 @@ function panopoly_magic_form_ctools_stylizer_edit_style_form_choose_alter(&$form
  *  Validator to ensure that reusable entites have titles.
  */
 function panopoly_magic_reusable_entity_validate($element, &$form_state, $form) {
+  // Don't validate if we're just updating the preview.
+  if (!empty($form_state['triggering_element']) && $form_state['triggering_element']['#value'] == 'Update Preview') {
+    return;
+  }
+
   // If the reusable entity checkbox is selected.
   if (!empty($form_state['values']['reusable'])) {
     // Ensure a title is present.
@@ -1506,24 +1509,113 @@ function panopoly_magic_views_pre_view(&$view) {
 }
 
 /**
- * Helper function to display the pane for showing previews in the add_content modal
+ * Default 'preview callback' for widgets when we can't find something more specific.
  */
-function _panopoly_magic_render_preview_pane(&$plugin, $renderer) {
-  $pane = panels_new_pane($plugin['type_name'], $plugin['subtype_name'], TRUE);
+function panopoly_magic_preview_callback_default($type, $subtype, $plugin, $renderer) {
+  $pane = panels_new_pane($type, $subtype, TRUE);
+
+  // Mix in requested settings.
+  if (!empty($plugin['preview settings'])) {
+    $pane->configuration = array_merge($pane->configuration, $plugin['preview settings']);
+  }
+
   $display = $renderer->display;
   $context = $renderer->display->context;
   $args = $renderer->display->args;
   $incoming_content = $renderer->display->incoming_content;
   $keywords = (!empty($renderer->display->keywords)) ? $renderer->display->keywords : array();
-  if ($content = ctools_content_render($pane->type, $pane->subtype, $pane->configuration, $keywords, $args, $context, $incoming_content)) {
+  $content = ctools_content_render($pane->type, $pane->subtype, $pane->configuration, $keywords, $args, $context, $incoming_content);
+  if ($content) {
+    return theme('panels_pane', array('content' => $content, 'pane' => $pane, 'display' => $display));
+  }
+}
+
+/**
+ * Default 'preview callback' for FPP widgets.
+ */
+function panopoly_magic_preview_callback_fpp($type, $subtype, $plugin, $renderer) {
+  if (!empty($plugin['entity_id'])) {
+    $fpp = fieldable_panels_panes_load_from_subtype($plugin['entity_id']);
+  }
+  elseif (!empty($plugin['preview settings'])) {
+    $values = $plugin['preview settings'];
+    $values['bundle'] = $plugin['bundle'];
+    $fpp = fieldable_panels_panes_create($values);
+  }
+  else {
+    // For a new (non-existant) FPP with no 'preview settings', don't show
+    // any preview.
+    return NULL;
+  }
+
+  // Set a property to it's possible to tell that the FPP is being rendered
+  // in a preview, for example, in the template.
+  $fpp->panopoly_magic_preview = TRUE;
+
+  $content = fieldable_panels_pane_view($fpp, 'full', NULL);
+  if ($content) {
+    $block = (object)array(
+      'title' => check_plain($fpp->title),
+      'content' => $content,
+    );
+    $pane = panels_new_pane($type, $subtype, TRUE);
+    return theme('panels_pane', array('content' => $block, 'pane' => $pane, 'display' => $renderer->display));
+  }
+}
+
+/**
+ * Default 'preview callback' for when a 'preview image' is used.
+ */
+function panopoly_magic_preview_callback_image($type, $subtype, $plugin, $renderer) {
+  return theme('image', array('path' => $plugin['preview image']));
+}
+
+/**
+ * Helper function to display the pane for showing previews in the add_content modal
+ */
+function _panopoly_magic_render_preview_pane(&$widget_vars, $renderer) {
+  $type = $widget_vars['type_name'];
+  $subtype = $widget_vars['subtype_name'];
+  $plugin = ctools_content_get_subtype($type, $subtype);
+
+  // Special case for reusable FPPs: by default we force the FPP callback so
+  // that the entity is rendered, and the custom callback or image isn't used.
+  // However, if a special key on the plugin subtype ('preview always') is set,
+  // then we won't force the FPP callback and the custom preview will always
+  // be used (regardless if it's a reusable FPP or not).
+  if ($type == 'fieldable_panels_pane' && !empty($plugin['entity_id']) && empty($plugin['preview always'])) {
+    $plugin['preview callback'] = 'panopoly_magic_preview_callback_fpp';
+  }
+
+  if (!empty($plugin['preview callback'])) {
+    $preview_callback = $plugin['preview callback'];
+  }
+  elseif (!empty($plugin['preview image'])) {
+    $preview_callback = 'panopoly_magic_preview_callback_image';
+  }
+  elseif ($type == 'fieldable_panels_pane') {
+    $preview_callback = 'panopoly_magic_preview_callback_fpp';
+  }
+  else {
+    $preview_callback = 'panopoly_magic_preview_callback_default';
+  }
+
+  if ($content = $preview_callback($type, $subtype, $plugin, $renderer)) {
+    // Permit the callback to return a render array.
+    if (is_array($content)) {
+      $content = drupal_render($content);
+    }
+
+    // Optionally strip JavaScript.
     $strip_js = variable_get('panopoly_magic_strip_js_from_preview', 0);
-    $plugin['preview'] = theme('panels_pane', array('content' => $content, 'pane' => $pane, 'display' => $display));
-    if (!empty($strip_js) && !empty($plugin['preview'])) {
-      $plugin['preview'] = preg_replace('#<script(.*?)>(.*?)</script>#is', '', $plugin['preview']);
+    if (!empty($strip_js) && !empty($content)) {
+      $content = preg_replace('#<script(.*?)>(.*?)</script>#is', '', $content);
     }
+
+    $widget_vars['preview'] = $content;
     drupal_add_js(array('panopoly_magic' => array(
-      'pane_add_preview_type' => $pane->type,
-      'pane_add_preview_subtype' => $pane->subtype,
+      'pane_add_preview_type' => $type,
+      'pane_add_preview_subtype' => $subtype,
     )), 'setting');
   }
 }
@@ -1544,16 +1636,16 @@ function panopoly_magic_preprocess_panels_add_content_modal(&$vars) {
       $query = drupal_get_query_parameters();
       $type_name = !empty($query['type_name']) ? $query['type_name'] : '';
       $sub_type = !empty($query['subtype_name']) ? $query['subtype_name'] : '';
-      $plugin = array(
+      $widget_vars = array(
         'type_name' => $type_name,
         'subtype_name' => $sub_type,
       );
-      _panopoly_magic_render_preview_pane($plugin, $vars['renderer']);
+      _panopoly_magic_render_preview_pane($widget_vars, $vars['renderer']);
       $vars['column_count'] = 1;
-      $vars['preview_single'] = isset($plugin['preview']) ? $plugin['preview'] : '';
+      $vars['preview_single'] = isset($widget_vars['preview']) ? $widget_vars['preview'] : '';
       $vars['preview_single_title'] = '';
-      foreach ($vars['categories'][$vars['category']]['content'] as $key => $plugin) {
-        if ($plugin['type_name'] == $type_name && $plugin['subtype_name'] == $sub_type) {
+      foreach ($vars['categories'][$vars['category']]['content'] as $key => $widget_vars) {
+        if ($widget_vars['type_name'] == $type_name && $widget_vars['subtype_name'] == $sub_type) {
           $vars['preview_single_title'] = $key;
           break;
         }
@@ -1561,7 +1653,7 @@ function panopoly_magic_preprocess_panels_add_content_modal(&$vars) {
     }
 
     // Process each widget option, either adding the preview itself or a link to generate it.
-    foreach ($vars['categories'][$vars['category']]['content'] as $key => &$plugin) {
+    foreach ($vars['categories'][$vars['category']]['content'] as $key => &$widget_vars) {
       $query = drupal_get_query_parameters();
       $preview_panes = (!empty($query['preview_panes'])) ? explode(',', $query['preview_panes']) : array();
 
@@ -1570,21 +1662,21 @@ function panopoly_magic_preprocess_panels_add_content_modal(&$vars) {
         // Convert the link to generate a preview of itself.
         $options = array(
           'query' => array(
-            'type_name' => $plugin['type_name'],
-            'subtype_name' => $plugin['subtype_name'],
+            'type_name' => $widget_vars['type_name'],
+            'subtype_name' => $widget_vars['subtype_name'],
           ),
           'attributes' => array('class' => array('use-ajax button')),
           'html' => TRUE,
         );
-        $plugin['title'] = l(filter_xss_admin($plugin['title']), current_path(), $options);
+        $widget_vars['title'] = l(filter_xss_admin($widget_vars['title']), current_path(), $options);
       }
-      elseif ($use_preview == PANOPOLY_ADD_PREVIEW_AUTOMATIC || in_array($plugin['subtype_name'], $preview_panes)) {
-        _panopoly_magic_render_preview_pane($plugin, $vars['renderer']);
+      elseif ($use_preview == PANOPOLY_ADD_PREVIEW_AUTOMATIC || in_array($widget_vars['subtype_name'], $preview_panes)) {
+        _panopoly_magic_render_preview_pane($widget_vars, $vars['renderer']);
       }
       else {
 
         // If we can't preview then generate a preview link.
-        $preview = empty($query['preview_panes']) ? $plugin['subtype_name'] : $query['preview_panes'] . ',' . $plugin['subtype_name'];
+        $preview = empty($query['preview_panes']) ? $widget_vars['subtype_name'] : $query['preview_panes'] . ',' . $widget_vars['subtype_name'];
         $options = array(
           'query' => array('preview_panes' => $preview),
           'attributes' => array(
@@ -1592,7 +1684,7 @@ function panopoly_magic_preprocess_panels_add_content_modal(&$vars) {
             'title' => t('Preview @widget widget', array('@widget' => $key)),
           ),
         );
-        $plugin['preview'] = '<div class="modal-content-preview-button">' . l(t('Preview'), current_path(), $options) . '</div>';
+        $widget_vars['preview'] = '<div class="modal-content-preview-button">' . l(t('Preview'), current_path(), $options) . '</div>';
       }
     }
   }
diff --git a/profiles/wcm_base/modules/panopoly/panopoly_pages/CHANGELOG.txt b/profiles/wcm_base/modules/panopoly/panopoly_pages/CHANGELOG.txt
index cf90ae836b536edce2ab60d7ca0edbe4a54747f5..20b4b1d7871f1488cc64ae8ddab31185d69c6693 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.50, 2018-02-15
+-------------------
+- No changes since last release.
+
 7.x-1.49, 2017-12-13
 -------------------
 - 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 b711d85f94c47065c4a6d44cbc57b7a45fe24a3a..873e10d528c2e658dd06740ee633ad8b5acfc8ab 100644
--- a/profiles/wcm_base/modules/panopoly/panopoly_pages/panopoly_pages.info
+++ b/profiles/wcm_base/modules/panopoly/panopoly_pages/panopoly_pages.info
@@ -81,9 +81,9 @@ 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 2017-12-13
-version = "7.x-1.49"
+; Information added by Drupal.org packaging script on 2018-02-15
+version = "7.x-1.50"
 core = "7.x"
 project = "panopoly_pages"
-datestamp = "1513181985"
+datestamp = "1518716485"
 
diff --git a/profiles/wcm_base/modules/panopoly/panopoly_search/CHANGELOG.txt b/profiles/wcm_base/modules/panopoly/panopoly_search/CHANGELOG.txt
index a8fc2c1ea6af97a2474988adc486754384104bfc..7d87a36c9363fc236e2cb0407b0ec88dcc134c04 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.50, 2018-02-15
+-------------------
+- No changes since last release.
+
 7.x-1.49, 2017-12-13
 -------------------
 - 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 4b556d050306c52a220767f3b5ff42f92f4a5501..aaf770a80162af65c352eea6bf3f1b7bb44a94e5 100644
--- a/profiles/wcm_base/modules/panopoly/panopoly_search/panopoly_search.info
+++ b/profiles/wcm_base/modules/panopoly/panopoly_search/panopoly_search.info
@@ -54,9 +54,9 @@ features[variable][] = search_cron_limit
 features[views_view][] = panopoly_database_search
 features[views_view][] = panopoly_search
 
-; Information added by Drupal.org packaging script on 2017-12-13
-version = "7.x-1.49"
+; Information added by Drupal.org packaging script on 2018-02-15
+version = "7.x-1.50"
 core = "7.x"
 project = "panopoly_search"
-datestamp = "1513182007"
+datestamp = "1518716498"
 
diff --git a/profiles/wcm_base/modules/panopoly/panopoly_test/CHANGELOG.txt b/profiles/wcm_base/modules/panopoly/panopoly_test/CHANGELOG.txt
index eade7bea1583754758805975e5ccf77cab7d23d6..dfe79645499dc61a395df14cbbbcc3b5cc94078e 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.50, 2018-02-15
+-------------------
+- No changes since last release.
+
 7.x-1.49, 2017-12-13
 -------------------
 - 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 3688a718f31cac9eb5a0398b349cbe374acdfc0a..b7a318c856863cfdaa948ffd611547fbeb588a39 100644
--- a/profiles/wcm_base/modules/panopoly/panopoly_test/panopoly_test.info
+++ b/profiles/wcm_base/modules/panopoly/panopoly_test/panopoly_test.info
@@ -99,9 +99,9 @@ features_exclude[dependencies][panopoly_pages] = panopoly_pages
 features_exclude[dependencies][panelizer] = panelizer
 hidden = 1
 
-; Information added by Drupal.org packaging script on 2017-12-13
-version = "7.x-1.49"
+; Information added by Drupal.org packaging script on 2018-02-15
+version = "7.x-1.50"
 core = "7.x"
 project = "panopoly_test"
-datestamp = "1513182186"
+datestamp = "1518716516"
 
diff --git a/profiles/wcm_base/modules/panopoly/panopoly_theme/CHANGELOG.txt b/profiles/wcm_base/modules/panopoly/panopoly_theme/CHANGELOG.txt
index 0730d8c396bb7f143aff88a8171eb9ceb10346ac..816dd57ba5a96f68eaa7cad4619670857acf3db7 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.50, 2018-02-15
+-------------------
+- No changes since last release.
+
 7.x-1.49, 2017-12-13
 -------------------
 - 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 ac61b0950866d6f057e4b1106e59fd4bd658fd8e..2130f0182d74e271e610aae2c5eeb925d3daa410 100644
--- a/profiles/wcm_base/modules/panopoly/panopoly_theme/panopoly_theme.info
+++ b/profiles/wcm_base/modules/panopoly/panopoly_theme/panopoly_theme.info
@@ -11,9 +11,9 @@ 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 2017-12-13
-version = "7.x-1.49"
+; Information added by Drupal.org packaging script on 2018-02-15
+version = "7.x-1.50"
 core = "7.x"
 project = "panopoly_theme"
-datestamp = "1513182198"
+datestamp = "1518716534"
 
diff --git a/profiles/wcm_base/modules/panopoly/panopoly_widgets/CHANGELOG.txt b/profiles/wcm_base/modules/panopoly/panopoly_widgets/CHANGELOG.txt
index 96e68fd41617bc7647dbc21e5991bd41b89c7bfd..341b3dcd673948573336922e0fc6ea8ddc06a4cc 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.50, 2018-02-15
+-------------------
+- No changes since last release.
+
 7.x-1.49, 2017-12-13
 -------------------
 - 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 fab37d1e52f1be297540bf285658627e727cbd13..651e633c6567a2d0389b20da4f260f7f3db132c1 100644
--- a/profiles/wcm_base/modules/panopoly/panopoly_widgets/panopoly_widgets.info
+++ b/profiles/wcm_base/modules/panopoly/panopoly_widgets/panopoly_widgets.info
@@ -125,9 +125,9 @@ 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 2017-12-13
-version = "7.x-1.49"
+; Information added by Drupal.org packaging script on 2018-02-15
+version = "7.x-1.50"
 core = "7.x"
 project = "panopoly_widgets"
-datestamp = "1513182221"
+datestamp = "1518716566"
 
diff --git a/profiles/wcm_base/wcm_base.make b/profiles/wcm_base/wcm_base.make
index dce05a4ba546c1341aa2c5cc827efc296a198d99..3febeb5fb97312f5c331c3403a4393f039636ea0 100644
--- a/profiles/wcm_base/wcm_base.make
+++ b/profiles/wcm_base/wcm_base.make
@@ -462,31 +462,31 @@ libraries[ocio_modernizr][download][branch] = 7.x-1.x
 
 ; The Panopoly Foundation
 
-projects[panopoly_core][version] = 1.49
+projects[panopoly_core][version] = 1.50
 projects[panopoly_core][subdir] = panopoly
 
-projects[panopoly_theme][version] = 1.49
+projects[panopoly_theme][version] = 1.50
 projects[panopoly_theme][subdir] = panopoly
 
-projects[panopoly_magic][version] = 1.49
+projects[panopoly_magic][version] = 1.50
 projects[panopoly_magic][subdir] = panopoly
 
-projects[panopoly_widgets][version] = 1.49
+projects[panopoly_widgets][version] = 1.50
 projects[panopoly_widgets][subdir] = panopoly
 
-projects[panopoly_admin][version] = 1.49
+projects[panopoly_admin][version] = 1.50
 projects[panopoly_admin][subdir] = panopoly
 
 
 ; The Panopoly Toolset
 
-projects[panopoly_pages][version] = 1.49
+projects[panopoly_pages][version] = 1.50
 projects[panopoly_pages][subdir] = panopoly
 
-projects[panopoly_search][version] = 1.49
+projects[panopoly_search][version] = 1.50
 projects[panopoly_search][subdir] = panopoly
 
 ; For running the automated tests.
 
-projects[panopoly_test][version] = 1.49
+projects[panopoly_test][version] = 1.50
 projects[panopoly_test][subdir] = panopoly