diff --git a/modules/product/src/Plugin/Field/FieldWidget/ProductVariationAttributesWidget.php b/modules/product/src/Plugin/Field/FieldWidget/ProductVariationAttributesWidget.php
index b9974942..6ffea4fd 100644
--- a/modules/product/src/Plugin/Field/FieldWidget/ProductVariationAttributesWidget.php
+++ b/modules/product/src/Plugin/Field/FieldWidget/ProductVariationAttributesWidget.php
@@ -223,22 +223,31 @@ class ProductVariationAttributesWidget extends ProductVariationWidgetBase implem
    */
   protected function selectVariationFromUserInput(array $variations, array $user_input) {
     $current_variation = reset($variations);
+    $candidate_variation = $variations;
     if (!empty($user_input['attributes'])) {
-      $attributes = $user_input['attributes'];
-      foreach ($variations as $variation) {
-        $match = TRUE;
-        foreach ($attributes as $field_name => $value) {
-          if ($variation->getAttributeValueId($field_name) != $value) {
-            $match = FALSE;
-          }
-        }
-        if ($match) {
-          $current_variation = $variation;
-          break;
-        }
+        $attributes = $user_input['attributes'];
+        foreach ($attributes as $field_name => $value){
+            $discarded_variation_ids = [];
+            foreach ($candidate_variation as $variation){
+                if ($variation->getAttributeValueId($field_name) != $value) {
+                    $discarded_variation_ids[$variation->id()] = $variation->id();
+                }
+            }
+            $discarded_variation = NULL;
+            foreach ($discarded_variation_ids as $discarded_variation_id){
+                if ($discarded_variation == NULL){
+                    $discarded_variation = $candidate_variation[$discarded_variation_id];
+                }
+                unset($candidate_variation[$discarded_variation_id]);
+            }
+            if (empty($candidate_variation)){
+                return $discarded_variation;
+            }
+            if (sizeof($candidate_variation) ==  1){
+                return reset($candidate_variation);
+            }
       }
     }
-
     return $current_variation;
   }
 
@@ -277,11 +286,25 @@ class ProductVariationAttributesWidget extends ProductVariationWidgetBase implem
       // variations, but only the sizes of variations with the selected color.
       $callback = NULL;
       if ($index > 0) {
-        $previous_field_name = $field_names[$index - 1];
-        $previous_field_value = $selected_variation->getAttributeValueId($previous_field_name);
-        $callback = function ($variation) use ($previous_field_name, $previous_field_value) {
-          /** @var \Drupal\commerce_product\Entity\ProductVariationInterface $variation */
-          return $variation->getAttributeValueId($previous_field_name) == $previous_field_value;
+        $previous_field_names = $previous_field_values = [];
+        while ($index) {
+          $previous_field_names[] = $field_names[$index - 1];
+          $previous_field_values[] = $selected_variation->getAttributeValueId($field_names[$index - 1]);
+          $index--;
+        }
+        $callback = function ($variation) use ($previous_field_names, $previous_field_values) {
+          $results = [];
+          foreach ($previous_field_names as $index => $previous_field_name) {
+            /** @var \Drupal\commerce_product\Entity\ProductVariationInterface $variation */
+            if ($variation->getAttributeValueId($previous_field_name) == $previous_field_values[$index]) {
+              $results[] = TRUE;
+            }
+            else {
+              $results[] = FALSE;
+            }
+          }
+
+          return !in_array(FALSE, $results, TRUE);
         };
       }
 
