diff --git a/src/newcrawler/identifiable_adapters.py b/src/newcrawler/identifiable_adapters.py
index 3251b585e4d37cd984ffa1e10ca7b184c50b0796..0a02b8d35eac6abe239446edb850d9d2e1f01c0c 100644
--- a/src/newcrawler/identifiable_adapters.py
+++ b/src/newcrawler/identifiable_adapters.py
@@ -25,6 +25,7 @@
 
 import caosdb as db
 from abc import abstractmethod
+from utils import get_value
 
 class IdentifiableAdapter(object):
     """
@@ -43,6 +44,40 @@ class IdentifiableAdapter(object):
       from the database.
     """
 
+    @staticmethod
+    def create_query_for_identifiable(ident: db.Record):
+        """
+        This function is taken from the old crawler:
+        caosdb-advanced-user-tools/src/caosadvancedtools/crawler.py
+        
+        uses the properties of ident to create a query that can determine
+        whether the required record already exists.
+        """
+        # TODO multiple parents are ignored! Sufficient?
+        if len(ident.get_parents()) == 0:
+            raise ValueError("The identifiable must have at least one parent.")
+        query_string = "FIND Record " + ident.get_parents()[0].name
+        query_string += " WITH "
+        if ident.name is None and len(ident.get_properties()) == 0:
+            raise ValueError(
+                "The identifiable must have features to identify it.")
+
+        if ident.name is not None:
+            query_string += "name='{}' AND".format(ident.name)
+
+        for p in ident.get_properties():
+            if p.datatype is not None and p.datatype.startswith("LIST<"):
+                for v in p.value:
+                    query_string += ("references "
+                                     + str(v.id if isinstance(v, db.Entity)
+                                           else v)
+                                     + " AND ")
+            else:
+                query_string += ("'" + p.name + "'='" + str(get_value(p))
+                                 + "' AND ")
+        # remove the last AND
+        return query_string[:-4]
+
     @abstractmethod
     def get_registered_identifiable(self, record: db.Record):
         """
diff --git a/src/newcrawler/utils.py b/src/newcrawler/utils.py
index a04e896e85e749ba616c30cc450f15bb561dd6df..e0a44be3c3859823ba6cbd63e4cd694c2974cca0 100644
--- a/src/newcrawler/utils.py
+++ b/src/newcrawler/utils.py
@@ -24,6 +24,7 @@
 #
 
 import caosdb as db
+from datetime import datetime
 
 # Some utility functions, e.g. for extending pylib.
 
@@ -38,3 +39,26 @@ def has_parent(entity: db.Entity, name: str):
         if parent.name == name:
             return True
     return False
+
+def get_value(prop):
+    """ Returns the value of a Property
+
+    This function is taken from the old crawler:
+    caosdb-advanced-user-tools/src/caosadvancedtools/crawler.py
+    
+    Parameters
+    ----------
+    prop : The property of which the value shall be returned.
+
+    Returns
+    -------
+    out : The value of the property; if the value is an entity, its ID.
+
+    """
+
+    if isinstance(prop.value, db.Entity):
+        return prop.value.id
+    elif isinstance(prop.value, datetime):
+        return prop.value.isoformat()
+    else:
+        return prop.value