diff --git a/osm_common/dbmemory.py b/osm_common/dbmemory.py
index d12d03d..1b6d7ac 100644
--- a/osm_common/dbmemory.py
+++ b/osm_common/dbmemory.py
@@ -62,72 +62,76 @@
 
     def _find(self, table, q_filter):
 
-        def recursive_find(key_list, key_next_index, content, operator, target):
+        def recursive_find(key_list, key_next_index, content, oper, target):
             if key_next_index == len(key_list) or content is None:
                 try:
-                    if operator == "eq":
-                        if isinstance(target, list) and not isinstance(content, list):
-                            return True if content in target else False
-                        return True if content == target else False
-                    elif operator in ("neq", "ne"):
-                        if isinstance(target, list) and not isinstance(content, list):
-                            return True if content not in target else False
-                        return True if content != target else False
-                    if operator == "gt":
+                    if oper in ("eq", "cont"):
+                        if isinstance(target, list):
+                            if isinstance(content, list):
+                                return any(content_item in target for content_item in content)
+                            return content in target
+                        elif isinstance(content, list):
+                            return target in content
+                        else:
+                            return content == target
+                    elif oper in ("neq", "ne", "ncont"):
+                        if isinstance(target, list):
+                            if isinstance(content, list):
+                                return all(content_item not in target for content_item in content)
+                            return content not in target
+                        elif isinstance(content, list):
+                            return target not in content
+                        else:
+                            return content != target
+                    if oper == "gt":
                         return content > target
-                    elif operator == "gte":
+                    elif oper == "gte":
                         return content >= target
-                    elif operator == "lt":
+                    elif oper == "lt":
                         return content < target
-                    elif operator == "lte":
+                    elif oper == "lte":
                         return content <= target
-                    elif operator == "cont":
-                        return content in target
-                    elif operator == "ncont":
-                        return content not in target
                     else:
                         raise DbException("Unknown filter operator '{}' in key '{}'".
-                                          format(operator, ".".join(key_list)), http_code=HTTPStatus.BAD_REQUEST)
+                                          format(oper, ".".join(key_list)), http_code=HTTPStatus.BAD_REQUEST)
                 except TypeError:
                     return False
 
             elif isinstance(content, dict):
