return ret == -IPSET_ERR_EXIST && (flags & IPSET_FLAG_EXIST);
 }
 
+/* Match elements marked with nomatch */
+static inline bool
+ip_set_enomatch(int ret, u32 flags, enum ipset_adt adt)
+{
+       return adt == IPSET_TEST &&
+              ret == -ENOTEMPTY && ((flags >> 16) & IPSET_FLAG_NOMATCH);
+}
+
 /* Check the NLA_F_NET_BYTEORDER flag */
 static inline bool
 ip_set_attr_netorder(struct nlattr *tb[], int type)
 
                timeout = ip_set_timeout_uget(tb[IPSET_ATTR_TIMEOUT]);
        }
 
-       if (tb[IPSET_ATTR_CADT_FLAGS] && adt == IPSET_ADD) {
+       if (tb[IPSET_ATTR_CADT_FLAGS]) {
                u32 cadt_flags = ip_set_get_h32(tb[IPSET_ATTR_CADT_FLAGS]);
                if (cadt_flags & IPSET_FLAG_NOMATCH)
-                       flags |= (cadt_flags << 16);
+                       flags |= (IPSET_FLAG_NOMATCH << 16);
        }
 
        with_ports = with_ports && tb[IPSET_ATTR_PORT_TO];
                data.ip = htonl(ip);
                data.ip2 = htonl(ip2_from & ip_set_hostmask(data.cidr + 1));
                ret = adtfn(set, &data, timeout, flags);
-               return ip_set_eexist(ret, flags) ? 0 : ret;
+               return ip_set_enomatch(ret, flags, adt) ? 1 :
+                      ip_set_eexist(ret, flags) ? 0 : ret;
        }
 
        ip_to = ip;
                timeout = ip_set_timeout_uget(tb[IPSET_ATTR_TIMEOUT]);
        }
 
-       if (tb[IPSET_ATTR_CADT_FLAGS] && adt == IPSET_ADD) {
+       if (tb[IPSET_ATTR_CADT_FLAGS]) {
                u32 cadt_flags = ip_set_get_h32(tb[IPSET_ATTR_CADT_FLAGS]);
                if (cadt_flags & IPSET_FLAG_NOMATCH)
-                       flags |= (cadt_flags << 16);
+                       flags |= (IPSET_FLAG_NOMATCH << 16);
        }
 
        if (adt == IPSET_TEST || !with_ports || !tb[IPSET_ATTR_PORT_TO]) {
                ret = adtfn(set, &data, timeout, flags);
-               return ip_set_eexist(ret, flags) ? 0 : ret;
+               return ip_set_enomatch(ret, flags, adt) ? 1 :
+                      ip_set_eexist(ret, flags) ? 0 : ret;
        }
 
        port = ntohs(data.port);
 
                timeout = ip_set_timeout_uget(tb[IPSET_ATTR_TIMEOUT]);
        }
 
-       if (tb[IPSET_ATTR_CADT_FLAGS] && adt == IPSET_ADD) {
+       if (tb[IPSET_ATTR_CADT_FLAGS]) {
                u32 cadt_flags = ip_set_get_h32(tb[IPSET_ATTR_CADT_FLAGS]);
                if (cadt_flags & IPSET_FLAG_NOMATCH)
-                       flags |= (cadt_flags << 16);
+                       flags |= (IPSET_FLAG_NOMATCH << 16);
        }
 
        if (adt == IPSET_TEST || !tb[IPSET_ATTR_IP_TO]) {
                data.ip = htonl(ip & ip_set_hostmask(data.cidr));
                ret = adtfn(set, &data, timeout, flags);
-               return ip_set_eexist(ret, flags) ? 0 : ret;
+               return ip_set_enomatch(ret, flags, adt) ? 1 :
+                      ip_set_eexist(ret, flags) ? 0 : ret;
        }
 
        ip_to = ip;
                timeout = ip_set_timeout_uget(tb[IPSET_ATTR_TIMEOUT]);
        }
 
