diff --git a/core/misc/states.es6.js b/core/misc/states.es6.js
index 811a5112d1..184fa9b03e 100644
--- a/core/misc/states.es6.js
+++ b/core/misc/states.es6.js
@@ -159,6 +159,24 @@
       // The "reference" variable is a comparison function.
       return reference(value);
     },
+    Array(reference, value) {
+      // Make sure value is an array.
+      if (!Array.isArray(value)) {
+        return false;
+      }
+      // Convert all comparisons to strings for indexOf to work with integers
+      // comparing to strings.
+      reference = reference.map(String);
+      value = value.map(String);
+      // We iterate through each value provided in the reference. If all of them
+      // exist in value array, we return true. Otherwise return false.
+      for (let [key] of Object.entries(reference)) {
+        if (value.indexOf(reference[key]) === -1) {
+          return false;
+        }
+      }
+      return true;
+    },
     Number(reference, value) {
       // If "reference" is a number and "value" is a string, then cast
       // reference as a string before applying the strict comparison in
@@ -207,6 +225,10 @@
 
         // Make sure the event we just bound ourselves to is actually fired.
         new states.Trigger({ selector, state });
+
+        // Reevaluate conditions and trigger to be sure default value like
+        // null is handled.
+        this.reevaluate();
       });
     },
 
diff --git a/core/misc/states.js b/core/misc/states.js
index 7b451b07de..8968462e10 100644
--- a/core/misc/states.js
+++ b/core/misc/states.js
@@ -4,6 +4,7 @@
 * https://www.drupal.org/node/2815083
 * @preserve
 **/
+var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
 
 (function ($, Drupal) {
   var states = {
@@ -79,6 +80,56 @@
     Function: function Function(reference, value) {
       return reference(value);
     },
+    Array: function (_Array) {
+      function Array(_x, _x2) {
+        return _Array.apply(this, arguments);
+      }
+
+      Array.toString = function () {
+        return _Array.toString();
+      };
+
+      return Array;
+    }(function (reference, value) {
+      if (!Array.isArray(value)) {
+        return false;
+      }
+
+      reference = reference.map(String);
+      value = value.map(String);
+      var _iteratorNormalCompletion = true;
+      var _didIteratorError = false;
+      var _iteratorError = undefined;
+
+      try {
+        for (var _iterator = Object.entries(reference)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
+          var _ref = _step.value;
+
+          var _ref2 = _slicedToArray(_ref, 1);
+
+          var key = _ref2[0];
+
+          if (value.indexOf(reference[key]) === -1) {
+            return false;
+          }
+        }
+      } catch (err) {
+        _didIteratorError = true;
+        _iteratorError = err;
+      } finally {
+        try {
+          if (!_iteratorNormalCompletion && _iterator.return) {
+            _iterator.return();
+          }
+        } finally {
+          if (_didIteratorError) {
+            throw _iteratorError;
+          }
+        }
+      }
+
+      return true;
+    }),
     Number: function Number(reference, value) {
       return typeof value === 'string' ? _compare2(reference.toString(), value) : _compare2(reference, value);
     }
@@ -106,6 +157,8 @@
         });
 
         new states.Trigger({ selector: selector, state: state });
+
+        _this2.reevaluate();
       });
     },
     compare: function compare(reference, selector, state) {