-                return recursive_find(key_list, key_next_index+1, content.get(key_list[key_next_index]), operator,
+                return recursive_find(key_list, key_next_index + 1, content.get(key_list[key_next_index]), oper,
                                       target)
             elif isinstance(content, list):
                 look_for_match = True  # when there is a match return immediately
-                if (target is None and operator not in ("neq", "ne")) or \
-                        (target is not None and operator in ("neq", "ne")):
-                    look_for_match = False  # when there is a match return immediately
+                if (target is None) != (oper in ("neq", "ne", "ncont")):  # one True and other False (Xor)
+                    look_for_match = False  # when there is not a match return immediately
 
                 for content_item in content:
                     if key_list[key_next_index] == "ANYINDEX" and isinstance(v, dict):
+                        matches = True
                         for k2, v2 in target.items():
                             k_new_list = k2.split(".")
                             new_operator = "eq"
                             if k_new_list[-1] in ("eq", "ne", "gt", "gte", "lt", "lte", "cont", "ncont", "neq"):
                                 new_operator = k_new_list.pop()
                             if not recursive_find(k_new_list, 0, content_item, new_operator, v2):
-                                match = False
+                                matches = False
                                 break
-                        else:
-                            match = True
 
                     else:
-                        match = recursive_find(key_list, key_next_index, content_item, operator, target)
-                    if match == look_for_match:
-                        return match
+                        matches = recursive_find(key_list, key_next_index, content_item, oper, target)
+                    if matches == look_for_match:
+                        return matches
                 if key_list[key_next_index].isdecimal() and int(key_list[key_next_index]) < len(content):
-                    match = recursive_find(key_list, key_next_index+1, content[int(key_list[key_next_index])],
-                                           operator, target)
-                    if match == look_for_match:
-                        return match
+                    matches = recursive_find(key_list, key_next_index + 1, content[int(key_list[key_next_index])],
+                                             oper, target)
+                    if matches == look_for_match:
+                        return matches
                 return not look_for_match
             else:  # content is not dict, nor list neither None, so not found
-                if operator in ("neq", "ne"):
-                    return True if target is None else False
+                if oper in ("neq", "ne", "ncont"):
+                    return target is not None
                 else:
-                    return True if target is None else False
+                    return target is None
 
         for i, row in enumerate(self.db.get(table, ())):
             q_filter = q_filter or {}
@@ -136,8 +140,8 @@
                 operator = "eq"
                 if k_list[-1] in ("eq", "ne", "gt", "gte", "lt", "lte", "cont", "ncont", "neq"):
                     operator = k_list.pop()
-                match = recursive_find(k_list, 0, row, operator, v)
-                if not match:
+                matches = recursive_find(k_list, 0, row, operator, v)
+                if not matches:
                     break
             else:
                 # match
@@ -274,26 +278,26 @@
                 for k, v in update_dict.items():
                     db_nested = db_item
                     k_list = k.split(".")
-                    k_nested_prev = k_list[0]
-                    for k_nested in k_list[1:]:
-                        if isinstance(db_nested[k_nested_prev], dict):
-                            if k_nested not in db_nested[k_nested_prev]:
-                                db_nested[k_nested_prev][k_nested] = None
-                        elif isinstance(db_nested[k_nested_prev], list) and k_nested.isdigit():
+                    k_item_prev = k_list[0]
+                    for k_item in k_list[1:]:
+                        if isinstance(db_nested[k_item_prev], dict):
+                            if k_item not in db_nested[k_item_prev]:
+                                db_nested[k_item_prev][k_item] = None
+                        elif isinstance(db_nested[k_item_prev], list) and k_item.isdigit():
                             # extend list with Nones if index greater than list
-                            k_nested = int(k_nested)
-                            if k_nested >= len(db_nested[k_nested_prev]):
-                                db_nested[k_nested_prev] += [None] * (k_nested - len(db_nested[k_nested_prev]) + 1)
-                        elif db_nested[k_nested_prev] is None:
-                            db_nested[k_nested_prev] = {k_nested: None}
+                            k_item = int(k_item)
+                            if k_item >= len(db_nested[k_item_prev]):
+                                db_nested[k_item_prev] += [None] * (k_item - len(db_nested[k_item_prev]) + 1)
+                        elif db_nested[k_item_prev] is None:
+                            db_nested[k_item_prev] = {k_item: None}
                         else:  # number, string, boolean, ... or list but with not integer key
-                            raise DbException("Cannot set '{}' on existing '{}={}'".format(k, k_nested_prev,
-                                                                                           db_nested[k_nested_prev]))
+                            raise DbException("Cannot set '{}' on existing '{}={}'".format(k, k_item_prev,
+                                                                                           db_nested[k_item_prev]))
 
-                        db_nested = db_nested[k_nested_prev]
-                        k_nested_prev = k_nested
+                        db_nested = db_nested[k_item_prev]
+                        k_item_prev = k_item
 
-                    db_nested[k_nested_prev] = v
+                    db_nested[k_item_prev] = v
                 return {"updated": 1}
         except DbException:
             raise
@@ -354,16 +358,17 @@
         """
         try:
             _ids = []
-            for indata in indata_list:
-                _id = indata.get("_id")
-                if not _id:
-                    _id = str(uuid4())
-                    indata["_id"] = _id
-                with self.lock:
-                    if table not in self.db:
-                        self.db[table] = []
-                    self.db[table].append(deepcopy(indata))
-                _ids.append(_id)
+            with self.lock:
+                for indata in indata_list:
+                    _id = indata.get("_id")
+                    if not _id:
+                        _id = str(uuid4())
+                        indata["_id"] = _id
+                    with self.lock:
+                        if table not in self.db:
+                            self.db[table] = []
+                        self.db[table].append(deepcopy(indata))
+                    _ids.append(_id)
             return _ids
         except Exception as e:  # TODO refine
             raise DbException(str(e))