-       if (tb[IPSET_ATTR_CADT_FLAGS] && adt == IPSET_ADD) {
+       if (tb[IPSET_ATTR_CADT_FLAGS]) {
                u32 cadt_flags = ip_set_get_h32(tb[IPSET_ATTR_CADT_FLAGS]);
                if (cadt_flags & IPSET_FLAG_NOMATCH)
-                       flags |= (cadt_flags << 16);
+                       flags |= (IPSET_FLAG_NOMATCH << 16);
        }
 
        ret = adtfn(set, &data, timeout, flags);
 
-       return ip_set_eexist(ret, flags) ? 0 : ret;
+       return ip_set_enomatch(ret, flags, adt) ? 1 :
+              ip_set_eexist(ret, flags) ? 0 : ret;
 }
 
 /* Create hash:ip type of sets */
 
                u32 cadt_flags = ip_set_get_h32(tb[IPSET_ATTR_CADT_FLAGS]);
                if (cadt_flags & IPSET_FLAG_PHYSDEV)
                        data.physdev = 1;
-               if (adt == IPSET_ADD && (cadt_flags & IPSET_FLAG_NOMATCH))
-                       flags |= (cadt_flags << 16);
+               if (cadt_flags & IPSET_FLAG_NOMATCH)
+                       flags |= (IPSET_FLAG_NOMATCH << 16);
        }
        if (adt == IPSET_TEST || !tb[IPSET_ATTR_IP_TO]) {
                data.ip = htonl(ip & ip_set_hostmask(data.cidr));
                ret = adtfn(set, &data, timeout, flags);
-               return ip_set_eexist(ret, flags) ? 0 : ret;
+               return ip_set_enomatch(ret, flags, adt) ? 1 :
+                      ip_set_eexist(ret, flags) ? 0 : ret;
        }
 
        if (tb[IPSET_ATTR_IP_TO]) {
                u32 cadt_flags = ip_set_get_h32(tb[IPSET_ATTR_CADT_FLAGS]);
                if (cadt_flags & IPSET_FLAG_PHYSDEV)
                        data.physdev = 1;
-               if (adt == IPSET_ADD && (cadt_flags & IPSET_FLAG_NOMATCH))
-                       flags |= (cadt_flags << 16);
+               if (cadt_flags & IPSET_FLAG_NOMATCH)
+                       flags |= (IPSET_FLAG_NOMATCH << 16);
        }
 
        ret = adtfn(set, &data, timeout, flags);
 
-       return ip_set_eexist(ret, flags) ? 0 : ret;
+       return ip_set_enomatch(ret, flags, adt) ? 1 :
+              ip_set_eexist(ret, flags) ? 0 : ret;
 }
 
 /* Create hash:ip type of sets */
 
 
        with_ports = with_ports && tb[IPSET_ATTR_PORT_TO];
 
-       if (tb[IPSET_ATTR_CADT_FLAGS] && adt == IPSET_ADD) {
+       if (tb[IPSET_ATTR_CADT_FLAGS]) {
                u32 cadt_flags = ip_set_get_h32(tb[IPSET_ATTR_CADT_FLAGS]);
                if (cadt_flags & IPSET_FLAG_NOMATCH)
-                       flags |= (cadt_flags << 16);
+                       flags |= (IPSET_FLAG_NOMATCH << 16);
        }
 
        if (adt == IPSET_TEST || !(with_ports || tb[IPSET_ATTR_IP_TO])) {
                data.ip = htonl(ip & ip_set_hostmask(data.cidr + 1));
                ret = adtfn(set, &data, timeout, flags);
-               return ip_set_eexist(ret, flags) ? 0 : ret;
+               return ip_set_enomatch(ret, flags, adt) ? 1 :
+                      ip_set_eexist(ret, flags) ? 0 : ret;
        }
 
        port = port_to = ntohs(data.port);
                timeout = ip_set_timeout_uget(tb[IPSET_ATTR_TIMEOUT]);
        }
 
-       if (tb[IPSET_ATTR_CADT_FLAGS] && adt == IPSET_ADD) {
+       if (tb[IPSET_ATTR_CADT_FLAGS]) {
                u32 cadt_flags = ip_set_get_h32(tb[IPSET_ATTR_CADT_FLAGS]);
                if (cadt_flags & IPSET_FLAG_NOMATCH)
-                       flags |= (cadt_flags << 16);
+                       flags |= (IPSET_FLAG_NOMATCH << 16);
        }
 
        if (adt == IPSET_TEST || !with_ports || !tb[IPSET_ATTR_PORT_TO]) {
                ret = adtfn(set, &data, timeout, flags);
-               return ip_set_eexist(ret, flags) ? 0 : ret;
+               return ip_set_enomatch(ret, flags, adt) ? 1 :
+                      ip_set_eexist(ret, flags) ? 0 : ret;
        }
 
        port = ntohs(data.port);