diff --git a/web/core/misc/states.es6.js b/web/core/misc/states.es6.js
index dd2c31553..d8821443c 100644
--- a/web/core/misc/states.es6.js
+++ b/web/core/misc/states.es6.js
@@ -135,6 +135,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 (var [key, referenceValue] 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
@@ -183,6 +201,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/web/core/misc/states.js b/web/core/misc/states.js
index fcdc37acc..702848dc7 100644
--- a/web/core/misc/states.js
+++ b/web/core/misc/states.js
@@ -68,6 +68,57 @@
     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, 2);
+
+          var key = _ref2[0];
+          var referenceValue = _ref2[1];
+
+          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);
     }
@@ -95,6 +146,8 @@
         });
 
         new states.Trigger({ selector: selector, state: state });
+
+        _this2.reevaluate();
       });
     },
     compare: function compare(reference, selector, state) {
