diff --git a/src/caosdb/common/models.py b/src/caosdb/common/models.py
index f67cbcc5ce2ba17b2d0877208e60ed241a448653..6624ed765906ce6f47d36975af93e069efa9550e 100644
--- a/src/caosdb/common/models.py
+++ b/src/caosdb/common/models.py
@@ -1506,20 +1506,33 @@ class Property(Entity):
 
         return super(Property, self).to_xml(xml, add_properties)
 
-    def is_reference(self):
-        """ returns whether this Property is a reference
+    def is_reference(self, server_retrieval = False):
+        """Returns whether this Property is a reference
 
-        If the datatype is not set, the Property is retrieved from the server.
-        """
+        Parameters
+        ----------
+        server_retrieval : bool, optional
+            If True and the datatype is not set, the Property is retrieved from the server, by default False
 
+        Returns
+        -------
+        bool, NoneType
+            Returns whether this Property is a reference or None if a server call is needed to 
+            check correctly, but server_retrieval is set to False. 
+            
+        """
         if self.datatype is None:
             if not self.is_valid():
                 # this is a workaround to prevent side effects
                 # since retrieve currently changes the object
-                tmp_prop = deepcopy(self)
-                tmp_prop.retrieve()
+                
+                if server_retrieval:
+                    tmp_prop = deepcopy(self)
+                    tmp_prop.retrieve()
 
-                return tmp_prop.is_reference()
+                    return tmp_prop.is_reference()
+                else:
+                    return None 
             else:
                 # a valid property withoud datatype has to be an RT
 
diff --git a/unittests/test_property.py b/unittests/test_property.py
index 752ee01f0eafef14dbffd1e62c99d1c816c45d05..6fee32cd2304c2889e3f75992408f54139869958 100644
--- a/unittests/test_property.py
+++ b/unittests/test_property.py
@@ -27,6 +27,7 @@
 # pylint: disable=missing-docstring
 from lxml import etree
 from caosdb import Entity, Property, Record
+import caosdb as db
 
 parser = etree.XMLParser(remove_comments=True)
 testrecord = Record._from_xml(Record(),
@@ -89,3 +90,38 @@ def test_get_property_with_entity():
 def test_selected_reference_list():
     assert len(testrecord.get_property("Conductor").value) == 1
     assert isinstance(testrecord.get_property("Conductor").value[0], Entity)
+
+
+PROPS = {
+    10:  db.Property(id=10, datatype=db.INTEGER),
+    20:  db.Property(id=20, datatype=db.REFERENCE)
+}
+def dummy_property(self):
+    return PROPS[self.id]
+Entity.retrieve = dummy_property
+
+def test_is_reference():
+    p1 = Property(id=1, datatype=db.INTEGER)
+    p2 = Property(id=2, datatype=db.DOUBLE)
+    p3 = Property(id=3, datatype=db.TEXT)
+    p4 = Property(id=4, datatype=db.DATETIME)
+    p5 = Property(id=5, datatype=db.BOOLEAN)
+    p6 = Property(id=6, datatype=db.REFERENCE)
+    assert p1.is_reference() == False
+    assert p2.is_reference() == False
+    assert p3.is_reference() == False
+    assert p4.is_reference() == False
+    assert p5.is_reference() == False
+    assert p6.is_reference() == True
+
+    p7 = Property(id=7)
+    p8 = Property(id=8, value=db.RecordType(id=1000))
+    p8.is_valid = lambda: True
+    assert p7.is_reference() == None #cannot be resolved without calling a server
+    assert p8.is_reference() == True
+
+    p10 = Property(id=10)
+    p20 = Property(id=20)
+    assert p10.is_reference(server_retrieval=True) == False
+    assert p20.is_reference(server_retrieval=True) == True
+