diff --git a/src/BlazyGrid.php b/src/BlazyGrid.php
index 3f6dc306fd75749c9cc7fcc0ee696650891a0ced..f95e417faafc6636219bf40cc0d4daf9d1b4c98c 100644
--- a/src/BlazyGrid.php
+++ b/src/BlazyGrid.php
@@ -28,37 +28,42 @@ class BlazyGrid {
     $contents = [];
     foreach ($items as $delta => $item) {
       $attributes = [];
-      $item_settings = $settings;
+      $sets = $settings;
 
       // Support non-Blazy which normally uses item_id.
       if (is_array($item)) {
-        $attributes    = $item['attributes'] ?? [];
-        $item_settings = $item['settings'] ?? $settings;
-        $item_settings = isset($item['#build'])
-          && isset($item['#build']['settings'])
-          ? $item['#build']['settings'] : $item_settings;
-
-        if (isset($item['#build']) && isset($item['#build']['settings'])) {
-          $item['#build']['settings'] += $settings;
+        $attributes = $item['#attributes'] ?? $item['attributes'] ?? [];
+        $sets1 = $item['settings'] ?? [];
+        $sets2 = $item['#build']['settings'] ?? [];
+        $sets = array_merge($sets1, $sets2);
+        $sets += $settings;
+
+        if (isset($item['#build']['settings'])) {
+          $item['#build']['settings'] += $sets;
           $item['#build']['settings']['delta'] = $delta;
         }
 
-        unset($item['settings'], $item['attributes'], $item['item']);
+        unset(
+          $item['#attributes'],
+          $item['attributes'],
+          $item['item'],
+          $item['settings']
+        );
       }
 
-      if (!empty($item_settings['grid_item_class'])) {
-        $attributes['class'][] = $item_settings['grid_item_class'];
+      if (!empty($sets['grid_item_class'])) {
+        $attributes['class'][] = $sets['grid_item_class'];
       }
 
       // Good for Bootstrap .well/ .card class, must cast or BS will reset.
-      $content_classes = empty($item_settings['grid_content_class'])
-        ? [] : (array) $item_settings['grid_content_class'];
+      $content_classes = empty($sets['grid_content_class'])
+        ? [] : (array) $sets['grid_content_class'];
 
       // Supports single formatter field or complex fields such as Views.
       // Views or entity_view may flattened $item into a string.
       $content = is_string($item) ? ['#markup' => $item] : ['content' => $item];
       $content = $is_grid ? Blazy::container($content, [
-        'class' => array_merge(['grid__content'], $content_classes)
+        'class' => array_merge(['grid__content'], $content_classes),
       ]) : $content;
       $classes = $attributes['class'] ?? [];
       $classes = array_merge([$class_item], $classes);
@@ -68,7 +73,9 @@ class BlazyGrid {
       ];
     }
 
-    $settings['count'] = empty($settings['count']) ? count($contents) : $settings['count'];
+    $settings['count'] = empty($settings['count'])
+      ? count($contents) : $settings['count'];
+
     $element = [
       '#theme'      => 'item_list',
       '#items'      => $contents,
diff --git a/src/Plugin/Filter/BlazyFilter.php b/src/Plugin/Filter/BlazyFilter.php
index d31c69a92d3da22a01fd07529fb6848bef22445a..daec2c1d6da51ac5578f7332c3fc29c3ab624c24 100644
--- a/src/Plugin/Filter/BlazyFilter.php
+++ b/src/Plugin/Filter/BlazyFilter.php
@@ -69,7 +69,7 @@ class BlazyFilter {
     $settings['plugin_id'] = 'blazy_filter';
     $settings['_grid'] = $settings['column'] || $settings['grid'];
     $settings['placeholder'] = $this->manager->config('placeholder');
-    $settings['use_data_uri'] = $filter->settings['media_switch'] ?? FALSE;
+    $settings['use_data_uri'] = $filter->settings['use_data_uri'] ?? FALSE;
 
     // At D7, BlazyFilter can only attach globally, prevents blocking.
     // Allows lightboxes to provide its own optionsets.
@@ -241,19 +241,20 @@ class BlazyFilter {
 
     // Checks if we have a valid file entity, not hard-coded image URL.
     if ($src = $node->getAttribute('src')) {
-      // Iframe with data: scheme is a serious kidding, strip it earlier.
-      $src = drupal_strip_dangerous_protocols($src);
-
       // If starts with 2 slashes, it is always external.
       if (strpos($src, '//') === 0) {
         // We need to query stored SRC, https is enforced.
         $src = 'https:' . $src;
       }
 
+      // Image SRC is sanitized downstream, not here.
       if ($node->tagName == 'img') {
         $settings['uri'] = $settings['image_url'] = $src;
       }
       elseif ($node->tagName == 'iframe') {
+        // Iframe with data: scheme is a serious kidding, strip it earlier.
+        $src = drupal_strip_dangerous_protocols($src);
+
         $settings['input_url'] = $src;
         $settings['uri'] = $settings['image_url'] = $this->getVideoThumbnail($src);
         $settings['scheme'] = $this->getHost($src);